From 129de2d948d25899af61d2e6a32914f3ca3be527 Mon Sep 17 00:00:00 2001 From: Anit Nilay Date: Sun, 13 Jun 2021 14:17:22 +0530 Subject: [PATCH] Recreate tooltip component and remove rc-tooltip (#97) * Update package.json Add react-popper. Update jest and testing-library. * Update button to a forwarding ref component. * Make Input full width * Update Text Props to inherit HtmlLabel Prop * Recreate Tooltip component * Remove dependency on rc-tooltip. * Update yarn.lock * Update Calendar to use Updated Tooltip Component * Tests for tooltip. * Fix failing tests. * Fix all failing tests. * Changes related to failing tests * Fix failing tests. * Tests for popover and portal * Move Portal to a seperate directory. * Increase Button test cases. * Fix tests for pagination. * Add tooltip animation. --- .../AutoComplete/AutoComplete.spec.tsx | 100 +- __tests__/components/Button/Button.spec.tsx | 36 + .../components/Calendar/Calendar.spec.tsx | 181 +-- .../components/DatePicker/DatePicker.spec.tsx | 112 +- .../components/DatePicker/TimePicker.spec.tsx | 200 ++-- __tests__/components/Layout/Layout.spec.tsx | 101 +- .../components/Pagination/Pagination.spec.tsx | 48 +- __tests__/components/Popover/Popover.spec.tsx | 43 + __tests__/components/Portal/Portal.spec.tsx | 43 + __tests__/components/Tooltip/Tooltip.spec.tsx | 422 +++++++ package.json | 12 +- .../AutoComplete/AutoComplete.stories.tsx | 5 +- src/components/AutoComplete/AutoComplete.tsx | 7 +- src/components/Button/Button.tsx | 84 +- src/components/Calendar/Calendar.tsx | 10 +- .../DatePicker/DatePicker.stories.tsx | 7 +- src/components/DatePicker/DatePicker.tsx | 26 +- .../DatePicker/TimePicker.stories.tsx | 5 + src/components/DatePicker/TimePicker.tsx | 78 +- src/components/DatePicker/style.ts | 2 +- src/components/Drawer/Drawer.tsx | 2 +- src/components/Input/style.ts | 1 + src/components/Menu/Menu.tsx | 10 +- src/components/Modal/Modal.tsx | 2 +- src/components/Notification/Notification.tsx | 2 +- src/components/Pagination/Pagination.tsx | 2 +- src/components/Popover/Popover.stories.tsx | 66 +- src/components/Popover/Popover.tsx | 120 +- src/components/Popover/Portal.tsx | 37 - src/components/Popover/style.ts | 7 +- src/components/Portal/Portal.tsx | 54 + src/components/Portal/index.ts | 1 + src/components/Text/Text.tsx | 32 +- src/components/Tooltip/Tooltip.stories.tsx | 35 +- src/components/Tooltip/Tooltip.tsx | 257 ++++- src/components/Tooltip/style.ts | 60 +- src/helpers/index.ts | 8 +- src/helpers/popover.css.ts | 205 ---- src/helpers/zIndex.ts | 2 + src/index.ts | 1 + yarn.lock | 1025 ++++++++++------- 41 files changed, 2225 insertions(+), 1226 deletions(-) create mode 100644 __tests__/components/Popover/Popover.spec.tsx create mode 100644 __tests__/components/Portal/Portal.spec.tsx create mode 100644 __tests__/components/Tooltip/Tooltip.spec.tsx delete mode 100644 src/components/Popover/Portal.tsx create mode 100644 src/components/Portal/Portal.tsx create mode 100644 src/components/Portal/index.ts delete mode 100644 src/helpers/popover.css.ts diff --git a/__tests__/components/AutoComplete/AutoComplete.spec.tsx b/__tests__/components/AutoComplete/AutoComplete.spec.tsx index 06c3816..624615b 100644 --- a/__tests__/components/AutoComplete/AutoComplete.spec.tsx +++ b/__tests__/components/AutoComplete/AutoComplete.spec.tsx @@ -46,8 +46,10 @@ function MultipleAutoComplete({ value, onChange }: { value: string[]; onChange: } describe('Single AutoComplete', () => { - it('should render a simple AutoComplete with selected value', () => { - autoComplete('diana', () => ({})); + it('should render a simple AutoComplete with selected value', async () => { + await act(async () => { + autoComplete('diana', () => ({})); + }); const input = document.querySelector('input'); expect(input.value).toBe('diana'); @@ -62,9 +64,11 @@ describe('Single AutoComplete', () => { expect(document.querySelector('input').value).toBe(''); }); - it('should render a clear button if value is selected', () => { + it('should render a clear button if value is selected', async () => { let value = 'diana'; - autoComplete('diana', (e) => (value = e)); + await act(async () => { + autoComplete('diana', (e) => (value = e)); + }); expect(document.querySelector('.seudo').innerHTML).toContain( // Path for cross svg. 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z', @@ -77,8 +81,10 @@ describe('Single AutoComplete', () => { expect(value).toBeNull(); }); - it('should not open popup if disabled', () => { - autoComplete('diana', jest.fn, jest.fn, true); + it('should not open popup if disabled', async () => { + await act(async () => { + autoComplete('diana', jest.fn, jest.fn, true); + }); act(() => { fireEvent.click(document.querySelector('input')); @@ -87,18 +93,20 @@ describe('Single AutoComplete', () => { expect(document.querySelector('.list-item')).toBeNull(); }); - it('should fetch data from a promise', () => { - render( - - data={() => new Promise((resolve) => resolve(['bruce', 'diana', 'clark']))} - listDisplayProp={(e) => String(e)} - uniqueIdentifier={(e) => String(e)} - displayValue={(e) => String(e)} - value="diana" - onChange={jest.fn} - searchValue={(e) => e} - />, - ); + it('should fetch data from a promise', async () => { + await act(async () => { + render( + + data={() => new Promise((resolve) => resolve(['bruce', 'diana', 'clark']))} + listDisplayProp={(e) => String(e)} + uniqueIdentifier={(e) => String(e)} + displayValue={(e) => String(e)} + value="diana" + onChange={jest.fn} + searchValue={(e) => e} + />, + ); + }); act(() => { fireEvent.click(document.querySelector('input')); @@ -110,9 +118,11 @@ describe('Single AutoComplete', () => { .forEach((element, index) => expect(element.innerHTML).toContain(data[index])); }); - it('should update value on select', () => { + it('should update value on select', async () => { let value = 'diana'; - autoComplete(value, (e) => (value = e)); + await act(async () => { + autoComplete(value, (e) => (value = e)); + }); const input = document.querySelector('input'); act(() => { @@ -124,13 +134,15 @@ describe('Single AutoComplete', () => { expect(value).toBe('bruce'); }); - it('should update list on search', () => { + it('should update list on search', async () => { let search = ''; - autoComplete( - 'diana', - () => ({}), - (e) => (search = e), - ); + await act(async () => { + autoComplete( + 'diana', + () => ({}), + (e) => (search = e), + ); + }); act(() => { fireEvent.click(document.querySelector('input')); @@ -146,9 +158,11 @@ describe('Single AutoComplete', () => { expect(document.querySelector('.list-item:nth-child(2)').innerHTML).toContain('clark'); }); - it('should navigate list with arrow keys and close popup with escape', () => { + it('should navigate list with arrow keys and close popup with escape', async () => { let value = 'diana'; - autoComplete(value, (e) => (value = e)); + await act(async () => { + autoComplete(value, (e) => (value = e)); + }); const input = document.querySelector('input'); act(() => { @@ -168,12 +182,12 @@ describe('Single AutoComplete', () => { fireEvent.keyDown(input, { key: 'Enter' }); }); expect(value).toBe('bruce'); - expect(document.querySelector('.list-item')).toBeNull(); + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(`opacity: 0;`); act(() => { fireEvent.keyDown(input, { key: 'ArrowDown' }); }); - expect(document.querySelector('.list-item')).not.toBeNull(); + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(`opacity: 1;`); act(() => { fireEvent.keyDown(document.querySelector('input'), { key: 'Enter' }); @@ -200,15 +214,17 @@ describe('Single AutoComplete', () => { act(() => { fireEvent.keyDown(document.querySelector('input'), { key: 'Escape' }); }); - expect(document.querySelector('.list-item')).toBeNull(); + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(`opacity: 0;`); act(() => { fireEvent.keyDown(document.querySelector('input'), { key: 'ArrowUp' }); }); expect(document.querySelector('.list-item')).not.toBeNull(); }); - it('should not have any selected items on list if value is null', () => { - autoComplete(null, () => ({})); + it('should not have any selected items on list if value is null', async () => { + await act(async () => { + autoComplete(null, () => ({})); + }); act(() => { fireEvent.click(document.querySelector('input')); @@ -228,8 +244,10 @@ describe('Single AutoComplete', () => { `); }); - it('should clear input on search', () => { - autoComplete(null, (e) => expect(e).toBe('bruce')); + it('should clear input on search', async () => { + await act(async () => { + autoComplete(null, (e) => expect(e).toBe('bruce')); + }); act(() => { fireEvent.click(document.querySelector('input')); }); @@ -248,8 +266,10 @@ describe('Single AutoComplete', () => { }); describe('Multiple AutoComplete', () => { - it('should render autocomplete with multiple values', () => { - render( ({})} />); + it('should render autocomplete with multiple values', async () => { + await act(async () => { + render( ({})} />); + }); expect(document.querySelector('.seudo').innerHTML).toContain('clark'); expect(document.querySelector('.seudo').innerHTML).toContain('diana'); @@ -266,9 +286,11 @@ describe('Multiple AutoComplete', () => { `); }); - it('should update value on select', () => { + it('should update value on select', async () => { let value = []; - render( (value = e)} />); + await act(async () => { + render( (value = e)} />); + }); act(() => { fireEvent.click(document.querySelector('input')); diff --git a/__tests__/components/Button/Button.spec.tsx b/__tests__/components/Button/Button.spec.tsx index 64409ce..222d659 100644 --- a/__tests__/components/Button/Button.spec.tsx +++ b/__tests__/components/Button/Button.spec.tsx @@ -271,4 +271,40 @@ describe('Button', () => { background: rgba(0, 0, 0, 0.2); `); }); + + it('should render a custom anchor component', () => { + const fn = jest.fn(); + + act(() => { + ReactDOM.render(} + + ); +} + +describe('Popover', () => { + it('Should take width of child if expand = true', async () => { + jest.useFakeTimers(); + + await act(async () => { + render(popover({ expand: true })); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + await act(async () => { + fireEvent.mouseOver(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 1; + `); + + // Jest doesn't render elements so boundingClientRect will have all values = 0 + expect(document.querySelector('.sha-el-tooltip-inner')).toHaveStyle(`width: 0px`); + }); +}); diff --git a/__tests__/components/Portal/Portal.spec.tsx b/__tests__/components/Portal/Portal.spec.tsx new file mode 100644 index 0000000..eb9a7a2 --- /dev/null +++ b/__tests__/components/Portal/Portal.spec.tsx @@ -0,0 +1,43 @@ +import { render } from '@testing-library/react'; +import '@testing-library/jest-dom'; + +import React from 'react'; +import { Portal } from '../../../src'; +import { PortalProps } from '../../../src/components/Portal/Portal'; + +function portal(args: Partial) { + return ; +} + +describe('Portal', () => { + it('should create a div', () => { + render(portal({})); + + expect(document.querySelector('sha-el-portal')).toBeDefined(); + }); + + it('should create the div on passed dom element', () => { + const dom = document.createElement('div'); + dom.id = 'testing'; + document.body.appendChild(dom); + + render(portal({ dom, children:

hello

})); + + expect(dom.querySelector('h1')).toBeDefined(); + }); + + it('should not render if document in not defined', () => { + jest.useFakeTimers(); + + const document = global.document; + global.document = undefined; + render(portal({})); + + jest.runAllTimers(); + + global.document = document; + jest.runAllTimers(); + + expect(document.querySelector('sha-el-portal')).toBeDefined(); + }); +}); diff --git a/__tests__/components/Tooltip/Tooltip.spec.tsx b/__tests__/components/Tooltip/Tooltip.spec.tsx new file mode 100644 index 0000000..bfe2c82 --- /dev/null +++ b/__tests__/components/Tooltip/Tooltip.spec.tsx @@ -0,0 +1,422 @@ +import { act, fireEvent, render } from '@testing-library/react'; +import '@testing-library/jest-dom'; + +import React, { useState } from 'react'; +import { Button, Tooltip, Text } from '../../../src'; +import { TooltipProps } from '../../../src/components/Tooltip/Tooltip'; + +function toolTip(args: Partial) { + return ( + Hello World}> + {args.children || } + + ); +} + +function ControlledToolTip(args: Partial) { + const [state, updateState] = useState(args.visible); + + return ( + <> + { + updateState(v); + args.onVisibleChange(v); + }} + overlay={Hello World} + > + + + + + ); +} + +describe('Tooltip', () => { + it('Should open tooltip on mouseover', async () => { + jest.useFakeTimers(); + + await act(async () => { + render(toolTip({})); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + await act(async () => { + fireEvent.mouseOver(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 1; + `); + + await act(async () => { + fireEvent.mouseOver(document.querySelector('body')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + expect(document.querySelector('.arrow')).not.toBeNull(); + }); + + it('Wont show up for triggers other than mentioned', async () => { + jest.useFakeTimers(); + + await act(async () => { + render(toolTip({ trigger: 'onMouseOver' })); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + await act(async () => { + fireEvent.click(document.getElementById('button')); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + }); + + it('Should open on click and close on click outside of reference element and tooltip', async () => { + jest.useFakeTimers(); + + await act(async () => { + render(toolTip({ trigger: 'onClick' })); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + await act(async () => { + fireEvent.click(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(`opacity: 1;`); + + await act(async () => { + fireEvent.click(document.querySelector('body')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + }); + + it('Should open on focus and close on blur', async () => { + jest.useFakeTimers(); + + await act(async () => { + render(toolTip({ trigger: 'onFocus' })); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + await act(async () => { + fireEvent.focus(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(`opacity: 1;`); + + await act(async () => { + fireEvent.blur(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + }); + + it('Should open on mouseover and close on click', async () => { + jest.useFakeTimers(); + + await act(async () => { + render(toolTip({ trigger: 'onMouseOver', closeTrigger: 'onClick' })); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + await act(async () => { + fireEvent.mouseOver(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(`opacity: 1;`); + + await act(async () => { + fireEvent.click(document.querySelector('body')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + }); + + it('Should open on click or mouseover and close on blur or click', async () => { + jest.useFakeTimers(); + + await act(async () => { + render(toolTip({ trigger: ['onClick', 'onMouseOver'], closeTrigger: ['onBlur', 'onClick'] })); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + await act(async () => { + fireEvent.click(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(`opacity: 1;`); + + await act(async () => { + fireEvent.blur(document.querySelector('#button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + /** + * Mouse over trigger + */ + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + await act(async () => { + fireEvent.mouseOver(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(`opacity: 1;`); + + await act(async () => { + fireEvent.click(document.querySelector('body')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + }); + + it('should hide arrow', async () => { + jest.useFakeTimers(); + + await act(async () => { + render(toolTip({ hideArrow: true })); + }); + + await act(async () => { + fireEvent.mouseOver(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.arrow')).toBeNull(); + }); + + it('should close on click on achor', async () => { + jest.useFakeTimers(); + + await act(async () => { + render(toolTip({ trigger: 'onClick' })); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + await act(async () => { + fireEvent.click(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 1; + `); + + await act(async () => { + fireEvent.click(document.getElementById('button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(` + opacity: 0; + `); + + expect(document.querySelector('.arrow')).not.toBeNull(); + }); + + it('should expose reference element', async () => { + jest.useFakeTimers(); + + const ref = jest.fn(); + + await act(async () => { + render(toolTip({ trigger: 'onClick', referenceElement: ref })); + }); + + expect(ref).toBeCalledWith(document.querySelector('#button')); + }); + + it('should render a controlled component', async () => { + jest.useFakeTimers(); + + const updateState = jest.fn(); + + await act(async () => { + render(); + }); + + expect(document.querySelector('.sha-el-tooltip')).toHaveStyle(`opacity: 1;`); + + await act(async () => { + fireEvent.mouseOver(document.querySelector('body')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(updateState).toBeCalled(); + expect(updateState).toBeCalledWith(false); + + await act(async () => { + fireEvent.mouseOver(document.querySelector('#button')); + }); + + act(() => { + jest.runAllTimers(); + }); + + expect(updateState).toBeCalledWith(true); + }); + + it("should execute children's onClick, onFocus and onBlur", async () => { + jest.useFakeTimers(); + + const onClick = jest.fn(); + const onFocus = jest.fn(); + const onMouseEnter = jest.fn(); + const onBlur = jest.fn(); + + await act(async () => { + render( + toolTip({ + children: ); -}; +}); Button.defaultProps = { size: 'default', diff --git a/src/components/Calendar/Calendar.tsx b/src/components/Calendar/Calendar.tsx index 495fc4d..6d0f29b 100644 --- a/src/components/Calendar/Calendar.tsx +++ b/src/components/Calendar/Calendar.tsx @@ -68,7 +68,7 @@ export const Calendar: React.FC = (props) => { const [startDate, endDate] = [initialDate(v.startDate), initialDate(v.endDate)]; if (day === startDate.getDate() && month === startDate.getMonth() && year === startDate.getFullYear()) { return ( - +
= (props) => { compareDesc(new Date(year, month, day), endDate) === 1 ) { return ( - +
= (props) => { if (day === endDate.getDate() && month === endDate.getMonth() && year === endDate.getFullYear()) { return ( - +
= (props) => { {weeks.map((v) => ( - - + + {v.slice(0, 3)} diff --git a/src/components/DatePicker/DatePicker.stories.tsx b/src/components/DatePicker/DatePicker.stories.tsx index d793947..d235c1b 100644 --- a/src/components/DatePicker/DatePicker.stories.tsx +++ b/src/components/DatePicker/DatePicker.stories.tsx @@ -13,7 +13,12 @@ export default { const Template: Story = (args) => { const [date, updateDate] = useState(null); - return updateDate(e)} />; + return ( + <> + updateDate(e)} /> +
+ + ); }; export const Basic = Template.bind({}); diff --git a/src/components/DatePicker/DatePicker.tsx b/src/components/DatePicker/DatePicker.tsx index 7bf0047..d189ae6 100644 --- a/src/components/DatePicker/DatePicker.tsx +++ b/src/components/DatePicker/DatePicker.tsx @@ -7,7 +7,6 @@ import { CalendarProps } from '../Calendar/Calendar'; import { TimePickerProps, TimePicker } from './TimePicker'; import { Popover } from '../Popover'; import { IoMdCalendar } from 'react-icons/io'; -import { Card } from '../..'; export const DatePicker: React.FC = (props) => { const { @@ -28,11 +27,15 @@ export const DatePicker: React.FC = (props) => { <> - + overlay={ + + = (props) => { {timePickerProps && ( <> - - - onChange(t)} /> - + + onChange(t)} + />
+ {inputComponent} ); @@ -105,15 +121,14 @@ const content = ( (props.use12Hour ? arrayBetween(1, 12) : arrayBetween(0, 24)).map((v) => hourArray.push(v)); return ( -
- +
+ {hourArray.map((v) => ( { if (!props.use12Hour) { @@ -133,7 +148,6 @@ const content = ( margin="0" padding="5px 15px" variant="p" - fontSize="16px" background={time.getMinutes() === v && 'primary'} onClick={() => onChange(undefined, v)} key={v} @@ -148,7 +162,6 @@ const content = ( margin="0" padding="5px 15px" variant="p" - fontSize="16px" background={time.getSeconds() === v && 'primary'} onClick={() => onChange(undefined, undefined, v)} key={v} @@ -163,7 +176,6 @@ const content = ( margin="0" padding="5px 15px" variant="p" - fontSize="16px" background={time.getHours() < 12 && 'primary'} onClick={() => handleAmPmChange('AM', time, onChange)} > @@ -173,7 +185,6 @@ const content = ( margin="0" padding="5px 15px" variant="p" - fontSize="16px" background={time.getHours() >= 12 && 'primary'} onClick={() => handleAmPmChange('PM', time, onChange)} > @@ -221,6 +232,7 @@ export interface TimePickerProps extends InputType { time?: Date; onChange?: (time: Date | null) => void; use12Hour?: boolean; + open?: boolean; } const handleAmPmChange = (amPm: 'AM' | 'PM', time: Date, onChange: (h?: number, m?: number, s?: number) => void) => { diff --git a/src/components/DatePicker/style.ts b/src/components/DatePicker/style.ts index bb700d3..c937567 100644 --- a/src/components/DatePicker/style.ts +++ b/src/components/DatePicker/style.ts @@ -5,7 +5,7 @@ export const style = (theme: Theme) => css({ background: theme.background, '& .sha-el-col': { - maxHeight: '300px', + maxHeight: '250px', overflowY: 'hidden', cursor: 'pointer', minWidth: '50px', diff --git a/src/components/Drawer/Drawer.tsx b/src/components/Drawer/Drawer.tsx index b6bca89..1ff71e8 100644 --- a/src/components/Drawer/Drawer.tsx +++ b/src/components/Drawer/Drawer.tsx @@ -4,7 +4,7 @@ import { borderCss } from '../../helpers/border'; import { elevationCss } from '../../helpers/elevations'; import { paddingCss } from '../../helpers/padding'; import { SurfaceProps } from '../../typings/surface'; -import { Portal } from '../Popover/Portal'; +import { Portal } from '../Portal/Portal'; import { useTheme } from '../Theme/Theme'; import { style } from './style'; diff --git a/src/components/Input/style.ts b/src/components/Input/style.ts index 8694df0..ccd8439 100644 --- a/src/components/Input/style.ts +++ b/src/components/Input/style.ts @@ -58,6 +58,7 @@ export const style = ({ theme, error, label, active, borderless, disabled, hover }, }), input: css({ + width: '100%', fontSize: '14px', background: 'transparent', borderWidth: '0px', diff --git a/src/components/Menu/Menu.tsx b/src/components/Menu/Menu.tsx index 74120a9..ac44f62 100644 --- a/src/components/Menu/Menu.tsx +++ b/src/components/Menu/Menu.tsx @@ -13,7 +13,7 @@ const style = (mode: MenuProps['mode']) => }); export const Menu: React.FC = (props) => { - const { anchor, trigger, mode, children, position, elevation, border, backgroundColor, height, densed } = props; + const { anchor, trigger, mode, children, placement, elevation, border, backgroundColor, height, densed } = props; if (mode === 'expand') { return {children}; @@ -48,14 +48,14 @@ export const Menu: React.FC = (props) => { return ( {children} } - position={position} + placement={placement} trigger={trigger} padding={0} margin={0} @@ -72,7 +72,7 @@ export interface MenuProps { children?: React.ReactElement | React.ReactElement[]; mode?: 'vertical' | 'horizontal' | 'inline' | 'expand'; trigger?: PopoverProps['trigger']; - position?: PopoverProps['position']; + placement?: PopoverProps['placement']; elevation?: number; border?: number; backgroundColor?: string; diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx index 46b70ae..6440fa9 100644 --- a/src/components/Modal/Modal.tsx +++ b/src/components/Modal/Modal.tsx @@ -5,7 +5,7 @@ import { elevationCss } from '../../helpers/elevations'; import { marginCss } from '../../helpers/margin'; import { paddingCss } from '../../helpers/padding'; import { SurfaceProps } from '../../typings/surface'; -import { Portal } from '../Popover/Portal'; +import { Portal } from '../Portal/Portal'; import { useTheme } from '../Theme/Theme'; import { style as modalStyle } from './style'; diff --git a/src/components/Notification/Notification.tsx b/src/components/Notification/Notification.tsx index 8014359..22fc18d 100644 --- a/src/components/Notification/Notification.tsx +++ b/src/components/Notification/Notification.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { render } from 'react-dom'; import { MdInfoOutline, MdErrorOutline, MdWarning, MdDoneAll } from 'react-icons/md'; -import { Portal } from '../Popover/Portal'; +import { Portal } from '../Portal/Portal'; import { NotificationProps, notificationSubject$ } from './NotificationService'; import posed, { PoseGroup } from 'react-pose'; import { isBrowser } from '../../helpers'; diff --git a/src/components/Pagination/Pagination.tsx b/src/components/Pagination/Pagination.tsx index 2ea7972..42f7f97 100644 --- a/src/components/Pagination/Pagination.tsx +++ b/src/components/Pagination/Pagination.tsx @@ -24,7 +24,7 @@ export const Pagination: React.FC = (props) => { containerStyle={{ margin: '7px 0' }} /> } - position="bottom" + placement="bottom" > {itemsPerPage.map((v) => ( onChange?.(1, v, false, false)} key={`pagination-${v}`}> diff --git a/src/components/Popover/Popover.stories.tsx b/src/components/Popover/Popover.stories.tsx index 25b199f..d829bf2 100644 --- a/src/components/Popover/Popover.stories.tsx +++ b/src/components/Popover/Popover.stories.tsx @@ -17,7 +17,7 @@ export default { export const Basic: Story = (args) => ( Content @@ -27,14 +27,14 @@ export const Basic: Story = (args) => ( ); -export const Position: Story = (args) => ( +export const placement: Story = (args) => ( <> Content @@ -46,8 +46,8 @@ export const Position: Story = (args) => ( Content @@ -59,8 +59,8 @@ export const Position: Story = (args) => ( Content @@ -74,8 +74,8 @@ export const Position: Story = (args) => ( Content @@ -87,8 +87,8 @@ export const Position: Story = (args) => ( Content @@ -102,8 +102,8 @@ export const Position: Story = (args) => ( Content @@ -115,8 +115,8 @@ export const Position: Story = (args) => ( Content @@ -128,8 +128,8 @@ export const Position: Story = (args) => ( Content @@ -147,7 +147,7 @@ export const Triggers: Story = (args) => ( Content @@ -158,7 +158,7 @@ export const Triggers: Story = (args) => ( Content @@ -168,8 +168,8 @@ export const Triggers: Story = (args) => ( Content @@ -183,7 +183,7 @@ export const Triggers: Story = (args) => ( export const HideArrow: Story = (args) => ( Content @@ -193,3 +193,23 @@ export const HideArrow: Story = (args) => ( ); + +export const Nested: Story = (args) => ( + + Content + + } + > + + + } + > + + +); diff --git a/src/components/Popover/Popover.tsx b/src/components/Popover/Popover.tsx index 537ae87..b7e5189 100644 --- a/src/components/Popover/Popover.tsx +++ b/src/components/Popover/Popover.tsx @@ -1,126 +1,32 @@ import * as React from 'react'; -import RCTooltip from 'rc-tooltip'; -import { classes, isBrowser } from '../../helpers'; +import { classes } from '../../helpers'; import { useTheme } from '../Theme/Theme'; import { style } from './style'; -import { elevationCss } from '../../helpers/elevations'; -import { PaddingClassNameInput, paddingCss } from '../../helpers/padding'; -import { MarginClassNameInput, marginCss } from '../../helpers/margin'; +import { Tooltip, TooltipProps } from '../Tooltip/Tooltip'; export const Popover: React.FC = (props) => { const theme = useTheme(); const [childWidth, updateChildWidth] = React.useState(); - const [visible, updateVisible] = React.useState(props.visible); - const child = React.useRef(); - const css = style(theme, props.expand || false, childWidth); + const css = style(theme, props.expand, childWidth); - React.useEffect(() => { - updateVisible(props.visible); - }, [props.visible]); + const { className } = props; - const renderContent = () => { - const { hideArrow } = props; - return ( -
-
-
-
{props.content}
-
-
- ); - }; - - const { - trigger, - children, - preserveOnClose, - position, - cover, - align, - animation, - style: { container: containerStyle = {}, child: childStyle = {} } = {}, - onVisibleChange, - elevation = 12, - padding = { xs: 0, sm: 2, md: 5, lg: 8 }, - margin = { xs: 0, sm: 2, md: 5, lg: 8 }, - } = props; - - if (!isBrowser) { - return ( -
- {React.cloneElement(children)} -
- ); - } return ( - { - if (props.visible === undefined) { - updateVisible(v); - } - updateChildWidth(child?.current?.getBoundingClientRect().width || 0); - onVisibleChange && onVisibleChange(v); - }} - visible={visible} - align={cover ? { points: ['tl', 't'] } : align} - animation={animation} - > -
- {React.cloneElement(children)} -
-
+ updateChildWidth(e?.getBoundingClientRect().width)} + /> ); }; -const triggers = (t: PopoverProps['trigger']) => { - const obj = { - onClick: 'click', - onHover: 'hover', - onFocus: 'focus', - }; - - if (Array.isArray(t)) { - return t.map((v) => obj[v]); - } - - return [obj[t || 'onClick']]; -}; - -type triggers = 'onClick' | 'onHover' | 'onFocus'; - -export interface PopoverProps { - children: React.ReactElement; - trigger?: triggers | triggers[]; - position?: 'left' | 'right' | 'top' | 'bottom' | 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'; - content?: React.ReactNode; - hideArrow?: boolean; - style?: { - container?: React.CSSProperties; - title?: React.CSSProperties; - content?: React.CSSProperties; - child?: React.CSSProperties; - }; +export interface PopoverProps extends TooltipProps { + /** + * Takes width of child + */ expand?: boolean; - preserveOnClose?: boolean; - visible?: boolean; - onVisibleChange?: (visible?: boolean) => void; - align?: Record; - elevation?: number; - cover?: boolean; - animation?: string; - padding?: PaddingClassNameInput; - margin?: MarginClassNameInput; } Popover.defaultProps = { - trigger: 'onClick', - position: 'bottom', style: {}, - elevation: 12, }; diff --git a/src/components/Popover/Portal.tsx b/src/components/Popover/Portal.tsx deleted file mode 100644 index 2fa2159..0000000 --- a/src/components/Popover/Portal.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import * as React from 'react'; -import { createPortal } from 'react-dom'; - -export class Portal extends React.Component { - constructor(props: Props) { - super(props); - - this.state = { - dom: null, - }; - } - - createPortalDom = () => { - const dom = document.createElement('div'); - document.body.appendChild(dom); - return this.setState({ dom }); - }; - - componentDidMount() { - if (document) { - return this.createPortalDom(); - } - setTimeout(this.componentDidMount, 500); - } - - componentWillUnmount() { - this.state.dom.remove(); - } - - render() { - return (this.state.dom && createPortal(this.props.children, this.state.dom)) ||
; - } -} - -interface Props { - children: React.ReactNode; -} diff --git a/src/components/Popover/style.ts b/src/components/Popover/style.ts index 147c1a1..c0e0420 100644 --- a/src/components/Popover/style.ts +++ b/src/components/Popover/style.ts @@ -1,5 +1,4 @@ import { css } from '@emotion/css'; -import { colorShades } from '../../helpers/color'; import { Theme } from '../Theme/Theme'; export const style = (theme: Theme, expand: boolean, childWidth: number) => @@ -7,10 +6,6 @@ export const style = (theme: Theme, expand: boolean, childWidth: number) => width: expand ? childWidth : 'auto', minWidth: '100px', borderRadius: '4px', - padding: '0', - background: theme.background, + background: theme.background + ' !important', color: `${theme.textColor} !important`, - '& .rc-tooltip-arrow': { - borderTopColor: colorShades(theme.background)[3], - }, }); diff --git a/src/components/Portal/Portal.tsx b/src/components/Portal/Portal.tsx new file mode 100644 index 0000000..21f4d76 --- /dev/null +++ b/src/components/Portal/Portal.tsx @@ -0,0 +1,54 @@ +import * as React from 'react'; +import { createPortal } from 'react-dom'; +import { classes } from '../../helpers'; + +export const PortalContext = React.createContext<{ element: HTMLDivElement }>({ element: null }); + +export class Portal extends React.Component { + constructor(props: PortalProps) { + super(props); + + this.state = { + dom: null, + }; + } + + static defaultProps = { + className: '', + }; + + createPortalDom = (element: HTMLDivElement) => { + if (element) { + return this.setState({ dom: element }); + } + const dom = document.createElement('div'); + dom.className = classes(this.props.className, 'sha-el-portal'); + document.body.appendChild(dom); + return this.setState({ dom }); + }; + + componentDidMount() { + if (!document) { + setTimeout(this.componentDidMount, 500); + } + return this.createPortalDom(this.props.dom); + } + + componentWillUnmount() { + this.state.dom.remove(); + } + + render() { + return ( + + {(this.state.dom && createPortal(this.props.children, this.state.dom)) ||
} + + ); + } +} + +export interface PortalProps { + children?: React.ReactNode; + className?: string; + dom?: HTMLDivElement; +} diff --git a/src/components/Portal/index.ts b/src/components/Portal/index.ts new file mode 100644 index 0000000..ca6e556 --- /dev/null +++ b/src/components/Portal/index.ts @@ -0,0 +1 @@ +export { Portal } from './Portal'; diff --git a/src/components/Text/Text.tsx b/src/components/Text/Text.tsx index 91c845a..1060596 100644 --- a/src/components/Text/Text.tsx +++ b/src/components/Text/Text.tsx @@ -14,6 +14,23 @@ export const Text: React.FunctionComponent = (props) => { const theme = useTheme(); const css = classes(style({ props, theme }), props.className); + const { + variant: __variant, + italicize: __italicize, + fontFamily: __fontFamily, + fontSize: __fontSize, + padding: __padding, + margin: __margin, + color: __color, + underline: __underline, + strikeThrough: __strikethrough, + fontWeight: __fontWeight, + textAlign: __textAlign, + background: __background, + monoFont: __monoFont, + ...rest + } = props; + const element = { h1:

, h2:

, @@ -27,13 +44,11 @@ export const Text: React.FunctionComponent = (props) => { return React.cloneElement(element, { className: css, - style: props.style, - onClick: props.onClick, - children: props.children, + ...rest, }); }; -export interface TextProps { +export interface TextProps extends React.LabelHTMLAttributes { children: React.ReactNode; /** * Defines variant for heading. @@ -71,11 +86,6 @@ export interface TextProps { * Strikes a line through the text. */ strikeThrough?: boolean; - /** - * Add custom styling - */ - style?: React.CSSProperties; - /** * Add font weight */ @@ -95,10 +105,6 @@ export interface TextProps { * Set monospace font. */ monoFont?: boolean; - - className?: string; - - onClick?: (e: React.MouseEvent) => void; } Text.defaultProps = { diff --git a/src/components/Tooltip/Tooltip.stories.tsx b/src/components/Tooltip/Tooltip.stories.tsx index 8aad358..32f6d53 100644 --- a/src/components/Tooltip/Tooltip.stories.tsx +++ b/src/components/Tooltip/Tooltip.stories.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import { Story, Meta } from '@storybook/react'; import { Tooltip } from '../..'; @@ -14,8 +14,31 @@ export default { }, } as Meta; -export const Basic: Story = (args) => ( - Content}> - - -); +export const Basic: Story = (args) => { + return ( + Hello}> + + + ); +}; + +export const ControlledToolTip = (args: Partial) => { + const [state, updateState] = useState(args.visible); + + return ( + <> + { + updateState(v); + args.onVisibleChange(v); + }} + overlay={Hello World} + > + + + + + ); +}; diff --git a/src/components/Tooltip/Tooltip.tsx b/src/components/Tooltip/Tooltip.tsx index 61b84db..602c9f0 100644 --- a/src/components/Tooltip/Tooltip.tsx +++ b/src/components/Tooltip/Tooltip.tsx @@ -1,14 +1,259 @@ -import React from 'react'; -import RCTooltip from 'rc-tooltip'; -import { TooltipProps } from 'rc-tooltip/lib/Tooltip'; +import { debounce } from 'debounce'; +import React, { useContext, useEffect, useState } from 'react'; +import { usePopper } from 'react-popper'; +import { classes } from '../../helpers'; +import { borderCss } from '../../helpers/border'; +import { elevationCss } from '../../helpers/elevations'; +import { marginCss } from '../../helpers/margin'; +import { paddingCss } from '../../helpers/padding'; +import { SurfaceProps } from '../../typings/surface'; +import { Portal, PortalContext } from '../Portal/Portal'; import { useTheme } from '../Theme/Theme'; import { style } from './style'; +export type ActionType = 'onClick' | 'onFocus' | 'onMouseOver'; +export type CloseActionType = 'onClick' | 'onBlur' | 'onMouseLeave'; + +export type TooltipPlacement = + | 'auto' + | 'auto-start' + | 'auto-end' + | 'top' + | 'top-start' + | 'top-end' + | 'bottom' + | 'bottom-start' + | 'bottom-end' + | 'right' + | 'right-start' + | 'right-end' + | 'left' + | 'left-start' + | 'left-end'; + +export type TooltipStrategy = 'absolute' | 'fixed'; + +export interface TooltipProps extends SurfaceProps { + /** + * reference Element + */ + children: React.ReactElement; + /** + * Content to be displayed + */ + overlay?: React.ReactNode; + /** + * Triggers to open tooltip + * @default 'onMouseEnter' + */ + trigger?: ActionType | ActionType[]; + + /** + * Triggers to close tooltip + * @default 'based on trigger' + */ + closeTrigger?: CloseActionType | CloseActionType[]; + + /** + * Placement of tooltip + */ + placement?: TooltipPlacement; + + /** + * Describes the positioning strategy to use. + */ + strategy?: TooltipStrategy; + /** + * Controlled way to handle tooltip state + */ + visible?: boolean; + /** + * Triggers on tooltip state change + */ + onVisibleChange?: (visible: boolean) => void; + /** + * Hides arrrow + */ + hideArrow?: boolean; + /** + * Refernce dom object + */ + referenceElement?: (e: HTMLElement) => void; + /** + * Overlay classname + */ + className?: string; + /** + * Arrow classname + */ + arrowClassName?: string; + /** + * Style object for overlay + */ + style?: React.CSSProperties; + /** + * Style object for arrow + */ + arrowStyle?: React.CSSProperties; +} + export const Tooltip: React.FC = (props) => { + const { + elevation, + border, + padding, + margin, + placement, + children, + overlay, + trigger, + closeTrigger, + visible, + hideArrow, + onVisibleChange, + } = props; + + const [referenceElement, setReferenceElement] = useState(null); + const [popperElement, setPopperElement] = useState(null); + const [arrowElement, setArrowElement] = useState(null); + const { styles, attributes } = usePopper(referenceElement, popperElement, { + modifiers: [{ name: 'arrow', options: { element: arrowElement } }], + placement, + }); + + const [isOpen, updateTooltipState] = useState(visible || false); + + const onClose = () => { + updateTooltipState(false); + onVisibleChange?.(false); + document.body.removeEventListener('mouseover', handleClose); + document.body.removeEventListener('click', handleClose); + }; + + const debouncedFn = debounce(onClose, 300); + + useEffect(() => { + if (visible) { + attachEvents(Array.isArray(trigger) ? trigger[0] : trigger); + updateTooltipState(true); + } else { + onClose(); + } + return debouncedFn.flush; + }, [visible]); + + const handleVisible = (actionType: ActionType) => { + if (!trigger.includes(actionType)) { + return; + } + if (actionType === 'onClick' && isOpen) { + debouncedFn(); + } + updateTooltipState(true); + onVisibleChange?.(true); + attachEvents(actionType); + }; + + const attachEvents = (trigger: ActionType) => { + if ((trigger === 'onMouseOver' && closeTrigger === undefined) || closeTrigger?.includes('onMouseLeave')) { + document.body.addEventListener('mouseover', handleClose); + } + + if ((trigger === 'onClick' && closeTrigger === undefined) || closeTrigger?.includes('onClick')) { + document.body.addEventListener('click', handleClose); + } + + if ((trigger === 'onFocus' && closeTrigger === undefined) || closeTrigger?.includes('onBlur')) { + referenceElement.addEventListener('blur', handleClose); + } + }; + + const dom = useContext(PortalContext); + + function handleClose(event: MouseEvent) { + const target = event.target as HTMLElement; + if ( + (target.isSameNode(referenceElement) || + target.isSameNode(popperElement) || + target.isSameNode(arrowElement) || + referenceElement?.contains(target) || + popperElement?.parentElement?.contains(target) || + popperElement?.contains(target)) && + event.type !== 'blur' + ) { + return; + } + debouncedFn(); + } + const theme = useTheme(); - const css = style(theme); + const css = style(theme, isOpen, attributes.popper?.['data-popper-placement'], hideArrow); - return ; + return ( + <> + {React.cloneElement(children, { + ref: (e: HTMLElement) => { + setReferenceElement(e); + props.referenceElement?.(e); + }, + onClick: (e: React.MouseEvent) => { + e.stopPropagation(); + handleVisible('onClick'); + children.props.onClick?.(e); + }, + onFocus: (e: React.FocusEvent) => { + handleVisible('onFocus'); + children.props.onFocus?.(e); + }, + onMouseOver: (e: React.MouseEvent) => { + handleVisible('onMouseOver'); + children.props.onMouseEnter?.(e); + }, + onBlur: (e: React.FocusEvent) => { + handleVisible('onFocus'); + children.props.onBlur?.(e); + }, + })} + +
+
+ {overlay} + {!hideArrow && ( +
+ )} +
+
+ + + ); }; -export { TooltipProps }; +Tooltip.defaultProps = { + padding: [5, 10], + placement: 'bottom', + trigger: 'onMouseOver', + elevation: 12, + overlay: '', + style: {}, + arrowStyle: {}, +}; diff --git a/src/components/Tooltip/style.ts b/src/components/Tooltip/style.ts index 657c361..db028c3 100644 --- a/src/components/Tooltip/style.ts +++ b/src/components/Tooltip/style.ts @@ -2,11 +2,57 @@ import { Theme } from '../Theme/Theme'; import Color from 'color'; import { colorShades } from '../../helpers/color'; import { css } from '@emotion/css'; +import { zBelowBase, zLayoutPopUp } from '../../helpers/zIndex'; -export const style = (theme: Theme) => - css({ - backgroundColor: colorShades(Color(theme.background).negate().toString())[4] + ' !important', - color: theme.background + ' !important', - borderRadius: '4px !important', - padding: '5px 10px !important', - }); +export const style = (theme: Theme, open: boolean, placement: string, hideArrow: boolean) => { + const arrowPlacement = { + top: 'bottom', + bottom: 'top', + right: 'left', + left: 'right', + }[placement?.split('-')[0]]; + + const contentPadding = { + top: 'paddingBottom', + bottom: 'paddingTop', + right: 'paddingLeft', + left: 'paddingRight', + }[placement?.split('-')[0]]; + + return { + content: css({ + [contentPadding]: !hideArrow && '10px', + boxSizing: 'border-box', + zIndex: open ? zLayoutPopUp : zBelowBase, + opacity: open ? '1' : '0', + transition: '.3s all', + }), + inner: css({ + backgroundColor: colorShades(Color(theme.background).negate().toString())[4], + color: theme.background, + borderRadius: '4px', + boxSizing: 'border-box', + zIndex: open ? zLayoutPopUp : zBelowBase, + }), + arrow: css({ + visibility: 'hidden', + position: 'absolute', + width: '8px', + height: '8px', + background: 'inherit', + + [arrowPlacement]: '6px', + + '&::before': { + visibility: open ? 'visible' : 'hidden', + content: "' '", + transform: 'rotate(45deg)', + + position: 'absolute', + width: '8px', + height: '8px', + background: 'inherit', + }, + }), + }; +}; diff --git a/src/helpers/index.ts b/src/helpers/index.ts index c2974af..c1ac63e 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -1,4 +1,3 @@ -import popverCss from './popover.css'; import topography from './typography.css'; import { initializeNotification } from './../components/Notification/Notification'; import { initMargins } from './margin'; @@ -58,7 +57,6 @@ export function initialize() { } @import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;1,400&display=swap'); @import url('https://fonts.googleapis.com/css?family=Fira+Code:300,400,500,600,700&display=swap'); - ${popverCss} ${topography} ${initMargins()} ${initPaddings()} @@ -68,6 +66,10 @@ export function initialize() { initializeNotification(); } +export function getChildIndex(node: HTMLElement) { + return Array.prototype.indexOf.call(node.parentNode.childNodes, node); +} + export const isBrowser = () => typeof window !== 'undefined' && typeof window.document !== 'undefined'; -export const classes = (...args) => args.filter((v) => !!v).join(' '); +export const classes = (...args: string[]) => args.filter((v) => !!v).join(' '); diff --git a/src/helpers/popover.css.ts b/src/helpers/popover.css.ts deleted file mode 100644 index 26bce83..0000000 --- a/src/helpers/popover.css.ts +++ /dev/null @@ -1,205 +0,0 @@ -export default ` -.rc-tooltip.rc-tooltip-zoom-enter, -.rc-tooltip.rc-tooltip-zoom-leave { - display: block; -} -.rc-tooltip-zoom-enter, -.rc-tooltip-zoom-appear { - opacity: 0; - animation-duration: 0.3s; - animation-fill-mode: both; - animation-timing-function: cubic-bezier(0.18, 0.89, 0.32, 1.28); - animation-play-state: paused; -} -.rc-tooltip-zoom-leave { - animation-duration: 0.3s; - animation-fill-mode: both; - animation-timing-function: cubic-bezier(0.6, -0.3, 0.74, 0.05); - animation-play-state: paused; -} -.rc-tooltip-zoom-enter.rc-tooltip-zoom-enter-active, -.rc-tooltip-zoom-appear.rc-tooltip-zoom-appear-active { - animation-name: rcToolTipZoomIn; - animation-play-state: running; -} -.rc-tooltip-zoom-leave.rc-tooltip-zoom-leave-active { - animation-name: rcToolTipZoomOut; - animation-play-state: running; -} -@keyframes rcToolTipZoomIn { - 0% { - opacity: 0; - transform-origin: 50% 50%; - transform: scale(0, 0); - } - 100% { - opacity: 1; - transform-origin: 50% 50%; - transform: scale(1, 1); - } -} -@keyframes rcToolTipZoomOut { - 0% { - opacity: 1; - transform-origin: 50% 50%; - transform: scale(1, 1); - } - 100% { - opacity: 0; - transform-origin: 50% 50%; - transform: scale(0, 0); - } -} -.rc-tooltip { - position: absolute; - z-index: 1070; - display: block; - visibility: visible; - line-height: 1.5; - font-size: 12px; - padding: 1px; - opacity: 1; -} -.rc-tooltip-hidden { - display: none; -} -.rc-tooltip-inner { - text-align: left; - text-decoration: none; - border-radius: 3px; -} -.rc-tooltip-arrow, -.rc-tooltip-arrow-inner { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - display: none; -} -.rc-tooltip-placement-top .rc-tooltip-arrow, -.rc-tooltip-placement-topLeft .rc-tooltip-arrow, -.rc-tooltip-placement-topRight .rc-tooltip-arrow { - bottom: -5px; - margin-left: -6px; - border-width: 6px 6px 0; -} -.rc-tooltip-placement-top .rc-tooltip-arrow-inner, -.rc-tooltip-placement-topLeft .rc-tooltip-arrow-inner, -.rc-tooltip-placement-topRight .rc-tooltip-arrow-inner { - bottom: 1px; - margin-left: -6px; - border-width: 6px 6px 0; - border-top-color: #ffffff; -} -.rc-tooltip-placement-top .rc-tooltip-arrow { - left: 50%; -} -.rc-tooltip-placement-topLeft .rc-tooltip-arrow { - left: 15%; -} -.rc-tooltip-placement-topRight .rc-tooltip-arrow { - right: 15%; -} -.rc-tooltip-placement-right .rc-tooltip-arrow, -.rc-tooltip-placement-rightTop .rc-tooltip-arrow, -.rc-tooltip-placement-rightBottom .rc-tooltip-arrow { - left: -5px; - margin-top: -6px; - border-width: 6px 6px 6px 0; - border-right-color: #b1b1b1; -} -.rc-tooltip-placement-right .rc-tooltip-arrow-inner, -.rc-tooltip-placement-rightTop .rc-tooltip-arrow-inner, -.rc-tooltip-placement-rightBottom .rc-tooltip-arrow-inner { - left: 1px; - margin-top: -6px; - border-width: 6px 6px 6px 0; - border-right-color: #ffffff; -} -.rc-tooltip-placement-right .rc-tooltip-arrow { - top: 50%; -} -.rc-tooltip-placement-rightTop .rc-tooltip-arrow { - top: 15%; - margin-top: 0; -} -.rc-tooltip-placement-rightBottom .rc-tooltip-arrow { - bottom: 15%; -} -.rc-tooltip-placement-left .rc-tooltip-arrow, -.rc-tooltip-placement-leftTop .rc-tooltip-arrow, -.rc-tooltip-placement-leftBottom .rc-tooltip-arrow { - right: -5px; - margin-top: -6px; - border-width: 6px 0 6px 6px; - border-left-color: #b1b1b1; -} -.rc-tooltip-placement-left .rc-tooltip-arrow-inner, -.rc-tooltip-placement-leftTop .rc-tooltip-arrow-inner, -.rc-tooltip-placement-leftBottom .rc-tooltip-arrow-inner { - right: 1px; - margin-top: -6px; - border-width: 6px 0 6px 6px; - border-left-color: #ffffff; -} -.rc-tooltip-placement-left .rc-tooltip-arrow { - top: 50%; -} -.rc-tooltip-placement-leftTop .rc-tooltip-arrow { - top: 15%; - margin-top: 0; -} -.rc-tooltip-placement-leftBottom .rc-tooltip-arrow { - bottom: 15%; -} -.rc-tooltip-placement-bottom .rc-tooltip-arrow, -.rc-tooltip-placement-bottomLeft .rc-tooltip-arrow, -.rc-tooltip-placement-bottomRight .rc-tooltip-arrow { - top: -5px; - margin-left: -6px; - border-width: 0 6px 6px; - border-bottom-color: #b1b1b1; -} -.rc-tooltip-placement-bottom .rc-tooltip-arrow-inner, -.rc-tooltip-placement-bottomLeft .rc-tooltip-arrow-inner, -.rc-tooltip-placement-bottomRight .rc-tooltip-arrow-inner { - top: 1px; - margin-left: -6px; - border-width: 0 6px 6px; - border-bottom-color: #ffffff; -} -.rc-tooltip-placement-bottom .rc-tooltip-arrow { - left: 50%; -} -.rc-tooltip-placement-bottomLeft .rc-tooltip-arrow { - left: 15%; -} -.rc-tooltip-placement-bottomRight .rc-tooltip-arrow { - right: 15%; -} - - -*::-webkit-scrollbar -{ - height: 5px; - width: 5px; - background-color: rgba(0,0,0,0); -} - -*::-webkit-scrollbar-thumb -{ - height: 2px; - width: 2px; - background-color: #ccc; - background-image: -webkit-linear-gradient(45deg, - rgba(255, 255, 255, .2) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, .2) 50%, - rgba(255, 255, 255, .2) 75%, - transparent 75%, - transparent) -} - -`; diff --git a/src/helpers/zIndex.ts b/src/helpers/zIndex.ts index 366ed15..a4f13a0 100644 --- a/src/helpers/zIndex.ts +++ b/src/helpers/zIndex.ts @@ -8,3 +8,5 @@ export const zLayoutFooter = above + zIndexBase; export const zLayoutModal = above + zAboveBase; export const zLayoutModalBackDrop = above + zAboveBase + zIndexBase; export const zLayoutPopUp = above + zLayoutModal; + +export const zBelowBase = zIndexBase - above; diff --git a/src/index.ts b/src/index.ts index 909a145..f89085f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -39,3 +39,4 @@ export { Text } from './components/Text'; export { Upload } from './components/Upload'; export { Slider, Range, SliderHandle } from './components/Slider'; export { Step, Stepper } from './components/Stepper'; +export { Portal } from './components/Portal'; diff --git a/yarn.lock b/yarn.lock index 426b9ca..e9dc114 100644 --- a/yarn.lock +++ b/yarn.lock @@ -57,7 +57,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.11.4", "@babel/core@^7.12.10", "@babel/core@^7.4.5", "@babel/core@^7.7.5": +"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.11.4", "@babel/core@^7.12.10", "@babel/core@^7.4.5", "@babel/core@^7.7.2", "@babel/core@^7.7.5": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== @@ -78,7 +78,7 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.14.2", "@babel/generator@^7.14.3": +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.14.2", "@babel/generator@^7.14.3", "@babel/generator@^7.7.2": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== @@ -314,7 +314,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.12.11", "@babel/parser@^7.12.13", "@babel/parser@^7.12.7", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3": +"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.12.11", "@babel/parser@^7.12.13", "@babel/parser@^7.12.7", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.7.2": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== @@ -629,7 +629,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-typescript@^7.12.13": +"@babel/plugin-syntax-typescript@^7.12.13", "@babel/plugin-syntax-typescript@^7.7.2": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== @@ -1101,7 +1101,7 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.7.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== @@ -1378,93 +1378,94 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== +"@jest/console@^27.0.2": + version "27.0.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.0.2.tgz#b8eeff8f21ac51d224c851e1729d2630c18631e6" + integrity sha512-/zYigssuHLImGeMAACkjI4VLAiiJznHgAl3xnFT19iWyct2LhrH3KXOjHRmxBGTkiPLZKKAJAgaPpiU9EZ9K+w== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.0.2" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.0.2" + jest-util "^27.0.2" slash "^3.0.0" -"@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== +"@jest/core@^27.0.4": + version "27.0.4" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.0.4.tgz#679bf9ac07900da2ddbb9667bb1afa8029038f53" + integrity sha512-+dsmV8VUs1h/Szb+rEWk8xBM1fp1I///uFy9nk3wXGvRsF2lBp8EVPmtWc+QFRb3MY2b7u2HbkGF1fzoDzQTLA== dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.0.2" + "@jest/reporters" "^27.0.4" + "@jest/test-result" "^27.0.2" + "@jest/transform" "^27.0.2" + "@jest/types" "^27.0.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" + emittery "^0.8.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" + jest-changed-files "^27.0.2" + jest-config "^27.0.4" + jest-haste-map "^27.0.2" + jest-message-util "^27.0.2" + jest-regex-util "^27.0.1" + jest-resolve "^27.0.4" + jest-resolve-dependencies "^27.0.4" + jest-runner "^27.0.4" + jest-runtime "^27.0.4" + jest-snapshot "^27.0.4" + jest-util "^27.0.2" + jest-validate "^27.0.2" + jest-watcher "^27.0.2" + micromatch "^4.0.4" p-each-series "^2.1.0" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== +"@jest/environment@^27.0.3": + version "27.0.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.0.3.tgz#68769b1dfdd213e3456169d64fbe9bd63a5fda92" + integrity sha512-pN9m7fbKsop5vc3FOfH8NF7CKKdRbEZzcxfIo1n2TT6ucKWLFq0P6gCJH0GpnQp036++yY9utHOxpeT1WnkWTA== dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/fake-timers" "^27.0.3" + "@jest/types" "^27.0.2" "@types/node" "*" - jest-mock "^26.6.2" + jest-mock "^27.0.3" -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== +"@jest/fake-timers@^27.0.3": + version "27.0.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.0.3.tgz#9899ba6304cc636734c74478df502e18136461dd" + integrity sha512-fQ+UCKRIYKvTCEOyKPnaPnomLATIhMnHC/xPZ7yT1Uldp7yMgMxoYIFidDbpSTgB79+/U+FgfoD30c6wg3IUjA== dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" + "@jest/types" "^27.0.2" + "@sinonjs/fake-timers" "^7.0.2" "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.0.2" + jest-mock "^27.0.3" + jest-util "^27.0.2" -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== +"@jest/globals@^27.0.3": + version "27.0.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.0.3.tgz#1cf8933b7791bba0b99305cbf39fd4d2e3fe4060" + integrity sha512-OzsIuf7uf+QalqAGbjClyezzEcLQkdZ+7PejUrZgDs+okdAK8GwRCGcYCirHvhMBBQh60Jr3NlIGbn/KBPQLEQ== dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" + "@jest/environment" "^27.0.3" + "@jest/types" "^27.0.2" + expect "^27.0.2" -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== +"@jest/reporters@^27.0.4": + version "27.0.4" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.0.4.tgz#95609b1be97afb80d55d8aa3d7c3179c15810e65" + integrity sha512-Xa90Nm3JnV0xCe4M6A10M9WuN9krb+WFKxV1A98Y4ePCw40n++r7uxFUNU7DT1i9Behj7fjrAIju9oU0t1QtCg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.0.2" + "@jest/test-result" "^27.0.2" + "@jest/transform" "^27.0.2" + "@jest/types" "^27.0.2" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" @@ -1475,47 +1476,44 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" + jest-haste-map "^27.0.2" + jest-resolve "^27.0.4" + jest-util "^27.0.2" + jest-worker "^27.0.2" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== +"@jest/source-map@^27.0.1": + version "27.0.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.1.tgz#2afbf73ddbaddcb920a8e62d0238a0a9e0a8d3e4" + integrity sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A== dependencies: callsites "^3.0.0" graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== +"@jest/test-result@^27.0.2": + version "27.0.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.0.2.tgz#0451049e32ceb609b636004ccc27c8fa22263f10" + integrity sha512-gcdWwL3yP5VaIadzwQtbZyZMgpmes8ryBAJp70tuxghiA8qL4imJyZex+i+USQH2H4jeLVVszhwntgdQ97fccA== dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.0.2" + "@jest/types" "^27.0.2" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== +"@jest/test-sequencer@^27.0.4": + version "27.0.4" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.0.4.tgz#976493b277594d81e589896f0ed21f198308928a" + integrity sha512-6UFEVwdmxYdyNffBxVVZxmXEdBE4riSddXYSnFNH0ELFQFk/bvagizim8WfgJTqF4EKd+j1yFxvhb8BMHfOjSQ== dependencies: - "@jest/test-result" "^26.6.2" + "@jest/test-result" "^27.0.2" graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" + jest-haste-map "^27.0.2" + jest-runtime "^27.0.4" "@jest/transform@^26.6.2": version "26.6.2" @@ -1538,6 +1536,27 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/transform@^27.0.2": + version "27.0.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.0.2.tgz#b073b7c589e3f4b842102468875def2bb722d6b5" + integrity sha512-H8sqKlgtDfVog/s9I4GG2XMbi4Ar7RBxjsKQDUhn2XHAi3NG+GoQwWMER+YfantzExbjNqQvqBHzo/G2pfTiPw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.0.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^27.0.2" + jest-regex-util "^27.0.1" + jest-util "^27.0.2" + micromatch "^4.0.4" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" @@ -1549,6 +1568,17 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^27.0.2": + version "27.0.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.0.2.tgz#e153d6c46bda0f2589f0702b071f9898c7bbd37e" + integrity sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@mdx-js/loader@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-1.6.22.tgz#d9e8fe7f8185ff13c9c8639c048b123e30d322c4" @@ -1663,7 +1693,7 @@ style-value-types "^3.1.7" tslib "^1.10.0" -"@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0": +"@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0", "@popperjs/core@^2.9.2": version "2.9.2" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q== @@ -1701,10 +1731,10 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== +"@sinonjs/fake-timers@^7.0.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" + integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== dependencies: "@sinonjs/commons" "^1.7.0" @@ -2905,7 +2935,7 @@ lz-string "^1.4.4" pretty-format "^26.6.2" -"@testing-library/jest-dom@^5.11.6": +"@testing-library/jest-dom@^5.12.0": version "5.12.0" resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.12.0.tgz#6a5d340b092c44b7bce17a4791b47d9bc2c61443" integrity sha512-N9Y82b2Z3j6wzIoAqajlKVF1Zt7sOH0pPee0sUHXHc5cv2Fdn23r+vpWm0MBBoGJtPOly5+Bdx1lnc3CD+A+ow== @@ -2919,7 +2949,7 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^11.2.3": +"@testing-library/react@^11.2.7": version "11.2.7" resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.7.tgz#b29e2e95c6765c815786c0bc1d5aed9cb2bf7818" integrity sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA== @@ -2937,7 +2967,7 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.1.tgz#78b5433344e2f92e8b306c06a5622c50c245bf6b" integrity sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.14" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== @@ -3070,7 +3100,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*", "@types/jest@^26.0.10": +"@types/jest@*", "@types/jest@^26.0.23": version "26.0.23" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== @@ -3167,7 +3197,7 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== -"@types/prettier@^2.0.0": +"@types/prettier@^2.1.5": version "2.2.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== @@ -3353,6 +3383,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^16.0.0": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.3.tgz#4b6d35bb8e680510a7dc2308518a80ee1ef27e01" + integrity sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/eslint-plugin@^3.5.0": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" @@ -3765,6 +3802,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-to-html@^0.6.11: version "0.6.15" resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" @@ -4051,16 +4093,16 @@ babel-helper-to-multiple-sequence-expressions@^0.5.0: resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz#a3f924e3561882d42fcf48907aa98f7979a4588d" integrity sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA== -babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== +babel-jest@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.0.2.tgz#7dc18adb01322acce62c2af76ea2c7cd186ade37" + integrity sha512-9OThPl3/IQbo4Yul2vMz4FYwILPQak8XelX4YGowygfHaOl5R5gfjm4iVx4d8aUugkW683t8aq0A74E7b5DU1Q== dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" + "@jest/transform" "^27.0.2" + "@jest/types" "^27.0.2" + "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" + babel-preset-jest "^27.0.1" chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" @@ -4129,10 +4171,10 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== +babel-plugin-jest-hoist@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz#a6d10e484c93abff0f4e95f437dad26e5736ea11" + integrity sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -4361,12 +4403,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== +babel-preset-jest@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz#7a50c75d16647c23a2cf5158d5bb9eb206b10e20" + integrity sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA== dependencies: - babel-plugin-jest-hoist "^26.6.2" + babel-plugin-jest-hoist "^27.0.1" babel-preset-current-node-syntax "^1.0.0" "babel-preset-minify@^0.5.0 || 0.6.0-alpha.5": @@ -4882,12 +4924,12 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0: +camelcase@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== @@ -5034,6 +5076,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -5042,10 +5089,10 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== +cjs-module-lexer@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz#2fd46d9906a126965aa541345c499aaa18e8cd73" + integrity sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw== class-utils@^0.3.5: version "0.3.6" @@ -5140,15 +5187,6 @@ clipboard@^2.0.0: select "^1.1.2" tiny-emitter "^2.0.0" -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -5931,6 +5969,11 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +diff-sequences@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.1.tgz#9c9801d52ed5f576ff0a20e3022a13ee6e297e7c" + integrity sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -6152,10 +6195,10 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== "emoji-regex@>=6.0.0 <=6.1.1": version "6.1.1" @@ -6588,7 +6631,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.0, execa@^4.1.0: +execa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -6603,6 +6646,21 @@ execa@^4.0.0, execa@^4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.0.tgz#3ea50ee863d226bfa323528cce1684e7481dfe46" + integrity sha512-CkdUB7s2y6S+d4y+OM/+ZtQcJCiKUCth4cNImGMqrt2zEVtW2rfHGspQBE1GDo6LjeNIQmTPKXqTCKjqFKyu3A== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + execall@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" @@ -6628,17 +6686,17 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== +expect@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.0.2.tgz#e66ca3a4c9592f1c019fa1d46459a9d2084f3422" + integrity sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w== dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" + "@jest/types" "^27.0.2" + ansi-styles "^5.0.0" + jest-get-type "^27.0.1" + jest-matcher-utils "^27.0.2" + jest-message-util "^27.0.2" + jest-regex-util "^27.0.1" express@^4.17.0, express@^4.17.1: version "4.17.1" @@ -7207,7 +7265,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@^2.1.2, fsevents@~2.3.1: +fsevents@^2.1.2, fsevents@^2.3.2, fsevents@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -7261,7 +7319,7 @@ gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -7314,6 +7372,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -7529,11 +7592,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - gud@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" @@ -7911,6 +7969,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + husky@^4.2.5: version "4.3.8" resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" @@ -8262,6 +8325,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-ci@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" + integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== + dependencies: + ci-info "^3.1.1" + is-core-module@^2.2.0: version "2.4.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" @@ -8576,7 +8646,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.1.1, is-wsl@^2.2.0: +is-wsl@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -8682,59 +8752,86 @@ iterate-value@^1.0.2: es-get-iterator "^1.0.2" iterate-iterator "^1.0.1" -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== +jest-changed-files@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.0.2.tgz#997253042b4a032950fc5f56abf3c5d1f8560801" + integrity sha512-eMeb1Pn7w7x3wue5/vF73LPCJ7DKQuC9wQUR5ebP9hDPpk5hzcT/3Hmz3Q5BOFpR3tgbmaWhJcMTVgC8Z1NuMw== dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" + "@jest/types" "^27.0.2" + execa "^5.0.0" + throat "^6.0.1" -jest-cli@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== +jest-circus@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.0.4.tgz#3b261514ee3b3da33def736a6352c98ff56bb6e6" + integrity sha512-QD+eblDiRphta630WRKewuASLs/oY1Zki2G4bccntRvrTHQ63ljwFR5TLduuK4Zg0ZPzW0+8o6AP7KRd1yKOjw== dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.0.3" + "@jest/test-result" "^27.0.2" + "@jest/types" "^27.0.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.0.2" + is-generator-fn "^2.0.0" + jest-each "^27.0.2" + jest-matcher-utils "^27.0.2" + jest-message-util "^27.0.2" + jest-runtime "^27.0.4" + jest-snapshot "^27.0.4" + jest-util "^27.0.2" + pretty-format "^27.0.2" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.0.4.tgz#491b12c754c0d7c6873b13a66f26b3a80a852910" + integrity sha512-E0T+/i2lxsWAzV7LKYd0SB7HUAvePqaeIh5vX43/G5jXLhv1VzjYzJAGEkTfvxV774ll9cyE2ljcL73PVMEOXQ== + dependencies: + "@jest/core" "^27.0.4" + "@jest/test-result" "^27.0.2" + "@jest/types" "^27.0.2" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-config "^27.0.4" + jest-util "^27.0.2" + jest-validate "^27.0.2" prompts "^2.0.1" - yargs "^15.4.1" + yargs "^16.0.3" -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== +jest-config@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.0.4.tgz#c4f41378acf40ca77860fb4e213b12109d87b8cf" + integrity sha512-VkQFAHWnPQefdvHU9A+G3H/Z3NrrTKqWpvxgQz3nkUdkDTWeKJE6e//BL+R7z79dXOMVksYgM/z6ndtN0hfChg== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" + "@jest/test-sequencer" "^27.0.4" + "@jest/types" "^27.0.2" + babel-jest "^27.0.2" chalk "^4.0.0" deepmerge "^4.2.2" glob "^7.1.1" graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" + is-ci "^3.0.0" + jest-circus "^27.0.4" + jest-environment-jsdom "^27.0.3" + jest-environment-node "^27.0.3" + jest-get-type "^27.0.1" + jest-jasmine2 "^27.0.4" + jest-regex-util "^27.0.1" + jest-resolve "^27.0.4" + jest-runner "^27.0.4" + jest-util "^27.0.2" + jest-validate "^27.0.2" + micromatch "^4.0.4" + pretty-format "^27.0.2" -jest-diff@^26.0.0, jest-diff@^26.6.2: +jest-diff@^26.0.0: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== @@ -8744,54 +8841,69 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== - dependencies: - detect-newline "^3.0.0" - -jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== +jest-diff@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.0.2.tgz#f315b87cee5dc134cf42c2708ab27375cc3f5a7e" + integrity sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw== dependencies: - "@jest/types" "^26.6.2" chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" + diff-sequences "^27.0.1" + jest-get-type "^27.0.1" + pretty-format "^27.0.2" -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== +jest-docblock@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.1.tgz#bd9752819b49fa4fab1a50b73eb58c653b962e8b" + integrity sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA== dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" + detect-newline "^3.0.0" -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== +jest-each@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.0.2.tgz#865ddb4367476ced752167926b656fa0dcecd8c7" + integrity sha512-OLMBZBZ6JkoXgUenDtseFRWA43wVl2BwmZYIWQws7eS7pqsIvePqj/jJmEnfq91ALk3LNphgwNK/PRFBYi7ITQ== dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/types" "^27.0.2" + chalk "^4.0.0" + jest-get-type "^27.0.1" + jest-util "^27.0.2" + pretty-format "^27.0.2" + +jest-environment-jsdom@^27.0.3: + version "27.0.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.0.3.tgz#ed73e913ddc03864eb9f934b5cbabf1b63504e2e" + integrity sha512-5KLmgv1bhiimpSA8oGTnZYk6g4fsNyZiA/6gI2tAZUgrufd7heRUSVh4gRokzZVEj8zlwAQYT0Zs6tuJSW/ECA== + dependencies: + "@jest/environment" "^27.0.3" + "@jest/fake-timers" "^27.0.3" + "@jest/types" "^27.0.2" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-mock "^27.0.3" + jest-util "^27.0.2" + jsdom "^16.6.0" + +jest-environment-node@^27.0.3: + version "27.0.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.0.3.tgz#b4acb3679d2552a4215732cab8b0ca7ec4398ee0" + integrity sha512-co2/IVnIFL3cItpFULCvXFg9us4gvWXgs7mutAMPCbFhcqh56QAOdKhNzC2+RycsC/k4mbMj1VF+9F/NzA0ROg== + dependencies: + "@jest/environment" "^27.0.3" + "@jest/fake-timers" "^27.0.3" + "@jest/types" "^27.0.2" + "@types/node" "*" + jest-mock "^27.0.3" + jest-util "^27.0.2" jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.1.tgz#34951e2b08c8801eb28559d7eb732b04bbcf7815" + integrity sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg== + jest-haste-map@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" @@ -8813,69 +8925,89 @@ jest-haste-map@^26.6.2: optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== +jest-haste-map@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.0.2.tgz#3f1819400c671237e48b4d4b76a80a0dbed7577f" + integrity sha512-37gYfrYjjhEfk37C4bCMWAC0oPBxDpG0qpl8lYg8BT//wf353YT/fzgA7+Dq0EtM7rPFS3JEcMsxdtDwNMi2cA== + dependencies: + "@jest/types" "^27.0.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^27.0.1" + jest-serializer "^27.0.1" + jest-util "^27.0.2" + jest-worker "^27.0.2" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.0.4.tgz#c669519ccf4904a485338555e1e66cad36bb0670" + integrity sha512-yj3WrjjquZwkJw+eA4c9yucHw4/+EHndHWSqgHbHGQfT94ihaaQsa009j1a0puU8CNxPDk0c1oAPeOpdJUElwA== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.0.3" + "@jest/source-map" "^27.0.1" + "@jest/test-result" "^27.0.2" + "@jest/types" "^27.0.2" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^26.6.2" + expect "^27.0.2" is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" - -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== - dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + jest-each "^27.0.2" + jest-matcher-utils "^27.0.2" + jest-message-util "^27.0.2" + jest-runtime "^27.0.4" + jest-snapshot "^27.0.4" + jest-util "^27.0.2" + pretty-format "^27.0.2" + throat "^6.0.1" + +jest-leak-detector@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.0.2.tgz#ce19aa9dbcf7a72a9d58907a970427506f624e69" + integrity sha512-TZA3DmCOfe8YZFIMD1GxFqXUkQnIoOGQyy4hFCA2mlHtnAaf+FeOMxi0fZmfB41ZL+QbFG6BVaZF5IeFIVy53Q== + dependencies: + jest-get-type "^27.0.1" + pretty-format "^27.0.2" + +jest-matcher-utils@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz#f14c060605a95a466cdc759acc546c6f4cbfc4f0" + integrity sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA== dependencies: chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + jest-diff "^27.0.2" + jest-get-type "^27.0.1" + pretty-format "^27.0.2" -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== +jest-message-util@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.0.2.tgz#181c9b67dff504d8f4ad15cba10d8b80f272048c" + integrity sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw== dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.0.2" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" + micromatch "^4.0.4" + pretty-format "^27.0.2" slash "^3.0.0" - stack-utils "^2.0.2" + stack-utils "^2.0.3" -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== +jest-mock@^27.0.3: + version "27.0.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.0.3.tgz#5591844f9192b3335c0dca38e8e45ed297d4d23d" + integrity sha512-O5FZn5XDzEp+Xg28mUz4ovVcdwBBPfAhW9+zJLO0Efn2qNbYcDaJvSlRiQ6BCZUCVOJjALicuJQI9mRFjv1o9Q== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.0.2" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -8888,87 +9020,94 @@ jest-regex-util@^26.0.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== +jest-regex-util@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.1.tgz#69d4b1bf5b690faa3490113c47486ed85dd45b68" + integrity sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ== + +jest-resolve-dependencies@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.4.tgz#a07a242d70d668afd3fcf7f4270755eebb1fe579" + integrity sha512-F33UPfw1YGWCV2uxJl7wD6TvcQn5IC0LtguwY3r4L7R6H4twpLkp5Q2ZfzRx9A2I3G8feiy0O0sqcn/Qoym71A== dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" + "@jest/types" "^27.0.2" + jest-regex-util "^27.0.1" + jest-snapshot "^27.0.4" -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== +jest-resolve@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.0.4.tgz#8a27bc3f2f00c8ea28f3bc99bbf6f468300a703d" + integrity sha512-BcfyK2i3cG79PDb/6gB6zFeFQlcqLsQjGBqznFCpA0L/3l1L/oOsltdUjs5eISAWA9HS9qtj8v2PSZr/yWxONQ== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.0.2" chalk "^4.0.0" + escalade "^3.1.1" graceful-fs "^4.2.4" jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" + jest-util "^27.0.2" + jest-validate "^27.0.2" + resolve "^1.20.0" slash "^3.0.0" -jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== +jest-runner@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.0.4.tgz#2787170a9509b792ae129794f6944d27d5d12a4f" + integrity sha512-NfmvSYLCsCJk2AG8Ar2NAh4PhsJJpO+/r+g4bKR5L/5jFzx/indUpnVBdrfDvuqhGLLAvrKJ9FM/Nt8o1dsqxg== dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.0.2" + "@jest/environment" "^27.0.3" + "@jest/test-result" "^27.0.2" + "@jest/transform" "^27.0.2" + "@jest/types" "^27.0.2" "@types/node" "*" chalk "^4.0.0" - emittery "^0.7.1" + emittery "^0.8.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" + jest-docblock "^27.0.1" + jest-environment-jsdom "^27.0.3" + jest-environment-node "^27.0.3" + jest-haste-map "^27.0.2" + jest-leak-detector "^27.0.2" + jest-message-util "^27.0.2" + jest-resolve "^27.0.4" + jest-runtime "^27.0.4" + jest-util "^27.0.2" + jest-worker "^27.0.2" source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" + throat "^6.0.1" + +jest-runtime@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.0.4.tgz#2e4a6aa77cac32ac612dfe12768387a8aa15c2f0" + integrity sha512-voJB4xbAjS/qYPboV+e+gmg3jfvHJJY4CagFWBOM9dQKtlaiTjcpD2tWwla84Z7PtXSQPeIpXY0qksA9Dum29A== + dependencies: + "@jest/console" "^27.0.2" + "@jest/environment" "^27.0.3" + "@jest/fake-timers" "^27.0.3" + "@jest/globals" "^27.0.3" + "@jest/source-map" "^27.0.1" + "@jest/test-result" "^27.0.2" + "@jest/transform" "^27.0.2" + "@jest/types" "^27.0.2" + "@types/yargs" "^16.0.0" chalk "^4.0.0" - cjs-module-lexer "^0.6.0" + cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-haste-map "^27.0.2" + jest-message-util "^27.0.2" + jest-mock "^27.0.3" + jest-regex-util "^27.0.1" + jest-resolve "^27.0.4" + jest-snapshot "^27.0.4" + jest-util "^27.0.2" + jest-validate "^27.0.2" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.4.1" + yargs "^16.0.3" jest-serializer@^26.6.2: version "26.6.2" @@ -8978,29 +9117,45 @@ jest-serializer@^26.6.2: "@types/node" "*" graceful-fs "^4.2.4" -jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== +jest-serializer@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.1.tgz#2464d04dcc33fb71dc80b7c82e3c5e8a08cb1020" + integrity sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.0.4.tgz#2b96e22ca90382b3e93bd0aae2ce4c78bf51fb5b" + integrity sha512-hnjrvpKGdSMvKfbHyaG5Kul7pDJGZvjVy0CKpzhu28MmAssDXS6GpynhXzgst1wBQoKD8c9b2VS2a5yhDLQRCA== dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/parser" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" + "@jest/transform" "^27.0.2" + "@jest/types" "^27.0.2" "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^26.6.2" + expect "^27.0.2" graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" + jest-diff "^27.0.2" + jest-get-type "^27.0.1" + jest-haste-map "^27.0.2" + jest-matcher-utils "^27.0.2" + jest-message-util "^27.0.2" + jest-resolve "^27.0.4" + jest-util "^27.0.2" natural-compare "^1.4.0" - pretty-format "^26.6.2" + pretty-format "^27.0.2" semver "^7.3.2" -jest-util@^26.1.0, jest-util@^26.6.2: +jest-util@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== @@ -9012,29 +9167,41 @@ jest-util@^26.1.0, jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== +jest-util@^27.0.0, jest-util@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.0.2.tgz#fc2c7ace3c75ae561cf1e5fdb643bf685a5be7c7" + integrity sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA== dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" + "@jest/types" "^27.0.2" + "@types/node" "*" chalk "^4.0.0" - jest-get-type "^26.3.0" + graceful-fs "^4.2.4" + is-ci "^3.0.0" + picomatch "^2.2.3" + +jest-validate@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.0.2.tgz#7fe2c100089449cd5cbb47a5b0b6cb7cda5beee5" + integrity sha512-UgBF6/oVu1ofd1XbaSotXKihi8nZhg0Prm8twQ9uCuAfo59vlxCXMPI/RKmrZEVgi3Nd9dS0I8A0wzWU48pOvg== + dependencies: + "@jest/types" "^27.0.2" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.0.1" leven "^3.1.0" - pretty-format "^26.6.2" + pretty-format "^27.0.2" -jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== +jest-watcher@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.0.2.tgz#dab5f9443e2d7f52597186480731a8c6335c5deb" + integrity sha512-8nuf0PGuTxWj/Ytfw5fyvNn/R80iXY8QhIT0ofyImUvdnoaBdT6kob0GmhXR+wO+ALYVnh8bQxN4Tjfez0JgkA== dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/test-result" "^27.0.2" + "@jest/types" "^27.0.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.6.2" + jest-util "^27.0.2" string-length "^4.0.1" jest-worker@^25.4.0: @@ -9054,14 +9221,23 @@ jest-worker@^26.2.1, jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" -jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" - integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== +jest-worker@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.2.tgz#4ebeb56cef48b3e7514552f80d0d80c0129f0b05" + integrity sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.0.4: + version "27.0.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.0.4.tgz#91d4d564b36bcf93b98dac1ab19f07089e670f53" + integrity sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA== dependencies: - "@jest/core" "^26.6.3" + "@jest/core" "^27.0.4" import-local "^3.0.2" - jest-cli "^26.6.3" + jest-cli "^27.0.4" js-string-escape@^1.0.1: version "1.0.1" @@ -9135,7 +9311,7 @@ jscodeshift@^0.7.0: temp "^0.8.1" write-file-atomic "^2.3.0" -jsdom@^16.4.0: +jsdom@^16.6.0: version "16.6.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== @@ -10244,18 +10420,6 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-notifier@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - node-releases@^1.1.29, node-releases@^1.1.61, node-releases@^1.1.71: version "1.1.72" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" @@ -10325,7 +10489,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -10483,7 +10647,7 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -11207,6 +11371,16 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" +pretty-format@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.2.tgz#9283ff8c4f581b186b2d4da461617143dca478a4" + integrity sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig== + dependencies: + "@jest/types" "^27.0.2" + ansi-regex "^5.0.0" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -11869,7 +12043,7 @@ react-popper@^1.3.7: typed-styles "^0.0.7" warning "^4.0.2" -react-popper@^2.2.4: +react-popper@^2.2.4, react-popper@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== @@ -12317,11 +12491,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -12366,7 +12535,7 @@ resolve@1.12.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -12690,7 +12859,7 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -12788,11 +12957,6 @@ shelljs@^0.8.3, shelljs@^0.8.4: interpret "^1.0.0" rechoir "^0.6.2" -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -12802,7 +12966,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -13060,7 +13224,7 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-utils@^2.0.2: +stack-utils@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== @@ -13454,6 +13618,13 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-hyperlinks@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" @@ -13662,10 +13833,10 @@ text-table@0.2.0, text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== throttle-debounce@^2.1.0: version "2.3.0" @@ -13827,15 +13998,15 @@ ts-essentials@^2.0.3: resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w== -ts-jest@^26.3.0: - version "26.5.6" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35" - integrity sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA== +ts-jest@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.2.tgz#acc1525d5fd25c107c777c3b80a11365db579aa1" + integrity sha512-pozjHOOfm+sbv9kXCvTFVyDntWvuJztzkNFql/akD75hSMZ2jsbidVauOhBRImAopXohqcLtPK/NTTIS8Y49Ug== dependencies: bs-logger "0.x" buffer-from "1.x" fast-json-stable-stringify "2.x" - jest-util "^26.1.0" + jest-util "^27.0.0" json5 "2.x" lodash "4.x" make-error "1.x" @@ -14330,7 +14501,7 @@ uuid@^3.1.0, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0, uuid@^8.3.0: +uuid@^8.0.0: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -14580,11 +14751,6 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - which-pm-runs@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" @@ -14597,7 +14763,7 @@ which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@^2.0.1, which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -14741,32 +14907,7 @@ yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20. resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^16.2.0: +yargs@^16.0.3, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==