diff --git a/core/dev-test/config.yml b/core/dev-test/config.yml index bbcb5b6a..81750a9c 100644 --- a/core/dev-test/config.yml +++ b/core/dev-test/config.yml @@ -56,7 +56,7 @@ collections: required: false - label: Body name: body - widget: markdown + widget: mdx hint: Main content goes here. - name: faq label: FAQ diff --git a/core/jest.config.js b/core/jest.config.js index f41e3297..cfe5c43b 100644 --- a/core/jest.config.js +++ b/core/jest.config.js @@ -14,4 +14,5 @@ module.exports = { }, setupFiles: ['./test/setupEnv.js'], testRegex: '\\.spec\\.tsx?$', + snapshotSerializers: ['@emotion/jest/serializer'], }; diff --git a/core/package.json b/core/package.json index d5cead39..8d2cac8e 100644 --- a/core/package.json +++ b/core/package.json @@ -176,8 +176,11 @@ "@babel/preset-react": "7.18.6", "@babel/preset-typescript": "7.18.6", "@emotion/eslint-plugin": "11.10.0", + "@emotion/jest": "11.10.5", "@pmmmwh/react-refresh-webpack-plugin": "0.5.10", "@simbathesailor/use-what-changed": "2.0.0", + "@testing-library/jest-dom": "5.16.5", + "@testing-library/react": "13.4.0", "@types/common-tags": "1.8.1", "@types/create-react-class": "15.6.3", "@types/fs-extra": "9.0.13", @@ -230,6 +233,7 @@ "gitlab": "14.2.2", "http-server": "14.1.1", "jest": "29.3.1", + "jest-environment-jsdom": "29.3.1", "js-yaml": "4.1.0", "mockserver-client": "5.14.0", "mockserver-node": "5.14.0", diff --git a/core/src/__mocks__/@ltd/j-toml.ts b/core/src/__mocks__/@ltd/j-toml.ts new file mode 100644 index 00000000..ff8b4c56 --- /dev/null +++ b/core/src/__mocks__/@ltd/j-toml.ts @@ -0,0 +1 @@ +export default {}; diff --git a/core/src/__mocks__/@staticcms/core/store/hooks.ts b/core/src/__mocks__/@staticcms/core/store/hooks.ts new file mode 100644 index 00000000..5a3ed89c --- /dev/null +++ b/core/src/__mocks__/@staticcms/core/store/hooks.ts @@ -0,0 +1,4 @@ +/* eslint-disable import/prefer-default-export */ +const mockDisplatch = jest.fn(); +export const useAppDispatch = jest.fn().mockReturnValue(mockDisplatch); +export const useAppSelector = jest.fn(); diff --git a/core/src/__mocks__/@udecode/plate-core.ts b/core/src/__mocks__/@udecode/plate-core.ts new file mode 100644 index 00000000..dd400daa --- /dev/null +++ b/core/src/__mocks__/@udecode/plate-core.ts @@ -0,0 +1,2 @@ +export const someNode = jest.fn(); +export const toggleNodeType = jest.fn(); diff --git a/core/src/__mocks__/@udecode/plate.ts b/core/src/__mocks__/@udecode/plate.ts index 000e5e11..900b3087 100644 --- a/core/src/__mocks__/@udecode/plate.ts +++ b/core/src/__mocks__/@udecode/plate.ts @@ -40,4 +40,28 @@ export { ELEMENT_UL, }; +export const createPlateEditor = jest.fn(); +export const createPluginFactory = jest.fn(); +export const createPlugins = jest.fn(); +export const createTEditor = jest.fn(); +export const getTEditor = jest.fn(); +export const useEditorRef = jest.fn(); +export const useEditorState = jest.fn(); +export const usePlateActions = jest.fn(); +export const usePlateEditorRef = jest.fn(); +export const usePlateEditorState = jest.fn(); +export const usePlateSelectors = jest.fn(); +export const usePlateStates = jest.fn(); +export const findNodePath = jest.fn(); +export const getNode = jest.fn(); +export const getParentNode = jest.fn(); +export const getSelectionBoundingClientRect = jest.fn(); +export const getSelectionText = jest.fn(); +export const isElement = jest.fn(); +export const isElementEmpty = jest.fn(); +export const isSelectionExpanded = jest.fn(); +export const isText = jest.fn(); +export const someNode = jest.fn(); +export const usePlateSelection = jest.fn(); + export default {}; diff --git a/core/src/__mocks__/copy-text-to-clipboard.ts b/core/src/__mocks__/copy-text-to-clipboard.ts deleted file mode 100644 index 0bb2acf5..00000000 --- a/core/src/__mocks__/copy-text-to-clipboard.ts +++ /dev/null @@ -1 +0,0 @@ -export default jest.fn(); diff --git a/core/src/__mocks__/slate-react.ts b/core/src/__mocks__/slate-react.ts new file mode 100644 index 00000000..a90bad1d --- /dev/null +++ b/core/src/__mocks__/slate-react.ts @@ -0,0 +1,2 @@ +/* eslint-disable import/prefer-default-export */ +export const useFocused = jest.fn(); diff --git a/core/src/__mocks__/url-join.ts b/core/src/__mocks__/url-join.ts new file mode 100644 index 00000000..418f35bc --- /dev/null +++ b/core/src/__mocks__/url-join.ts @@ -0,0 +1,3 @@ +export default function cleanStack(parts: string[]) { + return parts.join('/'); +} diff --git a/core/src/__mocks__/yaml.ts b/core/src/__mocks__/yaml.ts new file mode 100644 index 00000000..01c21d17 --- /dev/null +++ b/core/src/__mocks__/yaml.ts @@ -0,0 +1,4 @@ +export const isNode = jest.fn(); +export const isMap = jest.fn(); + +export default {}; diff --git a/core/src/formats/__tests__/YamlFormatter.spec.ts b/core/src/formats/__tests__/YamlFormatter.spec.ts index 2ba22ede..ea756282 100644 --- a/core/src/formats/__tests__/YamlFormatter.spec.ts +++ b/core/src/formats/__tests__/YamlFormatter.spec.ts @@ -1,5 +1,7 @@ import yamlFormatter from '../YamlFormatter'; +jest.unmock('yaml'); + const json = { keyF: 'valueF', keyA: 'valueA', diff --git a/core/src/widgets/markdown/plate/components/balloon-toolbar/BalloonToolbar.tsx b/core/src/widgets/markdown/plate/components/balloon-toolbar/BalloonToolbar.tsx index 64fe7ee2..610993f2 100644 --- a/core/src/widgets/markdown/plate/components/balloon-toolbar/BalloonToolbar.tsx +++ b/core/src/widgets/markdown/plate/components/balloon-toolbar/BalloonToolbar.tsx @@ -16,17 +16,18 @@ import { someNode, usePlateSelection, } from '@udecode/plate'; -import { useFocused } from 'slate-react'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useFocused } from 'slate-react'; import useDebounce from '@staticcms/core/lib/hooks/useDebounce'; import { isEmpty } from '@staticcms/core/lib/util/string.util'; -import { useMdPlateEditorState, VOID_ELEMENTS } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; +import { VOID_ELEMENTS } from '../../serialization/slate/ast-types'; import BasicElementToolbarButtons from '../buttons/BasicElementToolbarButtons'; import BasicMarkToolbarButtons from '../buttons/BasicMarkToolbarButtons'; import MediaToolbarButtons from '../buttons/MediaToolbarButtons'; -import TableToolbarButtons from '../buttons/TableToolbarButtons'; import ShortcodeToolbarButton from '../buttons/ShortcodeToolbarButton'; +import TableToolbarButtons from '../buttons/TableToolbarButtons'; import type { Collection, Entry, MarkdownField } from '@staticcms/core/interface'; import type { ClientRectObject } from '@udecode/plate'; @@ -76,6 +77,13 @@ const BalloonToolbar: FC = ({ const [hasFocus, setHasFocus] = useState(false); const debouncedHasFocus = useDebounce(hasFocus, 150); + const [childFocusState, setChildFocusState] = useState>({}); + const childHasFocus = useMemo( + () => Object.keys(childFocusState).reduce((acc, value) => acc || childFocusState[value], false), + [childFocusState], + ); + const debouncedChildHasFocus = useDebounce(hasFocus, 150); + const handleFocus = useCallback(() => { setHasFocus(true); }, []); @@ -84,6 +92,26 @@ const BalloonToolbar: FC = ({ setHasFocus(false); }, []); + const handleChildFocus = useCallback( + (key: string) => () => { + setChildFocusState(oldState => ({ + ...oldState, + [key]: true, + })); + }, + [], + ); + + const handleChildBlur = useCallback( + (key: string) => () => { + setChildFocusState(oldState => ({ + ...oldState, + [key]: false, + })); + }, + [], + ); + const anchorEl = useRef(); const [selectionBoundingClientRect, setSelectionBoundingClientRect] = useState(null); @@ -102,8 +130,8 @@ const BalloonToolbar: FC = ({ const node = getNode(editor, editor.selection?.anchor.path ?? []); useEffect(() => { - if (!editor) { - return undefined; + if (!editor || !hasEditorFocus) { + return; } setTimeout(() => { @@ -121,7 +149,14 @@ const BalloonToolbar: FC = ({ const debouncedEditorFocus = useDebounce(hasEditorFocus, 150); const groups: ReactNode[] = useMemo(() => { - if (!mediaOpen && !debouncedEditorFocus && !hasFocus && !debouncedHasFocus) { + if ( + !mediaOpen && + !debouncedEditorFocus && + !hasFocus && + !debouncedHasFocus && + !debouncedChildHasFocus && + !childHasFocus + ) { return []; } @@ -146,7 +181,9 @@ const BalloonToolbar: FC = ({ field={field} entry={entry} onMediaToggle={setMediaOpen} - hideUploads + hideImages + handleChildFocus={handleChildFocus} + handleChildBlur={handleChildBlur} />, ].filter(Boolean); } @@ -183,9 +220,11 @@ const BalloonToolbar: FC = ({ field={field} entry={entry} onMediaToggle={setMediaOpen} + handleChildFocus={handleChildFocus} + handleChildBlur={handleChildBlur} />, !useMdx ? : null, - ]; + ].filter(Boolean); } } @@ -240,7 +279,7 @@ const BalloonToolbar: FC = ({ }} /> = ({ useMdx = false }) => { + const ref = useRef(null); + + return ( +
+ +
+ ); +}; + +describe(BalloonToolbar.name, () => { + const mockUseEditor = usePlateEditorState as jest.Mock; + let mockEditor: MdEditor; + + const mockGetNode = getNode as jest.Mock; + const mockIsElement = isElement as unknown as jest.Mock; + const mockIsElementEmpty = isElementEmpty as jest.Mock; + const mockSomeNode = someNode as jest.Mock; + const mockUseFocused = useFocused as jest.Mock; + const mockFindNodePath = findNodePath as jest.Mock; + const mockGetParentNode = getParentNode as jest.Mock; + + beforeEach(() => { + entry = { + collection: 'posts', + slug: '2022-12-13-post-number-1', + path: '_posts/2022-12-13-post-number-1.md', + partial: false, + raw: '--- title: "This is post # 1" draft: false date: 2022-12-13T00:00:00.000Z --- # The post is number 1\n\nAnd some text', + label: '', + author: '', + mediaFiles: [], + isModification: null, + newRecord: false, + updatedOn: '', + data: { + title: 'This is post # 1', + draft: false, + date: '2022-12-13T00:00:00.000Z', + body: '# The post is number 1\n\nAnd some text', + }, + }; + + mockEditor = { + selection: undefined, + } as unknown as MdEditor; + + mockUseEditor.mockReturnValue(mockEditor); + }); + + it('renders empty div by default', () => { + render(); + expect(screen.queryAllByRole('button').length).toBe(0); + }); + + describe('empty node toolbar', () => { + interface EmptyNodeToolbarSetupOptions { + useMdx?: boolean; + } + + const emptyNodeToolbarSetup = ({ useMdx }: EmptyNodeToolbarSetupOptions = {}) => { + mockEditor = { + selection: undefined, + children: [ + { + type: 'p', + children: [{ text: '' }], + }, + { + type: 'p', + children: [{ text: '' }], + }, + ], + } as unknown as MdEditor; + + mockUseEditor.mockReturnValue(mockEditor); + + mockGetNode.mockReturnValue({ text: '' }); + mockIsElement.mockReturnValue(true); + mockIsElementEmpty.mockReturnValue(true); + mockSomeNode.mockReturnValue(false); + mockUseFocused.mockReturnValue(true); + + mockFindNodePath.mockReturnValue([1, 0]); + mockGetParentNode.mockReturnValue([ + { + type: 'p', + children: [{ text: '' }], + }, + ]); + + const { rerender } = render(); + + rerender(); + }; + + it('renders empty node toolbar for markdown', () => { + emptyNodeToolbarSetup(); + + expect(screen.queryByTestId('toolbar-button-bold')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-italic')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-code')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-strikethrough')).toBeInTheDocument(); + + expect(screen.queryByTestId('toolbar-button-blockquote')).toBeInTheDocument(); + expect(screen.queryByTestId('font-type-select')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-add-table')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-insert-link')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-insert-image')).toBeInTheDocument(); + + // MDX Only do not show for markdown version + expect(screen.queryByTestId('toolbar-button-underline')).not.toBeInTheDocument(); + }); + + it('renders empty node toolbar for mdx', () => { + emptyNodeToolbarSetup({ useMdx: true }); + + expect(screen.queryByTestId('toolbar-button-bold')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-italic')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-code')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-strikethrough')).toBeInTheDocument(); + + expect(screen.queryByTestId('toolbar-button-blockquote')).toBeInTheDocument(); + expect(screen.queryByTestId('font-type-select')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-add-table')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-insert-link')).toBeInTheDocument(); + expect(screen.queryByTestId('toolbar-button-insert-image')).toBeInTheDocument(); + + expect(screen.queryByTestId('toolbar-button-underline')).toBeInTheDocument(); + }); + }); +}); diff --git a/core/src/widgets/markdown/plate/components/buttons/FontTypeSelect.tsx b/core/src/widgets/markdown/plate/components/buttons/FontTypeSelect.tsx index 4692a71d..5b09852a 100644 --- a/core/src/widgets/markdown/plate/components/buttons/FontTypeSelect.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/FontTypeSelect.tsx @@ -16,7 +16,7 @@ import { someNode, toggleNodeType } from '@udecode/plate-core'; import React, { useCallback, useMemo, useState } from 'react'; import useDebounce from '@staticcms/core/lib/hooks/useDebounce'; -import { useMdPlateEditorState } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import type { SelectChangeEvent } from '@mui/material/Select'; import type { FC } from 'react'; @@ -107,6 +107,7 @@ const FontTypeSelect: FC = ({ disabled = false }) => { ; field: MarkdownField; entry: Entry; inserting?: boolean; onMediaToggle?: (open: boolean) => void; + handleChildFocus?: (key: string) => () => void; + handleChildBlur?: (key: string) => () => void; } const MediaToolbarButtons: FC = ({ @@ -23,8 +25,10 @@ const MediaToolbarButtons: FC = ({ collection, field, entry, - hideUploads = false, + hideImages = false, onMediaToggle, + handleChildFocus, + handleChildBlur, }) => { const [open, setOpen] = useState(false); const [linkMediaOpen, setLinkMediaOpen] = useState(false); @@ -56,8 +60,10 @@ const MediaToolbarButtons: FC = ({ entry={entry} mediaOpen={linkMediaOpen} onMediaToggle={setLinkMediaOpen} + onFocus={handleChildFocus?.('link')} + onBlur={handleChildBlur?.('link')} /> - {!hideUploads ? ( + {!hideImages ? ( = ({ entry={entry} mediaOpen={imageMediaOpen} onMediaToggle={setImageMediaOpen} + onFocus={handleChildFocus?.('image')} + onBlur={handleChildBlur?.('image')} /> ) : null} diff --git a/core/src/widgets/markdown/plate/components/buttons/ShortcodeToolbarButton.tsx b/core/src/widgets/markdown/plate/components/buttons/ShortcodeToolbarButton.tsx index 881ecd8c..bf5e207d 100644 --- a/core/src/widgets/markdown/plate/components/buttons/ShortcodeToolbarButton.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/ShortcodeToolbarButton.tsx @@ -6,7 +6,7 @@ import React, { useCallback, useMemo, useState } from 'react'; import { getShortcodes } from '../../../../../lib/registry'; import { toTitleCase } from '../../../../../lib/util/string.util'; -import { ELEMENT_SHORTCODE, useMdPlateEditorState } from '../../plateTypes'; +import { ELEMENT_SHORTCODE, useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import ToolbarButton from './common/ToolbarButton'; import type { FC, MouseEvent } from 'react'; diff --git a/core/src/widgets/markdown/plate/components/buttons/common/AlignToolbarButton.tsx b/core/src/widgets/markdown/plate/components/buttons/common/AlignToolbarButton.tsx index 0ad962a6..fcc8981c 100644 --- a/core/src/widgets/markdown/plate/components/buttons/common/AlignToolbarButton.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/common/AlignToolbarButton.tsx @@ -1,7 +1,7 @@ import { isCollapsed, KEY_ALIGN, setAlign, someNode } from '@udecode/plate'; import React, { useCallback } from 'react'; -import { useMdPlateEditorState } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import ToolbarButton from './ToolbarButton'; import type { MdEditor } from '@staticcms/markdown'; diff --git a/core/src/widgets/markdown/plate/components/buttons/common/BlockToolbarButton.tsx b/core/src/widgets/markdown/plate/components/buttons/common/BlockToolbarButton.tsx index 7bfbd5e1..b74b31f2 100644 --- a/core/src/widgets/markdown/plate/components/buttons/common/BlockToolbarButton.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/common/BlockToolbarButton.tsx @@ -1,7 +1,7 @@ import { someNode, toggleNodeType } from '@udecode/plate'; import React, { useCallback } from 'react'; -import { useMdPlateEditorState } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import ToolbarButton from './ToolbarButton'; import type { MdEditor } from '@staticcms/markdown'; diff --git a/core/src/widgets/markdown/plate/components/buttons/common/ColorPickerToolbarDropdown.tsx b/core/src/widgets/markdown/plate/components/buttons/common/ColorPickerToolbarDropdown.tsx index ec222f9a..4441a715 100644 --- a/core/src/widgets/markdown/plate/components/buttons/common/ColorPickerToolbarDropdown.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/common/ColorPickerToolbarDropdown.tsx @@ -10,7 +10,7 @@ import React, { useCallback, useEffect, useState } from 'react'; import { Transforms } from 'slate'; import { ReactEditor } from 'slate-react'; -import { useMdPlateEditorState } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import ColorPicker from '../../color-picker/ColorPicker'; import ToolbarDropdown from './dropdown/ToolbarDropdown'; diff --git a/core/src/widgets/markdown/plate/components/buttons/common/ImageToolbarButton.tsx b/core/src/widgets/markdown/plate/components/buttons/common/ImageToolbarButton.tsx index dd983aeb..4038d908 100644 --- a/core/src/widgets/markdown/plate/components/buttons/common/ImageToolbarButton.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/common/ImageToolbarButton.tsx @@ -2,7 +2,7 @@ import { insertImage } from '@udecode/plate'; import React, { useCallback } from 'react'; import { isNotEmpty } from '@staticcms/core/lib/util/string.util'; -import { useMdPlateEditorState } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import MediaToolbarButton from './MediaToolbarButton'; import type { FC } from 'react'; diff --git a/core/src/widgets/markdown/plate/components/buttons/common/LinkToolbarButton.tsx b/core/src/widgets/markdown/plate/components/buttons/common/LinkToolbarButton.tsx index caf2f384..58cb68be 100644 --- a/core/src/widgets/markdown/plate/components/buttons/common/LinkToolbarButton.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/common/LinkToolbarButton.tsx @@ -2,7 +2,7 @@ import { ELEMENT_LINK, insertLink, someNode } from '@udecode/plate'; import React, { useCallback } from 'react'; import { isNotEmpty } from '@staticcms/core/lib/util/string.util'; -import { useMdPlateEditorState } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import MediaToolbarButton from './MediaToolbarButton'; import type { FC } from 'react'; @@ -12,10 +12,10 @@ const LinkToolbarButton: FC> = props = const editor = useMdPlateEditorState(); const handleInsert = useCallback( (newUrl: string, newText: string | undefined) => { - if (isNotEmpty(newUrl) && isNotEmpty(newText)) { + if (isNotEmpty(newUrl)) { insertLink( editor, - { url: newUrl, text: newText }, + { url: newUrl, text: isNotEmpty(newText) ? newText : newUrl }, { at: editor.selection ?? editor.prevSelection! }, ); } diff --git a/core/src/widgets/markdown/plate/components/buttons/common/ListToolbarButton.tsx b/core/src/widgets/markdown/plate/components/buttons/common/ListToolbarButton.tsx index e2dbd6e6..9759b80a 100644 --- a/core/src/widgets/markdown/plate/components/buttons/common/ListToolbarButton.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/common/ListToolbarButton.tsx @@ -1,7 +1,7 @@ import { getListItemEntry, toggleList } from '@udecode/plate-list'; import React, { useCallback } from 'react'; -import { useMdPlateEditorState } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import ToolbarButton from './ToolbarButton'; import type { MdEditor } from '@staticcms/markdown'; diff --git a/core/src/widgets/markdown/plate/components/buttons/common/MarkToolbarButton.tsx b/core/src/widgets/markdown/plate/components/buttons/common/MarkToolbarButton.tsx index a237c75a..624704ea 100644 --- a/core/src/widgets/markdown/plate/components/buttons/common/MarkToolbarButton.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/common/MarkToolbarButton.tsx @@ -1,7 +1,7 @@ import { isMarkActive, toggleMark } from '@udecode/plate'; import React, { useCallback } from 'react'; -import { useMdPlateEditorState } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import ToolbarButton from './ToolbarButton'; import type { MdEditor } from '@staticcms/markdown'; diff --git a/core/src/widgets/markdown/plate/components/buttons/common/MediaToolbarButton.tsx b/core/src/widgets/markdown/plate/components/buttons/common/MediaToolbarButton.tsx index 677357a2..c70180ee 100644 --- a/core/src/widgets/markdown/plate/components/buttons/common/MediaToolbarButton.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/common/MediaToolbarButton.tsx @@ -1,10 +1,9 @@ import { focusEditor } from '@udecode/plate-core'; import React, { useCallback, useEffect, useState } from 'react'; -import { useFocused } from 'slate-react'; -import { MediaPopover, useMdPlateEditorState } from '@staticcms/markdown'; +import MediaPopover from '../../common/MediaPopover'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import ToolbarButton from './ToolbarButton'; -import useDebounce from '@staticcms/core/lib/hooks/useDebounce'; import type { MarkdownField } from '@staticcms/core/interface'; import type { MdEditor, MediaPopoverProps } from '@staticcms/markdown'; @@ -21,6 +20,8 @@ export interface MediaToolbarButtonProps mediaOpen: boolean; onMediaToggle: (open: boolean) => void; onChange: (newUrl: string, newText: string | undefined) => void; + onFocus?: () => void; + onBlur?: () => void; } const MediaToolbarButton: FC = ({ @@ -34,23 +35,18 @@ const MediaToolbarButton: FC = ({ mediaOpen, onMediaToggle, onChange, + onFocus, + onBlur, ...props }) => { const editor = useMdPlateEditorState(); const [anchorEl, setAnchorEl] = useState(null); - if (forImage) { - console.log('anchorEl', anchorEl); - } - const [internalUrl, setInternalUrl] = useState(''); const [internalText, setInternalText] = useState(''); const handleClose = useCallback( (newValue: string | undefined, shouldFocus: boolean) => { - if (forImage) { - console.log('handleClose', newValue, shouldFocus); - } setAnchorEl(null); setInternalUrl(''); setInternalText(''); @@ -72,9 +68,6 @@ const MediaToolbarButton: FC = ({ return; } - if (forImage) { - console.log('handleOnClick'); - } setAnchorEl(event.currentTarget); }, [anchorEl, handleClose], @@ -94,13 +87,12 @@ const MediaToolbarButton: FC = ({ [handleClose], ); - const editorHasFocus = useFocused(); - const debouncedEditorHasFocus = useDebounce(editorHasFocus, 150); useEffect(() => { - if (!editorHasFocus && !debouncedEditorHasFocus) { + if (anchorEl && !mediaOpen) { handleClose(undefined, false); } - }, [debouncedEditorHasFocus, editorHasFocus, handleClose]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [mediaOpen]); return ( <> @@ -122,6 +114,8 @@ const MediaToolbarButton: FC = ({ onMediaToggle={onMediaToggle} onMediaChange={handleMediaChange} onClose={handlePopoverClose} + onFocus={onFocus} + onBlur={onBlur} /> ); diff --git a/core/src/widgets/markdown/plate/components/buttons/common/ToolbarButton.tsx b/core/src/widgets/markdown/plate/components/buttons/common/ToolbarButton.tsx index 05e6b3ab..fde37385 100644 --- a/core/src/widgets/markdown/plate/components/buttons/common/ToolbarButton.tsx +++ b/core/src/widgets/markdown/plate/components/buttons/common/ToolbarButton.tsx @@ -4,7 +4,7 @@ import Tooltip from '@mui/material/Tooltip'; import { focusEditor } from '@udecode/plate'; import React, { useCallback } from 'react'; -import { useMdPlateEditorState } from '@staticcms/markdown'; +import { useMdPlateEditorState } from '@staticcms/markdown/plate/plateTypes'; import type { MdEditor } from '@staticcms/markdown'; import type { FC, MouseEvent, ReactNode } from 'react'; @@ -56,6 +56,7 @@ const ToolbarButton: FC = ({ aria-label={label ?? tooltip} size="small" color="inherit" + data-testid={`toolbar-button-${label ?? tooltip}`.replace(' ', '-').toLowerCase()} sx={{ padding: '2px', minWidth: 'unset', diff --git a/core/src/widgets/markdown/plate/components/nodes/common/MediaPopover.tsx b/core/src/widgets/markdown/plate/components/common/MediaPopover.tsx similarity index 88% rename from core/src/widgets/markdown/plate/components/nodes/common/MediaPopover.tsx rename to core/src/widgets/markdown/plate/components/common/MediaPopover.tsx index ef0789fb..49ba764e 100644 --- a/core/src/widgets/markdown/plate/components/nodes/common/MediaPopover.tsx +++ b/core/src/widgets/markdown/plate/components/common/MediaPopover.tsx @@ -20,7 +20,7 @@ const StyledPopperContent = styled('div')( gap: 4px; background: ${theme.palette.background.paper}; box-shadow: ${theme.shadows[8]}; - margin-bottom: 10px; + margin: 10px 0; padding: 6px; border-radius: 4px; align-items: center; @@ -69,6 +69,8 @@ export interface MediaPopoverProps { onMediaToggle?: (open: boolean) => void; onMediaChange: (newValue: string) => void; onRemove?: () => void; + onFocus?: () => void; + onBlur?: () => void; } const MediaPopover = ({ @@ -89,6 +91,8 @@ const MediaPopover = ({ onMediaToggle, onMediaChange, onRemove, + onFocus, + onBlur, }: MediaPopoverProps) => { const theme = useTheme(); const buttonRef = useRef(null); @@ -98,7 +102,6 @@ const MediaPopover = ({ const [editing, setEditing] = useState(inserting); const hasEditorFocus = useFocused(); - const debouncedHasEditorFocus = useDebounce(hasEditorFocus, 150); const [hasFocus, setHasFocus] = useState(false); const debouncedHasFocus = useDebounce(hasFocus, 150); @@ -152,34 +155,62 @@ const MediaPopover = ({ } }, [anchorEl, editing, inserting, urlDisabled]); + const [ + { prevAnchorEl, prevHasEditorFocus, prevHasFocus, prevDebouncedHasFocus }, + setPrevFocusState, + ] = useState<{ + prevAnchorEl: HTMLElement | null; + prevHasEditorFocus: boolean; + prevHasFocus: boolean; + prevDebouncedHasFocus: boolean; + }>({ + prevAnchorEl: anchorEl, + prevHasEditorFocus: hasEditorFocus, + prevHasFocus: hasFocus, + prevDebouncedHasFocus: debouncedHasFocus, + }); + useEffect(() => { - if ( - anchorEl && - !debouncedHasEditorFocus && - !hasEditorFocus && - !hasFocus && - !debouncedHasFocus && - !mediaOpen - ) { + if (mediaOpen) { + return; + } + + if (anchorEl && !prevHasEditorFocus && hasEditorFocus) { handleClose(false); } + + if (anchorEl && (prevHasFocus || prevDebouncedHasFocus) && !hasFocus && !debouncedHasFocus) { + handleClose(false); + } + + setPrevFocusState({ + prevAnchorEl: anchorEl, + prevHasEditorFocus: hasEditorFocus, + prevHasFocus: hasFocus, + prevDebouncedHasFocus: debouncedHasFocus, + }); }, [ anchorEl, - debouncedHasEditorFocus, debouncedHasFocus, handleClose, hasEditorFocus, hasFocus, mediaOpen, + prevAnchorEl, + prevDebouncedHasFocus, + prevHasEditorFocus, + prevHasFocus, ]); const handleFocus = useCallback(() => { setHasFocus(true); - }, []); + onFocus?.(); + }, [onFocus]); const handleBlur = useCallback(() => { setHasFocus(false); - }, []); + onBlur?.(); + }, [onBlur]); const handleMediaChange = useCallback( (newValue: string) => { diff --git a/core/src/widgets/markdown/plate/components/nodes/common/index.ts b/core/src/widgets/markdown/plate/components/common/index.ts similarity index 100% rename from core/src/widgets/markdown/plate/components/nodes/common/index.ts rename to core/src/widgets/markdown/plate/components/common/index.ts diff --git a/core/src/widgets/markdown/plate/components/index.ts b/core/src/widgets/markdown/plate/components/index.ts index edfd9234..8bc2fbf1 100644 --- a/core/src/widgets/markdown/plate/components/index.ts +++ b/core/src/widgets/markdown/plate/components/index.ts @@ -1,5 +1,6 @@ export * from './balloon-toolbar'; export * from './buttons'; export * from './color-picker'; +export * from './common'; export * from './nodes'; export * from './toolbar'; diff --git a/core/src/widgets/markdown/plate/components/nodes/index.ts b/core/src/widgets/markdown/plate/components/nodes/index.ts index 3c882794..822b83ab 100644 --- a/core/src/widgets/markdown/plate/components/nodes/index.ts +++ b/core/src/widgets/markdown/plate/components/nodes/index.ts @@ -1,6 +1,5 @@ export * from './blockquote'; export * from './code-block'; -export * from './common'; export * from './headings'; export * from './horizontal-rule'; export * from './image'; diff --git a/core/src/widgets/markdown/plate/components/nodes/link/withLinkElement.tsx b/core/src/widgets/markdown/plate/components/nodes/link/withLinkElement.tsx index ab8ebaaa..1e1389a2 100644 --- a/core/src/widgets/markdown/plate/components/nodes/link/withLinkElement.tsx +++ b/core/src/widgets/markdown/plate/components/nodes/link/withLinkElement.tsx @@ -8,7 +8,7 @@ import { } from '@udecode/plate'; import React, { useCallback, useState } from 'react'; -import MediaPopover from '../common/MediaPopover'; +import MediaPopover from '../../common/MediaPopover'; import type { Collection, Entry, MarkdownField } from '@staticcms/core/interface'; import type { MdLinkElement, MdValue } from '@staticcms/markdown'; @@ -52,10 +52,11 @@ const withLinkElement = ({ containerRef, collection, field, entry }: WithLinkEle const handleChange = useCallback( (newUrl: string, newText: string) => { + const path = findNodePath(editor, element); path && setNodes(editor, { url: newUrl }, { at: path }); upsertLink(editor, { url: newUrl, text: newText }); }, - [editor, path], + [editor, element], ); const handleMediaChange = useCallback( diff --git a/core/test/data/collection.tsx b/core/test/data/collection.tsx new file mode 100644 index 00000000..86935ff2 --- /dev/null +++ b/core/test/data/collection.tsx @@ -0,0 +1,54 @@ +import type { Collection, MarkdownField } from '@staticcms/core'; + +export const mockMarkdownField: MarkdownField = { + label: 'Body', + name: 'body', + widget: 'markdown', + hint: 'Main content goes here.', +}; + +export const mockMarkdownCollection: Collection = { + name: 'posts', + label: 'Posts', + label_singular: 'Post', + description: + 'The description is a great place for tone setting, high level information, and editing guidelines that are specific to a collection.\n', + folder: '_posts', + slug: '{{year}}-{{month}}-{{day}}-{{slug}}', + summary: '{{title}} -- {{year}}/{{month}}/{{day}}', + sortable_fields: { + fields: ['title', 'date'], + default: { + field: 'title', + }, + }, + create: true, + fields: [ + { + label: 'Title', + name: 'title', + widget: 'string', + }, + { + label: 'Draft', + name: 'draft', + widget: 'boolean', + default: false, + }, + { + label: 'Publish Date', + name: 'date', + widget: 'datetime', + date_format: 'yyyy-MM-dd', + time_format: 'HH:mm', + format: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", + }, + { + label: 'Cover Image', + name: 'image', + widget: 'image', + required: false, + }, + mockMarkdownField, + ], +}; diff --git a/core/test/setupEnv.js b/core/test/setupEnv.js index b4e5098d..e46073ce 100644 --- a/core/test/setupEnv.js +++ b/core/test/setupEnv.js @@ -1,6 +1,3 @@ -global.TextEncoder = TextEncoder; -global.TextDecoder = TextDecoder; - if (typeof window === 'undefined') { global.window = { URL: { @@ -15,3 +12,5 @@ if (typeof window === 'undefined') { }, }; } + +global.URL.createObjectURL = jest.fn(); diff --git a/core/tsconfig.base.json b/core/tsconfig.base.json index 265ed66d..7e6216d5 100644 --- a/core/tsconfig.base.json +++ b/core/tsconfig.base.json @@ -54,6 +54,6 @@ "@staticcms/core": ["./src"], "@staticcms/core/*": ["./src/*"] }, - "types": ["@emotion/react/types/css-prop", "@types/jest"] + "types": ["@emotion/react/types/css-prop", "@types/jest", "@testing-library/jest-dom"] } } diff --git a/core/tsconfig.dev.json b/core/tsconfig.dev.json index d69b290d..8307ba22 100644 --- a/core/tsconfig.dev.json +++ b/core/tsconfig.dev.json @@ -1,5 +1,5 @@ { "extends": "./tsconfig.base.json", - "include": ["src/**/*"], + "include": ["src/**/*", "test/**/*"], "exclude": ["node_modules"] } diff --git a/core/yarn.lock b/core/yarn.lock index 66e463d4..0551ca4d 100644 --- a/core/yarn.lock +++ b/core/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adobe/css-tools@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" + integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -26,7 +31,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== @@ -1401,6 +1406,14 @@ "@emotion/weak-memoize" "^0.3.0" stylis "4.1.3" +"@emotion/css-prettifier@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/css-prettifier/-/css-prettifier-1.1.1.tgz#87f3104c057a55674ff464f9c4fdf7326847f0ea" + integrity sha512-dtiZLNN3dWP0mo/+VTPkzNrjp1wL6VRHOOSMn3XpQM4D/7xOVHEIQR6lT5Yj5Omun1REog5NFZ+5hxj+LtTIyQ== + dependencies: + "@emotion/memoize" "^0.8.0" + stylis "4.1.3" + "@emotion/css@11.10.5": version "11.10.5" resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.10.5.tgz#ca01bb83ce60517bc3a5c01d27ccf552fed84d9d" @@ -1429,6 +1442,17 @@ dependencies: "@emotion/memoize" "^0.8.0" +"@emotion/jest@11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/jest/-/jest-11.10.5.tgz#6aea1aec38e1c59e675702fa877644a6b1c18d05" + integrity sha512-LagosxybgisPlxfBGas9kGcNB5xTTX125WbjEVZiE3MEbb+dI4UYn0XIzrsilR8nUaQ5lH6yKUFrMmz7kB34vg== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/css-prettifier" "^1.1.1" + chalk "^4.1.0" + specificity "^0.4.1" + stylis "4.1.3" + "@emotion/memoize@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" @@ -2324,6 +2348,44 @@ dependencies: "@babel/runtime" "^7.19.0" +"@testing-library/dom@^8.5.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.19.0.tgz#bd3f83c217ebac16694329e413d9ad5fdcfd785f" + integrity sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@5.16.5": + version "5.16.5" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" + integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== + dependencies: + "@adobe/css-tools" "^4.0.1" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@13.4.0": + version "13.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + "@tippyjs/react@^4.2.6": version "4.2.6" resolved "https://registry.yarnpkg.com/@tippyjs/react/-/react-4.2.6.tgz#971677a599bf663f20bb1c60a62b9555b749cc71" @@ -2331,6 +2393,11 @@ dependencies: tippy.js "^6.3.1" +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -2343,6 +2410,11 @@ dependencies: "@types/estree" "*" +"@types/aria-query@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" + integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== + "@types/babel__core@^7.1.14": version "7.1.20" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" @@ -2542,7 +2614,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@29.2.4": +"@types/jest@*", "@types/jest@29.2.4": version "29.2.4" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.4.tgz#9c155c4b81c9570dbd183eb8604aa0ae80ba5a5b" integrity sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A== @@ -2560,6 +2632,15 @@ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -2668,7 +2749,7 @@ "@types/react" "*" "@types/reactcss" "*" -"@types/react-dom@18.0.9": +"@types/react-dom@18.0.9", "@types/react-dom@^18.0.0": version "18.0.9" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.9.tgz#ffee5e4bfc2a2f8774b15496474f8e7fe8d0b504" integrity sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg== @@ -2777,6 +2858,18 @@ "@types/react" "*" csstype "^3.0.2" +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.5" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" + integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== + dependencies: + "@types/jest" "*" + +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" @@ -3739,6 +3832,14 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" @@ -3749,11 +3850,23 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.0.0, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.0.0, acorn@^8.1.0, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: version "8.8.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ajv-errors@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-3.0.0.tgz#e54f299f3a3d30fe144161e5f0d8d51196c527bc" @@ -3876,6 +3989,13 @@ aria-hidden@^1.1.3: dependencies: tslib "^2.0.0" +aria-query@^5.0.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3983,6 +4103,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + axios@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.1.tgz#44cf04a3c9f0c2252ebd85975361c026cb9f864a" @@ -5025,6 +5150,11 @@ css-what@^6.0.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + csscolorparser@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" @@ -5042,6 +5172,23 @@ csso@^4.0.2, csso@^4.2.0: dependencies: css-tree "^1.1.2" +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + csstype@^3.0.2, csstype@^3.0.6, csstype@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" @@ -5060,6 +5207,15 @@ data-uri-to-buffer@^4.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + date-fns@2.29.3: version "2.29.3" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" @@ -5072,6 +5228,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -5079,13 +5242,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - decache@^4.5.1: version "4.6.1" resolved "https://registry.yarnpkg.com/decache/-/decache-4.6.1.tgz#5928bfab97a6fcf22a65047a3d07999af36efaf0" @@ -5093,6 +5249,11 @@ decache@^4.5.1: dependencies: callsite "^1.0.0" +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + decode-named-character-reference@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" @@ -5110,7 +5271,28 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-is@^0.1.3: +deep-equal@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" + integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.8" + +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -5249,6 +5431,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.14" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" + integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -5284,6 +5471,13 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + domhandler@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" @@ -5379,6 +5573,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + entities@~2.0: version "2.0.3" resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" @@ -5439,6 +5638,20 @@ es-array-method-boxes-properly@^1.0.0: resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-get-iterator@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" @@ -5521,6 +5734,18 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" @@ -5734,7 +5959,7 @@ espree@^9.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -5959,7 +6184,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-sta resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -6093,6 +6318,13 @@ follow-redirects@^1.0.0, follow-redirects@^1.15.0, follow-redirects@~1.15.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -6623,6 +6855,15 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" @@ -6662,6 +6903,14 @@ http-server@14.1.1: union "~0.5.0" url-join "^4.0.1" +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -6835,6 +7084,14 @@ is-alphanumerical@^2.0.0: is-alphabetical "^2.0.0" is-decimal "^2.0.0" +is-arguments@^1.1.0, is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -6874,7 +7131,7 @@ is-builtin-module@^3.2.0: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -6886,7 +7143,7 @@ is-core-module@^2.10.0, is-core-module@^2.8.1, is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6965,6 +7222,11 @@ is-invalid-path@^1.0.2: resolved "https://registry.yarnpkg.com/is-invalid-path/-/is-invalid-path-1.0.2.tgz#2f84731559f4936abcf1b227632719cf45c5dc0e" integrity sha512-6KLcFrPCEP3AFXMfnWrIFkZpYNBVzZAoBJJDEZKtI3LXkaDjM3uFMJQjxiizUuZTZ9Oh9FNv/soXbx5TcpaDmA== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -7014,6 +7276,11 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-reference@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.0.tgz#b1380c03d96ddf7089709781e3208fceb0c92cd6" @@ -7029,6 +7296,11 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -7060,11 +7332,27 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -7072,6 +7360,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -7079,6 +7375,11 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -7243,6 +7544,20 @@ jest-each@^29.3.1: jest-util "^29.3.1" pretty-format "^29.3.1" +jest-environment-jsdom@29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.3.1.tgz#14ca63c3e0ef5c63c5bcb46033e50bc649e3b639" + integrity sha512-G46nKgiez2Gy4zvYNhayfMEAFlVHhWfncqvqS6yCd0i+a4NsSUD2WtrKSaYQrYiLQaupHXxCRi8xxVL2M9PbhA== + dependencies: + "@jest/environment" "^29.3.1" + "@jest/fake-timers" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.3.1" + jest-util "^29.3.1" + jsdom "^20.0.0" + jest-environment-node@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" @@ -7566,6 +7881,38 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -7702,6 +8049,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + li@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/li/-/li-1.3.0.tgz#22c59bcaefaa9a8ef359cf759784e4bf106aea1b" @@ -7834,6 +8189,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -8807,6 +9167,11 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +nwsapi@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -8817,6 +9182,14 @@ object-inspect@^1.12.2, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -8948,6 +9321,18 @@ opener@^1.5.1: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -9093,6 +9478,13 @@ parse5@^6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -9287,6 +9679,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -9299,6 +9696,15 @@ prettier@2.8.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-format@^29.0.0, pretty-format@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" @@ -9368,12 +9774,17 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -9414,6 +9825,11 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -9526,7 +9942,7 @@ react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.2: +react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -9759,6 +10175,14 @@ rechoir@^0.8.0: dependencies: resolve "^1.20.0" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + redux-thunk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" @@ -10089,6 +10513,13 @@ sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@0.23.0, scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -10436,7 +10867,7 @@ source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -10505,6 +10936,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" + integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== + split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" @@ -10830,6 +11266,11 @@ symbol-observable@4.0.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + synckit@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" @@ -10967,6 +11408,23 @@ topbar@^0.1.3: resolved "https://registry.yarnpkg.com/topbar/-/topbar-0.1.4.tgz#d050e536ef5053d9629499ed71008b88cb2398fb" integrity sha512-P3n4WnN4GFd2mQXDo30rQmsAGe4V1bVkggtTreSbNyL50Fyc+eVkW5oatSLeGQmJoan2TLIgoXUZypN+6nw4MQ== +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -11080,6 +11538,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -11270,6 +11735,11 @@ unist-util-visit@4.1.1, unist-util-visit@^4.0.0: unist-util-is "^5.0.0" unist-util-visit-parents "^5.1.1" +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -11323,6 +11793,14 @@ url-join@^4.0.1: resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + url@0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -11510,6 +11988,13 @@ w3c-keyname@^2.2.4: resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f" integrity sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -11578,6 +12063,11 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + webpack-cli@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.0.1.tgz#95fc0495ac4065e9423a722dec9175560b6f2d9a" @@ -11729,6 +12219,19 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -11748,6 +12251,28 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.8: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -11767,7 +12292,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -word-wrap@^1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -11794,7 +12319,7 @@ write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@^8.4.2: +ws@^8.11.0, ws@^8.4.2: version "8.11.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== @@ -11804,11 +12329,21 @@ xcase@^2.0.1: resolved "https://registry.yarnpkg.com/xcase/-/xcase-2.0.1.tgz#c7fa72caa0f440db78fd5673432038ac984450b9" integrity sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + xml-utils@^1.0.2: version "1.3.0" resolved "https://registry.yarnpkg.com/xml-utils/-/xml-utils-1.3.0.tgz#f1043534e3ac3deda12ddab39f8442e16da98ebb" integrity sha512-i4PIrX33Wd66dvwo4syicwlwmnr6wuvvn4f2ku9hA67C2Uk62Xubczuhct+Evnd12/DV71qKNeDdJwES8HX1RA== +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"