diff --git a/.gitignore b/.gitignore index 103e20fdbd..d6a45714f9 100644 --- a/.gitignore +++ b/.gitignore @@ -56,9 +56,11 @@ storybook-static .DS_Store # test artifacts +packages/files-ui/cypress/downloads/* packages/files-ui/cypress/screenshots/* packages/files-ui/cypress/videos/* packages/files-ui/cypress/fixtures/storage +packages/storage-ui/cypress/downloads/* packages/storage-ui/cypress/screenshots/* packages/storage-ui/cypress/videos/* packages/storage-ui/cypress/fixtures/storage \ No newline at end of file diff --git a/packages/common-components/.storybook/contexts.js b/packages/common-components/.storybook/contexts.js index dbd6abe31a..cba623b372 100644 --- a/packages/common-components/.storybook/contexts.js +++ b/packages/common-components/.storybook/contexts.js @@ -1,4 +1,4 @@ -import { createTheme, ThemeProvider } from "@chainsafe/common-theme" +import { createTheme, ThemeSwitcher } from "@chainsafe/common-theme" const lightTheme = createTheme() const darkTheme = createTheme() @@ -7,11 +7,19 @@ export const contexts = [ { icon: "box", // a icon displayed in the Storybook toolbar to control contextual props title: "Themes", // an unique name of a contextual environment - components: [ThemeProvider], + components: [ThemeSwitcher], params: [ // an array of params contains a set of predefined `props` for `components` - { name: "Light Theme", props: { theme: lightTheme } }, - { name: "Dark Theme", props: { theme: darkTheme } }, + { name: "Light Theme", + props: { + themes: [lightTheme] + } + }, + { name: "Dark Theme", + props: { + themes: [darkTheme] + } + }, ], options: { deep: true, @@ -20,4 +28,4 @@ export const contexts = [ }, }, /* ... */ // multiple contexts setups are supported -] +] \ No newline at end of file diff --git a/packages/common-components/package.json b/packages/common-components/package.json index 72be7e4165..a694ce3a86 100644 --- a/packages/common-components/package.json +++ b/packages/common-components/package.json @@ -1,6 +1,6 @@ { "name": "@chainsafe/common-components", - "version": "1.0.30", + "version": "1.0.31", "description": "Chainsafe Common React Components", "author": "Chainsafe Products Team", "license": "GPL-3.0", diff --git a/packages/common-components/src/Icons/svgs/close-circle.svg b/packages/common-components/src/Icons/svgs/close-circle.svg index 5130be3671..09fe18bc20 100644 --- a/packages/common-components/src/Icons/svgs/close-circle.svg +++ b/packages/common-components/src/Icons/svgs/close-circle.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/packages/common-components/src/Icons/svgs/cross.svg b/packages/common-components/src/Icons/svgs/cross.svg index 3c49f6c4d9..c9d27b1b75 100644 --- a/packages/common-components/src/Icons/svgs/cross.svg +++ b/packages/common-components/src/Icons/svgs/cross.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/packages/common-components/src/Toaster/ToastContainer.tsx b/packages/common-components/src/Toaster/ToastContainer.tsx deleted file mode 100644 index df904ccbaf..0000000000 --- a/packages/common-components/src/Toaster/ToastContainer.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import React, { ReactNode } from "react" - -import { Placement } from "react-toast-notifications" -import { ITheme } from "@chainsafe/common-theme" -import { makeStyles, createStyles } from "@material-ui/styles" - -interface IStyleProps { - placement: Placement - hasToasts: boolean -} - -const useStyles = makeStyles(({ zIndex, constants }: ITheme) => - createStyles({ - container: (props: IStyleProps) => ({ - boxSizing: "border-box", - maxHeight: "100%", - overflow: "hidden", - padding: constants.generalUnit, - position: "fixed", - zIndex: zIndex?.blocker, - ...placements[props.placement] - }) - }) -) - -const placements = { - "top-left": { top: 0, left: 0 }, - "top-center": { top: 0, left: "50%", transform: "translateX(-50%)" }, - "top-right": { top: 0, right: 0 }, - "bottom-left": { bottom: 0, left: 0 }, - "bottom-center": { bottom: 0, left: "50%", transform: "translateX(-50%)" }, - "bottom-right": { bottom: 0, right: 0 } -} - -export type ToastContainerProps = { - children?: ReactNode - hasToasts: boolean - placement: Placement -} - -const ToastContainer: React.FC = ({ - hasToasts, - placement, - ...props -}) => { - const classes = useStyles({ - hasToasts, - placement - }) - return ( -
- ) -} - -export default ToastContainer diff --git a/packages/common-components/src/Toaster/Toaster.tsx b/packages/common-components/src/Toaster/Toaster.tsx deleted file mode 100644 index c37b35a476..0000000000 --- a/packages/common-components/src/Toaster/Toaster.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import React, { useRef, useState, useEffect } from "react" -import clsx from "clsx" -import { - ITheme, - useTheme, - makeStyles, - createStyles -} from "@chainsafe/common-theme" -import { Placement, ToastProps } from "react-toast-notifications" -import { - CheckCircleIcon, - CloseCircleIcon, - CrossOutlinedIcon, - InfoCircleIcon -} from "../Icons" -export { ToastProvider, useToasts } from "react-toast-notifications" - -const WidthToaster = 340 - -function getTranslate(placement: Placement) { - const pos = placement.split("-") - const relevantPlacement = pos[1] === "center" ? pos[0] : pos[1] - const translateMap = { - right: "translate(120%, 0)", - left: "translate(-120%, 0)", - bottom: "translate(0, 120%)", - top: "translate(0, -120%)" - } - - return translateMap[relevantPlacement] -} - -interface IStyleProps { - height: string | number - placement: Placement -} - -const useStyles = makeStyles( - ({ animation, zIndex, constants, palette, overrides }: ITheme) => - createStyles({ - root: ({ height }: IStyleProps) => ({ - transition: `height ${animation.transform - 100}ms 100ms`, - height: height, - position: "relative", - zIndex: zIndex?.layer4, - ...overrides?.Toaster?.root - }), - inner: ({ placement }: IStyleProps) => ({ - borderRadius: 4, - border: `1px solid ${palette.additional["gray"][6]}`, - display: "flex", - alignItems: "center", - padding: constants.generalUnit * 2, - backgroundColor: palette.additional["gray"][3], - marginBottom: constants.generalUnit, - transition: `transform ${animation.transform}ms cubic-bezier(0.2, 0, 0, 1), opacity ${animation.transform}ms`, - width: WidthToaster, - "&.entering": { transform: getTranslate(placement) }, - "&.entered": { transform: "translate3d(0,0,0)" }, - "&.exiting": { transform: "scale(0.66)", opacity: 0 }, - "&.exited": { transform: "scale(0.66)", opacity: 0 }, - ...overrides?.Toaster?.inner - }), - typeIcon: { - marginRight: `${constants.generalUnit * 2}px`, - ...overrides?.Toaster?.typeIcon?.root, - "&.success": { - ...overrides?.Toaster?.typeIcon?.success - }, - "&.error": { - ...overrides?.Toaster?.typeIcon?.error - }, - "&.info": { - ...overrides?.Toaster?.typeIcon?.info - } - }, - closeButton: { - backgroundColor: "transparent", - border: "none", - cursor: "pointer", - ...overrides?.Toaster?.closeButton - }, - closeIcon: { - fontSize: `${constants.generalUnit * 1.5}px`, - fill: palette.additional["gray"][6], - marginLeft: `${constants.generalUnit * 2}px`, - ...overrides?.Toaster?.closeIcon - } - }) -) - -const Toaster = ({ - appearance, - children, - onDismiss, - placement, - transitionState -}: ToastProps) => { - const [height, setHeight] = useState("auto") - const elementRef = useRef(null) - - const classes = useStyles({ - height, - placement - }) - - const { constants }: ITheme = useTheme() - - useEffect(() => { - if (transitionState === "entered") { - const el = elementRef.current - setHeight(el.offsetHeight + constants.generalUnit) - } - if (transitionState === "exiting") { - setHeight(0) - } - }, [constants.generalUnit, transitionState]) - - return ( -
-
- {appearance === "success" ? ( - - ) : appearance === "error" ? ( - - ) : ( - - )} - {children} - {onDismiss ? ( - - ) : null} -
-
- ) -} - -export default Toaster diff --git a/packages/common-components/src/Toaster/ToasterContent.tsx b/packages/common-components/src/Toaster/ToasterContent.tsx deleted file mode 100644 index 58e799f756..0000000000 --- a/packages/common-components/src/Toaster/ToasterContent.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from "react" -import { ITheme, makeStyles, createStyles } from "@chainsafe/common-theme" - -const ContentWidth = 300 - -const useStyles = makeStyles(({ typography, palette, overrides }: ITheme) => - createStyles({ - messageContainer: { - flex: 1, - width: ContentWidth, - ...overrides?.Toaster?.messageContainer - }, - message: { - ...typography.body1, - color: palette.text.primary, - fontSize: 16, - margin: 0, - ...overrides?.Toaster?.message - }, - description: { - ...typography.body2, - color: palette.text.secondary, - fontSize: 12, - margin: 0, - ...overrides?.Toaster?.description - } - }) -) - -export interface IToasterContentProps { - message: string - description?: string - className?: string - onClose?: () => void -} - -const ToasterContent: React.FC = ({ - message, - description -}: IToasterContentProps) => { - const classes = useStyles() - - return ( -
-

{message}

- {description &&

{description}

} -
- ) -} - -export default ToasterContent diff --git a/packages/common-components/src/Toaster/ToasterProvider.tsx b/packages/common-components/src/Toaster/ToasterProvider.tsx deleted file mode 100644 index 6d17ef8628..0000000000 --- a/packages/common-components/src/Toaster/ToasterProvider.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, { ReactNode } from "react" -import Toaster from "./Toaster" -import ToastContainer from "./ToastContainer" -import { Placement, ToastProvider } from "react-toast-notifications" - -export interface IToasterProviderProps { - autoDismiss?: boolean - autoDismissTimeout?: number - children: ReactNode | ReactNode[] - placement?: Placement -} - -export const ToasterProvider: React.FC = ({ - autoDismiss, - autoDismissTimeout, - children, - placement = "top-right" -}: IToasterProviderProps) => { - return ( - - {children} - - ) -} diff --git a/packages/common-components/src/Toaster/ToasterWrapper.tsx b/packages/common-components/src/Toaster/ToasterWrapper.tsx deleted file mode 100644 index bb3313d28a..0000000000 --- a/packages/common-components/src/Toaster/ToasterWrapper.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React, { useCallback } from "react" -import ToasterContent from "./ToasterContent" -import { useToasts, AppearanceTypes, Placement } from "react-toast-notifications" - -export interface IToasterMessage { - message: string - description?: string - appearance?: AppearanceTypes - autoDismiss?: boolean - onDismiss?: (id: string) => void -} - -export const useToaster = () => { - const { addToast } = useToasts() - - const addToastMessage = useCallback((config: IToasterMessage) => { - addToast( - , - { - appearance: config.appearance || "success", - autoDismiss: config.autoDismiss, - onDismiss: config.onDismiss - } - ) - }, [addToast]) - - return { - addToastMessage - } -} - -export { AppearanceTypes, Placement } diff --git a/packages/common-components/src/Toaster/index.ts b/packages/common-components/src/Toaster/index.ts deleted file mode 100644 index b0cc98b9ff..0000000000 --- a/packages/common-components/src/Toaster/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { default as Toaster } from "./Toaster" -export { default as ToasterContent } from "./ToasterContent" -export * from "./Toaster" -export * from "./ToasterWrapper" -export * from "./ToasterProvider" diff --git a/packages/common-components/src/Toasts/ToastContent.tsx b/packages/common-components/src/Toasts/ToastContent.tsx new file mode 100644 index 0000000000..74fc98ccc5 --- /dev/null +++ b/packages/common-components/src/Toasts/ToastContent.tsx @@ -0,0 +1,160 @@ +import React from "react" +import { createStyles, ITheme, makeStyles } from "@chainsafe/common-theme" +import { ToastContentData } from "./types" +import clsx from "clsx" +import { Typography } from "../Typography" +import { CheckCircleIcon, CloseCircleIcon, CloseCirceSvg, CrossSvg } from "../Icons" +import { ProgressBar } from "../ProgressBar" +import { Loading } from "../Spinner" + +const useStyles = makeStyles(({ constants, palette, animation, overrides }: ITheme) => { + return createStyles({ + root: { + backgroundColor: palette.additional["gray"][3], + margin: constants.generalUnit, + border: `1px solid ${palette.additional["gray"][6]}`, + padding: constants.generalUnit * 2, + borderRadius: 4, + position: "relative", + "&:hover $closeIcon": { + visibility: "visible", + opacity: 1 + }, + ...overrides?.Toasts?.root + }, + progressBox: { + display: "flex", + alignItems: "center", + marginTop: constants.generalUnit, + ...overrides?.Toasts?.progressBox + }, + titleContainer: { + display: "flex", + alignItems: "center", + ...overrides?.Toasts?.titleContainer + }, + subtitle: { + marginTop: constants.generalUnit, + ...overrides?.Toasts?.subtitle + }, + icon: { + marginRight: constants.generalUnit, + fill: palette.additional["gray"][9], + ...overrides?.Toasts?.icon + }, + progressBar: { + flex: 1, + ...overrides?.Toasts?.progressBar + }, + progressCrossButton: { + marginLeft: constants.generalUnit, + cursor: "pointer", + width: constants.generalUnit * 2, + height: constants.generalUnit * 2, + fill: palette.additional["gray"][9], + ...overrides?.Toasts?.progressCrossButton + }, + closeIcon: { + position: "absolute", + right: 0, + top: 0, + transform: "translate(50%,-50%)", + fill: palette.additional["gray"][9], + width: constants.generalUnit * 2, + height: constants.generalUnit * 2, + borderRadius: "50%", + backgroundColor: palette.additional["gray"][1], + border: "1px solid", + borderColor: palette.additional["gray"][9], + opacity: 0, + visibility: "hidden", + transition: `opacity ${animation.transform}ms`, + display: "flex", + alignItems: "center", + justifyContent: "center", + cursor: "pointer", + "& svg": { + fill: palette.additional["gray"][9], + width: constants.generalUnit, + height: constants.generalUnit + }, + ...overrides?.Toasts?.closeIcon + } + }) +}) + +export interface ToastContentProps { + toast: ToastContentData + onClose: () => void +} + +const ToastContent = ({ toast, onClose }: ToastContentProps) => { + const classes = useStyles() + const { type, title, progress, subtitle, isClosable = true, onProgressCancel, onProgressCancelLoading } = toast + return ( +
+ {progress !== undefined + ? <> + + {title} + +
+ + {onProgressCancel && + onProgressCancelLoading + ? + : + } +
+ + : <> +
+ {type === "success" + ? + : + } + + {title} + +
+ {subtitle && + + {subtitle} + + } + + } + {isClosable && +
+ +
+ } +
+ ) +} + +export { ToastContent } \ No newline at end of file diff --git a/packages/common-components/src/Toasts/ToastContext.tsx b/packages/common-components/src/Toasts/ToastContext.tsx new file mode 100644 index 0000000000..b9cc6e22bd --- /dev/null +++ b/packages/common-components/src/Toasts/ToastContext.tsx @@ -0,0 +1,202 @@ +import React, { useCallback, useMemo, useRef, useState } from "react" +import { createStyles, ITheme, makeStyles } from "@chainsafe/common-theme" +import { ToastParams, Toast, ToastPosition } from "./types" +import { v4 as uuidv4 } from "uuid" +import { ToastContent } from "./ToastContent" +import clsx from "clsx" + +const useStyles = makeStyles(({ constants, zIndex, breakpoints, animation }: ITheme) => { + const WIDTH = 400 + return createStyles({ + toastWrapper: { + position: "fixed", + width: WIDTH, + margin: constants.generalUnit, + zIndex: zIndex?.blocker, + [breakpoints.down("sm")]: { + margin: constants.generalUnit, + width: `calc(100% - ${constants.generalUnit * 2}px)` + } + }, + topRightContainer: { + top: 0, + right: 0 + }, + topRightAppearBox: { + animation: `$slideLeft ${animation.translate}ms`, + [breakpoints.down("sm")]: { + animation: `$slideDown ${animation.translate}ms` + } + }, + topLeftContainer: { + top: 0, + left: 0 + }, + topLeftAppearBox: { + animation: `$slideRight ${animation.translate}ms`, + [breakpoints.down("sm")]: { + animation: `$slideDown ${animation.translate}ms` + } + }, + bottomRightContainer: { + bottom: 0, + right: 0 + }, + bottomRightAppearBox: { + animation: `$slideLeft ${animation.translate}ms`, + [breakpoints.down("sm")]: { + animation: `$slideUp ${animation.translate}ms` + } + }, + bottomLeftContainer: { + bottom: 0, + left: 0 + }, + bottomLeftAppearBox: { + animation: `$slideRight ${animation.translate}ms`, + [breakpoints.down("sm")]: { + animation: `$slideUp ${animation.translate}ms` + } + }, + "@keyframes slideRight": { + from: { transform: "translate(-100%, 0)" }, + to: { transform: "translate(0, 0)" } + }, + "@keyframes slideLeft": { + from: { transform: "translate(100%, 0)" }, + to: { transform: "translate(0, 0)" } + }, + "@keyframes slideUp": { + from: { transform: "translate(0, 100%)" }, + to: { transform: "translate(0, 0)" } + }, + "@keyframes slideDown": { + from: { transform: "translate(0, -100%)" }, + to: { transform: "translate(0, 0)" } + } + }) +}) + +type ToastContextProps = { + autoDismiss?: boolean + dismissTimeout?: number + defaultPosition?: ToastPosition + children: React.ReactNode | React.ReactNode[] +} + +interface ToastContext { + addToast: (toastParams: ToastParams) => string + updateToast: (toastId: string, toastParams: ToastParams, startDismissal?: boolean) => void + removeToast: (toastId: string) => void + toasts: Toast[] +} + +const ToastContext = React.createContext( + undefined +) + +const ToastProvider = ({ + children, + autoDismiss = true, + defaultPosition = "topRight", + dismissTimeout = 5000 +}: ToastContextProps) => { + const classes = useStyles() + const [toastQueue, setToastQueue] = useState([]) + // using useRef instead of useState to keep a tracker over the exact toast array + const toasts = useRef([]) + + const removeToast = useCallback((toastId: string) => { + toasts.current = toasts.current.filter((toast) => toast.id !== toastId) + setToastQueue(toasts.current) + }, [toasts]) + + const addToast = useCallback((toastParams: ToastParams) => { + const id = uuidv4() + toasts.current = [ + ...toasts.current, + { id, + ...toastParams, + toastPosition: toastParams.toastPosition || defaultPosition + } + ] + setToastQueue(toasts.current) + + const isProgressToast = toastParams.progress !== undefined + const shouldDismiss = toastParams.autoDismiss || autoDismiss + const dismissTimeOut = toastParams.dismissTimeout || dismissTimeout + + if (shouldDismiss && !isProgressToast) { + setTimeout(() => { + removeToast(id) + }, dismissTimeOut) + } + + return id + }, [defaultPosition, autoDismiss, dismissTimeout, removeToast]) + + const updateToast = useCallback((toastId: string, toastParams: ToastParams, startDismissal?: boolean) => { + const dismissTimeOut = toastParams.dismissTimeout || dismissTimeout + if (startDismissal) { + setTimeout(() => { + removeToast(toastId) + }, dismissTimeOut) + } + toasts.current = toasts.current.map((toast) => toast.id === toastId ? { ...toast, ...toastParams } : toast) + setToastQueue(toasts.current) + }, [dismissTimeout, removeToast]) + + const positionedToasts: Record> = useMemo(() => ({ + topRight: toastQueue.filter((toast) => toast.toastPosition === "topRight"), + topLeft: toastQueue.filter((toast) => toast.toastPosition === "topLeft"), + bottomRight: toastQueue.filter((toast) => toast.toastPosition === "bottomRight"), + bottomLeft: toastQueue.filter((toast) => toast.toastPosition === "bottomLeft") + }), [toastQueue]) + + return ( + + {(Object.keys(positionedToasts) as ToastPosition[]).map((position) => ( + !!positionedToasts[position].length && ( +
+ {positionedToasts[position].map((toast) => ( +
+ removeToast(toast.id)} + /> +
+ ))} +
+ ) + )) + } + {children} +
+ ) +} + +const useToasts = () => { + const context = React.useContext(ToastContext) + if (context === undefined) { + throw new Error("useToasts must be used within a ToastProvider") + } + return context +} + +export { ToastProvider, useToasts } diff --git a/packages/common-components/src/Toasts/index.ts b/packages/common-components/src/Toasts/index.ts new file mode 100644 index 0000000000..6f479d6cbf --- /dev/null +++ b/packages/common-components/src/Toasts/index.ts @@ -0,0 +1,3 @@ +export * from "./ToastContext" +export * from "./ToastContent" +export * from "./types" \ No newline at end of file diff --git a/packages/common-components/src/Toasts/types.ts b/packages/common-components/src/Toasts/types.ts new file mode 100644 index 0000000000..b9828b9c62 --- /dev/null +++ b/packages/common-components/src/Toasts/types.ts @@ -0,0 +1,24 @@ + +export type ToastType = "success" | "error" + +export type ToastPosition = "topLeft" | "topRight" | "bottomLeft" | "bottomRight" +export interface Toast { + id: string + type: ToastType + title: string + subtitle?: string + progress?: number + onProgressCancel?: () => void + isClosable?: boolean + onProgressCancelLoading?: boolean + toastPosition: ToastPosition + autoDismiss?: boolean + dismissTimeout?: number + testId?: string +} + +export type ToastContentData = Omit + +export interface ToastParams extends Omit { + toastPosition?: ToastPosition +} diff --git a/packages/common-components/src/index.ts b/packages/common-components/src/index.ts index 72c5520605..8684f17bf5 100644 --- a/packages/common-components/src/index.ts +++ b/packages/common-components/src/index.ts @@ -31,7 +31,7 @@ export * from "./Spinner" export * from "./Table" export * from "./Tabs" export * from "./TagsInput" -export * from "./Toaster" +export * from "./Toasts" export * from "./ToggleHiddenText" export * from "./TextInput" export * from "./TreeView" diff --git a/packages/common-components/src/stories/Toaster.stories.tsx b/packages/common-components/src/stories/Toaster.stories.tsx deleted file mode 100644 index 7b037a353d..0000000000 --- a/packages/common-components/src/stories/Toaster.stories.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from "react" -import { - Toaster, - ToasterProvider, - useToaster, - AppearanceTypes -} from "../Toaster" -import { withKnobs, number, select } from "@storybook/addon-knobs" - -export default { - title: "Toaster", - component: Toaster, - decorators: [withKnobs] -} - -export const ToasterWrapper: React.FC = () => { - return ( - - - - ) -} - -const ToasterDemo: React.FC = () => { - const { addToastMessage } = useToaster() - - const onAddToast = (appearance: AppearanceTypes) => { - addToastMessage({ - appearance, - message: "Update successful", - description: "Your updates are complete" - }) - } - - return ( - <> - - - ) -} diff --git a/packages/common-components/src/stories/Toasts.stories.tsx b/packages/common-components/src/stories/Toasts.stories.tsx new file mode 100644 index 0000000000..a18f1feffa --- /dev/null +++ b/packages/common-components/src/stories/Toasts.stories.tsx @@ -0,0 +1,148 @@ +import React from "react" +import { ToastContent, ToastParams, ToastProvider, useToasts } from "../Toasts" +import { withKnobs, number, select, text, boolean } from "@storybook/addon-knobs" +import { action } from "@storybook/addon-actions" + +export default { + title: "Toasts", + component: ToastContent, + decorators: [withKnobs] +} + +export const ToastsContentNotification: React.FC = () => { + return ( + + ) +} + +export const ToastsContentProgress: React.FC = () => { + return ( + + ) +} + +export const ToastsContentProgressNoCancel: React.FC = () => { + return ( + + ) +} + +export const ToastsDemo: React.FC = () => { + return ( + + + + ) +} + +export const MultipleToastsDemo: React.FC = () => { + return ( + + + + ) +} + +const ToastNotificationDemo: React.FC<{toast: ToastParams}> = ({ toast }) => { + const { addToast, updateToast, toasts } = useToasts() + + const onAddToast = () => { + addToast(toast) + } + + return ( + <> + +
+ {toasts.map((toast) => ( + toast.progress && toast.progress < 80 ? ( + + ) : null + )) + } + + ) +} + +const ToastMultipleNotificationDemo: React.FC<{toast: ToastParams}> = ({ toast }) => { + const { addToast } = useToasts() + + const onAddToast = () => { + addToast(toast) + setTimeout(() => { + addToast(toast) + }, 1000) + setTimeout(() => { + addToast(toast) + }, 2000) + } + + return ( + <> + +
+ + ) +} + + diff --git a/packages/common-theme/package.json b/packages/common-theme/package.json index a9ce780175..018734f4ad 100644 --- a/packages/common-theme/package.json +++ b/packages/common-theme/package.json @@ -1,6 +1,6 @@ { "name": "@chainsafe/common-theme", - "version": "1.0.10", + "version": "1.0.11", "description": "Chainsafe Common React Theming Engine", "author": "Chainsafe Products Team", "license": "GPL-3.0", @@ -18,8 +18,8 @@ "lint": "eslint './{src, cypress}/**/*.{js,jsx,ts,tsx}'" }, "dependencies": { - "rollup-plugin-copy": "^3.4.0", "@chainsafe/browser-storage-hooks": "^1.0.1", + "rollup-plugin-copy": "^3.4.0", "ts-essentials": "^7.0.1" }, "peerDependencies": { diff --git a/packages/common-theme/src/Overrides/Toaster.ts b/packages/common-theme/src/Overrides/Toaster.ts deleted file mode 100644 index 233b24da9d..0000000000 --- a/packages/common-theme/src/Overrides/Toaster.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface IToasterOverride { - root?: Record - inner?: Record - typeIcon?: { - root?: Record - success?: Record - error?: Record - info?: Record - } - closeButton?: Record - closeIcon?: Record - messageContainer?: Record - message?: Record - description?: Record -} diff --git a/packages/common-theme/src/Overrides/Toasts.ts b/packages/common-theme/src/Overrides/Toasts.ts new file mode 100644 index 0000000000..8c9fdab3c4 --- /dev/null +++ b/packages/common-theme/src/Overrides/Toasts.ts @@ -0,0 +1,10 @@ +export interface IToastsOverride { + root?: Record + progressBox?: Record + titleContainer?: Record + subtitle?: Record + closeIcon?: Record + icon?: Record + progressBar?: Record + progressCrossButton?: Record +} diff --git a/packages/common-theme/src/Overrides/index.ts b/packages/common-theme/src/Overrides/index.ts index ac1f67a883..e56d61266b 100644 --- a/packages/common-theme/src/Overrides/index.ts +++ b/packages/common-theme/src/Overrides/index.ts @@ -21,7 +21,7 @@ import { ISelectInputOverride } from "./SelectInput" import { ITableOverride } from "./Table" import { ITabsOverride } from "./Tabs" import { ITextInputOverride } from "./TextInput" -import { IToasterOverride } from "./Toaster" +import { IToastsOverride } from "./Toasts" import { ITypographyOverride } from "./Typography" import { ITagsInputOverride } from "./TagsInput" import { IToggleHiddenText } from "./ToggleHiddenText" @@ -50,7 +50,7 @@ export interface IComponentOverrides { Table?: ITableOverride Tabs?: ITabsOverride TextInput?: ITextInputOverride - Toaster?: IToasterOverride + Toasts?: IToastsOverride ToggleHiddenText?: IToggleHiddenText Typography?: ITypographyOverride TagsInput?: ITagsInputOverride diff --git a/packages/files-ui/cypress/fixtures/uploadedFiles/file.zip b/packages/files-ui/cypress/fixtures/uploadedFiles/file.zip new file mode 100644 index 0000000000..45354446b0 Binary files /dev/null and b/packages/files-ui/cypress/fixtures/uploadedFiles/file.zip differ diff --git a/packages/files-ui/cypress/support/page-objects/homePage.ts b/packages/files-ui/cypress/support/page-objects/homePage.ts index bd55cf40ec..85b8851cc0 100644 --- a/packages/files-ui/cypress/support/page-objects/homePage.ts +++ b/packages/files-ui/cypress/support/page-objects/homePage.ts @@ -11,7 +11,7 @@ export const homePage = { uploadButton: () => cy.get("[data-cy=button-upload-file]"), moveSelectedButton: () => cy.get("[data-testId=button-move-selected-file]"), deleteSelectedButton: () => cy.get("[data-testId=button-delete-selected-file]"), - uploadStatusToast: () => cy.get("[data-cy=upload-status-toast-message]", { timeout: 10000 }), + uploadStatusToast: () => cy.get("[data-testId=toast-upload-status]", { timeout: 10000 }), fileRenameInput: () => cy.get("[data-cy=rename-form] input"), fileRenameSubmitButton: () => cy.get("[data-cy=rename-submit-button]"), fileRenameErrorLabel: () => cy.get("[data-cy=rename-form] span.minimal.error"), diff --git a/packages/files-ui/cypress/support/page-objects/modals/previewModal.ts b/packages/files-ui/cypress/support/page-objects/modals/previewModal.ts new file mode 100644 index 0000000000..79c85f662b --- /dev/null +++ b/packages/files-ui/cypress/support/page-objects/modals/previewModal.ts @@ -0,0 +1,15 @@ +export const previewModal = { + body: () => cy.get("[data-cy=modal-container-preview]", { timeout: 10000 }), + closeButton: () => cy.get("[data-cy=button-close-preview]"), + contentContainer: () => cy.get("[data-cy=container-content-preview]", { timeout: 10000 }), + downloadFileButton: () => cy.get("[data-cy=button-download-previewed-file]"), + downloadUnsupportedFileButton: () => cy.get("[data-cy=button-download-unsupported-file]", { timeout: 10000 }), + fileNameLabel: () => cy.get("[data-cy=label-previewed-file-name]"), + fullScreenButton: () => cy.get("[data-cy=button-full-screen]"), + nextFileButton: () => cy.get("[data-cy=button-view-next-file]"), + previewKebabButton: () => cy.get("[data-testid=menu-title-preview-kebab]"), + previousFileButton: () => cy.get("[data-cy=button-view-previous-file]"), + unsupportedFileLabel: () => cy.get("[data-cy=label-unsupported-file-message]", { timeout: 10000 }), + ZoomInButton: () => cy.get("[data-cy=button-zoom-in]"), + zoomOutButton: () => cy.get("[data-cy=button-zoom-out]") +} \ No newline at end of file diff --git a/packages/files-ui/cypress/tests/file-preview-spec.ts b/packages/files-ui/cypress/tests/file-preview-spec.ts new file mode 100644 index 0000000000..0003413416 --- /dev/null +++ b/packages/files-ui/cypress/tests/file-preview-spec.ts @@ -0,0 +1,88 @@ +import { homePage } from "../support/page-objects/homePage" +import { previewModal } from "../support/page-objects/modals/previewModal" + +describe("File Preview", () => { + + context("desktop", () => { + + it("can preview and browse compatible file types", () => { + cy.web3Login({ clearCSFBucket: true }) + + // add files + homePage.uploadFile("../fixtures/uploadedFiles/logo.png") + homePage.uploadFile("../fixtures/uploadedFiles/text-file.txt") + + // store their file names as cypress aliases for later comparison + homePage.fileItemName().eq(0).invoke("text").as("fileNameA") + homePage.fileItemName().eq(1).invoke("text").as("fileNameB") + + // navigate to the preview modal for the first file + homePage.fileItemKebabButton().first().click() + homePage.previewMenuOption().eq(0).click() + previewModal.body().should("exist") + + // ensure the correct file is being previewed + cy.get("@fileNameA").then(($fileNameA) => { + previewModal.fileNameLabel().should("contain.text", $fileNameA) + previewModal.contentContainer().should("be.visible") + previewModal.unsupportedFileLabel().should("not.exist") + }) + + // browse to the next file + previewModal.nextFileButton().click() + cy.get("@fileNameB").then(($fileNameB) => { + previewModal.fileNameLabel().should("contain.text", $fileNameB) + previewModal.contentContainer().should("be.visible") + previewModal.unsupportedFileLabel().should("not.exist") + }) + + // return to the previous file + previewModal.previousFileButton().click() + cy.get("@fileNameA").then(($fileNameA) => { + previewModal.fileNameLabel().should("contain.text", $fileNameA) + previewModal.contentContainer().should("be.visible") + previewModal.unsupportedFileLabel().should("not.exist") + }) + + // close the preview modal to return to the home page + previewModal.closeButton().click() + previewModal.body().should("not.exist") + homePage.appHeaderLabel().should("exist") + }) + + it("can see option to download file from the preview screen", () => { + cy.web3Login({ clearCSFBucket: true }) + homePage.uploadFile("../fixtures/uploadedFiles/logo.png") + homePage.fileItemName().first().invoke("text").as("fileNameA") + homePage.fileItemKebabButton().click() + homePage.previewMenuOption().click() + previewModal.body().should("exist") + previewModal.previewKebabButton().click() + previewModal.downloadFileButton().should("be.visible") + }) + + it("can see unsupported file info and download option", () => { + cy.web3Login({ clearCSFBucket: true }) + + // add an unsupported file + homePage.uploadFile("../fixtures/uploadedFiles/file.zip") + + // setup an api intercepter for download requests + cy.intercept("POST", "https://stage.imploy.site/api/v1/bucket/*/download").as("downloadRequest").then(() => { + homePage.fileItemName().dblclick() + previewModal.unsupportedFileLabel().should("exist") + previewModal.downloadUnsupportedFileButton().should("be.visible") + + // ensure the download request contains the correct file + cy.get("@downloadRequest").its("request.body").should("contain", { + path: "/file.zip" + }) + }) + + // return to the home and ensure preview menu option is not shown for unsupported file + previewModal.closeButton().click() + homePage.fileItemKebabButton().click() + homePage.previewMenuOption().should("not.exist") + }) + }) +}) diff --git a/packages/files-ui/package.json b/packages/files-ui/package.json index 5cbd9a2373..96fbb82068 100644 --- a/packages/files-ui/package.json +++ b/packages/files-ui/package.json @@ -67,7 +67,7 @@ "@types/yup": "^0.29.9", "@types/zxcvbn": "^4.4.0", "babel-plugin-macros": "^2.8.0", - "cypress": "^8.3.1", + "cypress": "^8.4", "cypress-file-upload": "^5.0.8", "cypress-pipe": "^2.0.0" }, diff --git a/packages/files-ui/src/App.tsx b/packages/files-ui/src/App.tsx index 8a9ee53623..5e25f4cf1f 100644 --- a/packages/files-ui/src/App.tsx +++ b/packages/files-ui/src/App.tsx @@ -3,7 +3,7 @@ import { init as initSentry, ErrorBoundary, showReportDialog } from "@sentry/rea import { Web3Provider } from "@chainsafe/web3-context" import { ThemeSwitcher } from "@chainsafe/common-theme" import "@chainsafe/common-theme/dist/font-faces.css" -import { Button, CssBaseline, Modal, Router, ToasterProvider, Typography } from "@chainsafe/common-components" +import { Button, CssBaseline, Modal, Router, ToastProvider, Typography } from "@chainsafe/common-components" import { FilesProvider } from "./Contexts/FilesContext" import FilesRoutes from "./Components/FilesRoutes" import AppWrapper from "./Components/Layouts/AppWrapper" @@ -101,7 +101,10 @@ const App = () => { > - + { - + diff --git a/packages/files-ui/src/Components/FilesRoutes.tsx b/packages/files-ui/src/Components/FilesRoutes.tsx index d392c592eb..ca53bf18ee 100644 --- a/packages/files-ui/src/Components/FilesRoutes.tsx +++ b/packages/files-ui/src/Components/FilesRoutes.tsx @@ -25,7 +25,7 @@ export const ROUTE_LINKS = { SettingsDefault: `${SETTINGS_BASE}`, SettingsPath: (settingsPath: SettingsPath) => `${SETTINGS_BASE}/${settingsPath}`, PurchasePlan: "/purchase", - UserSurvey: "https://shrl.ink/Efyc", + UserSurvey: "https://calendly.com/colinschwarz/chainsafe-files-chat", Plans: "/plans", SharedFolders: "/shared-overview", SharedFolderBrowserRoot: "/shared", diff --git a/packages/files-ui/src/Components/Modules/DownloadProgressToast/DownloadToast.tsx b/packages/files-ui/src/Components/Modules/DownloadProgressToast/DownloadToast.tsx deleted file mode 100644 index ddf875ad67..0000000000 --- a/packages/files-ui/src/Components/Modules/DownloadProgressToast/DownloadToast.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import React from "react" -import { createStyles, makeStyles } from "@chainsafe/common-theme" -import { DownloadProgress } from "../../../Contexts/FilesContext" -import { ProgressBar, Typography, CheckCircleIcon, CloseCircleIcon } from "@chainsafe/common-components" -import clsx from "clsx" -import { Trans } from "@lingui/macro" -import { CSFTheme } from "../../../Themes/types" - -const useStyles = makeStyles( - ({ constants, palette, animation, breakpoints }: CSFTheme) => { - return createStyles({ - boxContainer: { - backgroundColor: palette.additional["gray"][3], - margin: `${constants.generalUnit}px 0`, - border: `1px solid ${palette.additional["gray"][6]}`, - padding: constants.generalUnit * 2, - borderRadius: 4 - }, - appearBox: { - animation: `$slideLeft ${animation.translate}ms`, - [breakpoints.down("md")]: { - animation: `$slideUp ${animation.translate}ms` - } - }, - "@keyframes slideLeft": { - from: { transform: "translate(100%)" }, - to: { transform: "translate(0)" } - }, - "@keyframes slideUp": { - from: { transform: "translate(0, 100%)" }, - to: { transform: "translate(0, 0)" } - }, - contentContainer: { - display: "flex", - alignItems: "center" - }, - marginBottom: { - marginBottom: constants.generalUnit - }, - icon: { - marginRight: constants.generalUnit * 2, - fill: constants.fileSystemItemRow.menuIcon - } - }) - } -) - -interface IDownloadToast { - downloadInProgress: DownloadProgress -} - -const DownloadToast: React.FC = ({ downloadInProgress }) => { - const { fileName, complete, error, progress, errorMessage, currentFileNumber, totalFileNumber } = downloadInProgress - const classes = useStyles() - const fileProgress = totalFileNumber > 1 && `${currentFileNumber}/${totalFileNumber}` - - return ( - <> -
- {!!complete && !error && ( -
- - - Download complete - -
- )} - {error && ( -
- - - {errorMessage} - -
- )} - {!complete && !error && ( -
- - Downloading {fileProgress} - {fileName} - - -
- )} -
- - ) -} - -export default DownloadToast diff --git a/packages/files-ui/src/Components/Modules/DownloadProgressToast/index.tsx b/packages/files-ui/src/Components/Modules/DownloadProgressToast/index.tsx deleted file mode 100644 index ecf54ab537..0000000000 --- a/packages/files-ui/src/Components/Modules/DownloadProgressToast/index.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from "react" -import { createStyles, ITheme, makeStyles } from "@chainsafe/common-theme" -import { useFiles } from "../../../Contexts/FilesContext" -import DownloadToast from "./DownloadToast" - -const useStyles = makeStyles(({ constants, zIndex, breakpoints }: ITheme) => { - const WIDTH = 400 - return createStyles({ - root: { - margin: constants.generalUnit * 3, - position: "fixed", - right: 0, - bottom: 0, - borderRadius: 4, - padding: constants.generalUnit, - width: WIDTH, - zIndex: zIndex?.layer1, - [breakpoints.down("md")]: { - margin: constants.generalUnit, - width: `calc(100% - ${constants.generalUnit * 2}px)` - } - } - }) -}) - -const DownloadProgressModals: React.FC = () => { - const classes = useStyles() - const { downloadsInProgress } = useFiles() - - if (downloadsInProgress.length === 0) { return null } - - if (downloadsInProgress.length > 0) { - return ( -
- {downloadsInProgress.map((downloadInProgress) => ( - - ))} -
- )} else { - return null - } -} - -export default DownloadProgressModals diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/BinFileBrowser.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/BinFileBrowser.tsx index c44141affd..295955e533 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/BinFileBrowser.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/BinFileBrowser.tsx @@ -6,7 +6,7 @@ import DragAndDrop from "../../../Contexts/DnDContext" import { t } from "@lingui/macro" import { CONTENT_TYPES } from "../../../Utils/Constants" import { IFilesTableBrowserProps } from "../../Modules/FileBrowsers/types" -import { useHistory, useLocation, useToaster } from "@chainsafe/common-components" +import { useHistory, useLocation, useToasts } from "@chainsafe/common-components" import { extractFileBrowserPathFromURL, getPathWithFile, getUrlSafePathWithFile } from "../../../Utils/pathUtils" import { ROUTE_LINKS } from "../../FilesRoutes" import { FileBrowserContext } from "../../../Contexts/FileBrowserContext" @@ -16,7 +16,7 @@ import { parseFileContentResponse } from "../../../Utils/Helpers" const BinFileBrowser: React.FC = ({ controls = false }: IFileBrowserModuleProps) => { const { buckets, refreshBuckets } = useFiles() const { filesApiClient } = useFilesApi() - const { addToastMessage } = useToaster() + const { addToast } = useToasts() const [loadingCurrentPath, setLoadingCurrentPath] = useState(false) const [pathContents, setPathContents] = useState([]) const { pathname } = useLocation() @@ -69,20 +69,20 @@ const BinFileBrowser: React.FC = ({ controls = false }: refreshContents() refreshBuckets() const message = `${itemToDelete.isFolder ? t`Folder` : t`File`} ${t`deleted successfully`}` - addToastMessage({ - message: message, - appearance: "success" + addToast({ + title: message, + type: "success" }) return Promise.resolve() } catch (error) { const message = `${t`There was an error deleting this`} ${itemToDelete.isFolder ? t`folder` : t`file`}` - addToastMessage({ - message: message, - appearance: "error" + addToast({ + title: message, + type: "error" }) return Promise.reject() } - }, [addToastMessage, bucket, currentPath, pathContents, refreshContents, refreshBuckets, filesApiClient]) + }, [addToast, bucket, currentPath, pathContents, refreshContents, refreshBuckets, filesApiClient]) const deleteItems = useCallback(async (cids: string[]) => { await Promise.all( @@ -110,19 +110,19 @@ const BinFileBrowser: React.FC = ({ controls = false }: const message = `${itemToRestore.isFolder ? t`Folder` : t`File`} ${t`recovered successfully`}` - addToastMessage({ - message: message, - appearance: "success" + addToast({ + title: message, + type: "success" }) } catch (error) { const message = `${t`There was an error recovering this`} ${itemToRestore.isFolder ? t`folder` : t`file`}` - addToastMessage({ - message: message, - appearance: "error" + addToast({ + title: message, + type: "error" }) } })).finally(refreshContents) - }, [addToastMessage, pathContents, refreshContents, filesApiClient, bucket, buckets, currentPath]) + }, [addToast, pathContents, refreshContents, filesApiClient, bucket, buckets, currentPath]) const viewFolder = useCallback((cid: string) => { const fileSystemItem = pathContents.find(f => f.cid === cid) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/CSFFileBrowser.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/CSFFileBrowser.tsx index 5dd24d422e..b14364eafb 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/CSFFileBrowser.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/CSFFileBrowser.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useMemo, useState } from "react" -import { Crumb, useToaster, useHistory, useLocation } from "@chainsafe/common-components" +import { Crumb, useToasts, useHistory, useLocation } from "@chainsafe/common-components" import { useFiles, FileSystemItem } from "../../../Contexts/FilesContext" import { getArrayOfPaths, @@ -26,11 +26,10 @@ const CSFFileBrowser: React.FC = () => { const { downloadFile, uploadFiles, - uploadsInProgress, buckets } = useFiles() const { filesApiClient } = useFilesApi() - const { addToastMessage } = useToaster() + const { addToast } = useToasts() const [loadingCurrentPath, setLoadingCurrentPath] = useState(false) const [pathContents, setPathContents] = useState([]) const { redirect } = useHistory() @@ -96,24 +95,25 @@ const CSFFileBrowser: React.FC = () => { const message = `${ itemToDelete.isFolder ? t`Folder` : t`File` } ${t`deleted successfully`}` - addToastMessage({ - message: message, - appearance: "success" + const id = addToast({ + title: message, + type: "success" }) + console.log(id) } return Promise.resolve() } catch (error) { const message = `${t`There was an error deleting this`} ${ itemToDelete.isFolder ? t`folder` : t`file` }` - addToastMessage({ - message: message, - appearance: "error" + addToast({ + title: message, + type: "error" }) return Promise.reject() }} )).finally(refreshContents) - }, [addToastMessage, currentPath, pathContents, refreshContents, filesApiClient, bucket, buckets]) + }, [addToast, currentPath, pathContents, refreshContents, filesApiClient, bucket, buckets]) // Rename const renameItem = useCallback(async (cid: string, newName: string) => { @@ -142,21 +142,21 @@ const CSFFileBrowser: React.FC = () => { itemToMove.isFolder ? t`Folder` : t`File` } ${t`moved successfully`}` - addToastMessage({ - message: message, - appearance: "success" + addToast({ + title: message, + type: "success" }) } catch (error) { const message = `${t`There was an error moving this`} ${ itemToMove.isFolder ? t`folder` : t`file` }` - addToastMessage({ - message: message, - appearance: "error" + addToast({ + title: message, + type: "error" }) } })).finally(refreshContents) - }, [addToastMessage, pathContents, refreshContents, filesApiClient, bucket, currentPath]) + }, [addToast, pathContents, refreshContents, filesApiClient, bucket, currentPath]) const handleDownload = useCallback(async (cid: string) => { const itemToDownload = pathContents.find(item => item.cid === cid) @@ -185,16 +185,16 @@ const CSFFileBrowser: React.FC = () => { } } if (hasFolder) { - addToastMessage({ - message: "Folder uploads are not supported currently", - appearance: "error" + addToast({ + title: t`Folder uploads are not supported currently`, + type: "error" }) } else { uploadFiles(bucket, files, path) .then(() => refreshContents()) .catch(console.error) } - }, [addToastMessage, uploadFiles, bucket, refreshContents]) + }, [addToast, uploadFiles, bucket, refreshContents]) const viewFolder = useCallback((cid: string) => { const fileSystemItem = pathContents.find(f => f.cid === cid) @@ -232,7 +232,6 @@ const CSFFileBrowser: React.FC = () => { renameItem: renameItem, viewFolder, handleUploadOnDrop, - uploadsInProgress, loadingCurrentPath, showUploadsInTable: true, sourceFiles: pathContents, diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/SearchFileBrowser.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/SearchFileBrowser.tsx index ad8294333a..3fc8cd8c90 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/SearchFileBrowser.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/SearchFileBrowser.tsx @@ -4,7 +4,7 @@ import { IFileBrowserModuleProps, IFilesTableBrowserProps } from "./types" import FilesList from "./views/FilesList" import { CONTENT_TYPES } from "../../../Utils/Constants" import DragAndDrop from "../../../Contexts/DnDContext" -import { useHistory, useLocation, useToaster } from "@chainsafe/common-components" +import { useHistory, useLocation, useToasts } from "@chainsafe/common-components" import { getArrayOfPaths, getParentPathFromFilePath, getURISafePathFromArray } from "../../../Utils/pathUtils" import { ROUTE_LINKS } from "../../FilesRoutes" import { t } from "@lingui/macro" @@ -18,7 +18,7 @@ const SearchFileBrowser: React.FC = ({ controls = false const searchTerm = useMemo(() => decodeURIComponent(pathname.split("/").slice(2)[0]), [pathname]) const { redirect } = useHistory() - const { addToastMessage } = useToaster() + const { addToast } = useToasts() const bucket = useMemo(() => buckets.find(b => b.type === "csf"), [buckets]) @@ -29,13 +29,13 @@ const SearchFileBrowser: React.FC = ({ controls = false const results = await filesApiClient.searchFiles({ bucket_id: bucket.id, query: searchString }) return results } catch (err) { - addToastMessage({ - message: t`There was an error getting search results`, - appearance: "error" + addToast({ + title: t`There was an error getting search results`, + type: "error" }) return Promise.reject(err) } - }, [addToastMessage, bucket, filesApiClient]) + }, [addToast, bucket, filesApiClient]) useEffect(() => { getSearchResults(searchTerm) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFileBrowser.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFileBrowser.tsx index bc36e145a1..635953d884 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFileBrowser.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFileBrowser.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useMemo, useState } from "react" -import { useToaster, useHistory, useLocation, Crumb } from "@chainsafe/common-components" +import { useToasts, useHistory, useLocation, Crumb } from "@chainsafe/common-components" import { getArrayOfPaths, getURISafePathFromArray, @@ -22,7 +22,7 @@ import FilesList from "./views/FilesList" const SharedFileBrowser = () => { const { downloadFile, uploadFiles, buckets, refreshBuckets, getStorageSummary } = useFiles() const { filesApiClient } = useFilesApi() - const { addToastMessage } = useToaster() + const { addToast } = useToasts() const [loadingCurrentPath, setLoadingCurrentPath] = useState(false) const [pathContents, setPathContents] = useState([]) const { redirect } = useHistory() @@ -113,22 +113,22 @@ const SharedFileBrowser = () => { const message = `${ itemToDelete.isFolder ? t`Folder` : t`File` } ${t`deleted successfully`}` - addToastMessage({ - message: message, - appearance: "success" + addToast({ + title: message, + type: "success" }) return Promise.resolve() } catch (error) { const message = `${t`There was an error deleting this`} ${ itemToDelete.isFolder ? t`folder` : t`file` }` - addToastMessage({ - message: message, - appearance: "error" + addToast({ + title: message, + type: "error" }) return Promise.reject() } - }, [addToastMessage, bucket, currentPath, pathContents, refreshContents, refreshBuckets, filesApiClient]) + }, [addToast, bucket, currentPath, pathContents, refreshContents, refreshBuckets, filesApiClient]) const deleteItems = useCallback(async (cids: string[]) => { await Promise.all( @@ -186,16 +186,16 @@ const SharedFileBrowser = () => { } } if (hasFolder) { - addToastMessage({ - message: "Folder uploads are not supported currently", - appearance: "error" + addToast({ + title: t`Folder uploads are not supported currently`, + type: "error" }) } else { uploadFiles(bucket, files, path) .then(() => refreshContents()) .catch(console.error) } - }, [addToastMessage, uploadFiles, bucket, refreshContents]) + }, [addToast, uploadFiles, bucket, refreshContents]) const bulkOperations: IBulkOperations = useMemo(() => ({ [CONTENT_TYPES.Directory]: ["download", "move", "delete"], diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/types.ts b/packages/files-ui/src/Components/Modules/FileBrowsers/types.ts index 7f77eeaeef..889f52e713 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/types.ts +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/types.ts @@ -1,5 +1,5 @@ import { Crumb } from "@chainsafe/common-components" -import { BucketType, FileSystemItem, UploadProgress } from "../../../Contexts/FilesContext" +import { BucketType, FileSystemItem } from "../../../Contexts/FilesContext" export type SharedFolderUserPermission = "read" | "write" export type SharedFolderModalMode = "create" | "edit" @@ -71,7 +71,6 @@ export interface IFilesTableBrowserProps currentPath: string bucketType: BucketType loadingCurrentPath: boolean - uploadsInProgress?: UploadProgress[] showUploadsInTable: boolean sourceFiles: FileSystemItem[] crumbs: Crumb[] | undefined diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx index 6e67f88dea..e4ad864e98 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx @@ -6,13 +6,11 @@ import { SortDirection, Table, TableBody, - TableCell, TableHead, TableHeadCell, TableRow, Typography, Breadcrumb, - CircularProgressBar, Button, PlusCircleIcon, UploadIcon, @@ -328,8 +326,6 @@ const FilesList = ({ isShared = false }: Props) => { currentPath, refreshContents, loadingCurrentPath, - uploadsInProgress, - showUploadsInTable, allowDropUpload, itemOperations, getPath, @@ -841,7 +837,7 @@ const FilesList = ({ isShared = false }: Props) => { One sec, getting files ready…
- {(desktop && items.length === 0) || (!desktop && items.length === 0 && uploadsInProgress?.length === 0) + {!items.length ? (
{ )} - {!desktop && showUploadsInTable && - uploadsInProgress?.filter( - (uploadInProgress) => - uploadInProgress.path === currentPath && - !uploadInProgress.complete && - !uploadInProgress.error - ) - .map((uploadInProgress) => ( - - - - - - {uploadInProgress.noOfFiles > 1 - ? t`Uploading ${uploadInProgress.noOfFiles} files` - : uploadInProgress.fileName} - - - - ))} {items.map((file, index) => ( - + Download @@ -279,16 +279,18 @@ const FilePreviewModal = ({ file, nextFile, previousFile, closePreview, filePath {name} } options={menuItems} style={{ @@ -303,6 +305,7 @@ const FilePreviewModal = ({ file, nextFile, previousFile, closePreview, filePath flexDirection="row" alignItems="stretch" className={classes.previewContainer} + data-cy="modal-container-preview" > {desktop && ( {previousFile && ( )} @@ -333,6 +337,7 @@ const FilePreviewModal = ({ file, nextFile, previousFile, closePreview, filePath
{isDownloading && (
@@ -366,6 +371,7 @@ const FilePreviewModal = ({ file, nextFile, previousFile, closePreview, filePath File format not supported. @@ -373,6 +379,7 @@ const FilePreviewModal = ({ file, nextFile, previousFile, closePreview, filePath className={classes.downloadButton} variant="outline" onClick={handleDownload} + data-cy="button-download-unsupported-file" > Download @@ -397,6 +404,7 @@ const FilePreviewModal = ({ file, nextFile, previousFile, closePreview, filePath diff --git a/packages/files-ui/src/Components/Modules/LoginModule/InitialScreen.tsx b/packages/files-ui/src/Components/Modules/LoginModule/InitialScreen.tsx index f9cfe992c9..0da2e6c486 100644 --- a/packages/files-ui/src/Components/Modules/LoginModule/InitialScreen.tsx +++ b/packages/files-ui/src/Components/Modules/LoginModule/InitialScreen.tsx @@ -65,7 +65,7 @@ const useStyles = makeStyles( fontWeight: 400 }, [breakpoints.up("md")]: { - padding: `${constants.generalUnit * 30}px ${constants.generalUnit * 8}px`, + padding: `${constants.generalUnit * 20}px ${constants.generalUnit * 8}px`, "& > *": { paddingBottom: `${constants.generalUnit * 5}px` } @@ -208,6 +208,7 @@ const InitialScreen = ({ className }: IInitialScreen) => { } catch (error) { let errorMessage = t`There was an error authenticating` console.log(error) + if (Array.isArray(error) && error[0]) { if ( error[0].type === "signature" && @@ -218,13 +219,16 @@ const InitialScreen = ({ className }: IInitialScreen) => { sure you have activated your wallet.` } } + // WalletConnect be sassy - if (error?.message === "Just nope" || error?.code === 4001) { + if ((error instanceof Error && error.message === "Just nope") || ((error as any).code === 4001)) { errorMessage = t`Failed to get signature` } - if (error?.message === "user closed popup") { + + if (error instanceof Error && error?.message === "user closed popup") { errorMessage = t`The authentication popup was closed` } + setError(errorMessage) } setIsConnecting(false) diff --git a/packages/files-ui/src/Components/Modules/PreviewRenderers/ImagePreview.tsx b/packages/files-ui/src/Components/Modules/PreviewRenderers/ImagePreview.tsx index eb8820ac66..997a693218 100644 --- a/packages/files-ui/src/Components/Modules/PreviewRenderers/ImagePreview.tsx +++ b/packages/files-ui/src/Components/Modules/PreviewRenderers/ImagePreview.tsx @@ -71,13 +71,22 @@ const ImagePreview: React.FC = ({ contents }) => { <> {desktop && (
- - -
diff --git a/packages/files-ui/src/Components/Modules/SearchModule.tsx b/packages/files-ui/src/Components/Modules/SearchModule.tsx index 3ec537a366..2a87556cd6 100644 --- a/packages/files-ui/src/Components/Modules/SearchModule.tsx +++ b/packages/files-ui/src/Components/Modules/SearchModule.tsx @@ -12,7 +12,7 @@ import { SearchBar, Typography, useHistory, - useToaster + useToasts } from "@chainsafe/common-components" import { useState } from "react" import clsx from "clsx" @@ -160,7 +160,7 @@ const SearchModule: React.FC = ({ const [searchResults, setSearchResults] = useState<{results: SearchEntry[]; query: string} | undefined>(undefined) const ref = useRef(null) const { buckets } = useFiles() - const { addToastMessage } = useToaster() + const { addToast } = useToasts() const { filesApiClient } = useFilesApi() const bucket = useMemo(() => buckets.find(b => b.type === "csf"), [buckets]) @@ -171,13 +171,13 @@ const SearchModule: React.FC = ({ const results = await filesApiClient.searchFiles({ bucket_id: bucket.id, query: searchString }) return results } catch (err) { - addToastMessage({ - message: t`There was an error getting search results`, - appearance: "error" + addToast({ + title: t`There was an error getting search results`, + type: "error" }) return Promise.reject(err) } - }, [addToastMessage, bucket, filesApiClient]) + }, [addToast, bucket, filesApiClient]) const { redirect } = useHistory() diff --git a/packages/files-ui/src/Components/Modules/Settings/ProfileTab/index.tsx b/packages/files-ui/src/Components/Modules/Settings/ProfileTab/index.tsx index c30514895e..560fb26332 100644 --- a/packages/files-ui/src/Components/Modules/Settings/ProfileTab/index.tsx +++ b/packages/files-ui/src/Components/Modules/Settings/ProfileTab/index.tsx @@ -5,7 +5,7 @@ import { Grid, Button, Typography, - useToaster, + useToasts, RadioInput, TextInput, CheckIcon @@ -187,7 +187,7 @@ const profileValidation = yup.object().shape({ const ProfileView = () => { const { themeKey, setTheme } = useThemeSwitcher() - const { addToastMessage } = useToaster() + const { addToast } = useToasts() const { profile, updateProfile, addUsername, lookupOnUsername } = useUser() const { publicKey } = useThresholdKey() const [updatingProfile, setUpdatingProfile] = useState(false) @@ -214,10 +214,10 @@ const ProfileView = () => { try { setUpdatingProfile(true) await updateProfile(firstName, lastName) - addToastMessage({ message: t`Profile updated` }) + addToast({ title: t`Profile updated`, type: "success" }) setUpdatingProfile(false) } catch (error) { - addToastMessage({ message: error, appearance: "error" }) + addToast({ title: error, type: "error" }) setUpdatingProfile(false) } } @@ -305,7 +305,7 @@ const ProfileView = () => { setUsernameData({ ...usernameData, loading: true }) addUsername(username) .then(() => { - addToastMessage({ message: t`Username set successfully` }) + addToast({ title: t`Username set successfully`, type: "success" }) }) .catch((error) => { setUsernameData({ diff --git a/packages/files-ui/src/Components/Modules/Settings/SubscriptionTab/AddCardModal.tsx b/packages/files-ui/src/Components/Modules/Settings/SubscriptionTab/AddCardModal.tsx index 32d0ea0576..48eebb700e 100644 --- a/packages/files-ui/src/Components/Modules/Settings/SubscriptionTab/AddCardModal.tsx +++ b/packages/files-ui/src/Components/Modules/Settings/SubscriptionTab/AddCardModal.tsx @@ -1,4 +1,4 @@ -import { Button, Grid, TextInput, Typography, useToaster } from "@chainsafe/common-components" +import { Button, Grid, TextInput, Typography, useToasts } from "@chainsafe/common-components" import { createStyles, makeStyles } from "@chainsafe/common-theme" import React, { useState, useCallback } from "react" import { CSFTheme } from "../../../../Themes/types" @@ -76,7 +76,7 @@ const CreateFolderModal = ({ isModalOpen, onClose }: ICreateFolderModalProps) => const [error, setError] = useState("") const [loading, setLoading] = useState(false) const { addCard, getCardTokenFromStripe } = useBilling() - const { addToastMessage } = useToaster() + const { addToast } = useToasts() const onCloseModal = useCallback(() => { setCardInputs({ cardNumber: "", cardExpiry: "", cardCvc: "" }) @@ -106,8 +106,9 @@ const CreateFolderModal = ({ isModalOpen, onClose }: ICreateFolderModalProps) => addCard(resp.data.id) .then(() => { onCloseModal() - addToastMessage({ - message: t`Card added successfully` + addToast({ + title: t`Card added successfully`, + type: "success" }) }).catch((e) => { setError(t`Something went wrong, please try again`) @@ -118,7 +119,7 @@ const CreateFolderModal = ({ isModalOpen, onClose }: ICreateFolderModalProps) => setError(t`Card details could not be validated`) setLoading(false) }) - }, [addToastMessage, cardInputs, cardName, onCloseModal, getCardTokenFromStripe, addCard]) + }, [cardName, cardInputs, getCardTokenFromStripe, addCard, onCloseModal, addToast]) return ( { - return createStyles({ - boxContainer: { - backgroundColor: palette.additional["gray"][3], - margin: `${constants.generalUnit}px 0`, - border: `1px solid ${palette.additional["gray"][6]}`, - padding: constants.generalUnit * 2, - borderRadius: 4, - [breakpoints.down("md")]: { - margin: 0 - } - }, - appearBox: { - animation: `$slideLeft ${animation.translate}ms`, - [breakpoints.down("md")]: { - animation: `$slideUp ${animation.translate}ms` - } - }, - "@keyframes slideLeft": { - from: { transform: "translate(100%)" }, - to: { transform: "translate(0)" } - }, - "@keyframes slideUp": { - from: { transform: "translate(0, 100%)" }, - to: { transform: "translate(0, 0)" } - }, - contentContainer: { - display: "flex", - alignItems: "center", - "& svg": { - fill: constants.uploadAlert.icon - } - }, - marginBottom: { - marginBottom: constants.generalUnit - }, - icon: { - marginRight: constants.generalUnit * 2, - fill: constants.fileSystemItemRow.menuIcon - } - }) - } -) - -interface ITransferToast { - transferInProgress: TransferProgress -} - -const TransferToast: React.FC = ({ transferInProgress }) => { - const { complete, error, progress, errorMessage, operation } = transferInProgress - const classes = useStyles() - - return ( - <> -
- { !!error && (
- - - {errorMessage} - -
) } - { !complete && !error && (
- - - Sharing your file ({operation === "Download" ? t`Downloading` : t`Encrypting & uploading` }) - - - -
) } - { complete && !error && (
- - - Transfer complete - -
) } -
- - ) -} - -export default TransferToast diff --git a/packages/files-ui/src/Components/Modules/TransferProgressToast/index.tsx b/packages/files-ui/src/Components/Modules/TransferProgressToast/index.tsx deleted file mode 100644 index 134a9ac986..0000000000 --- a/packages/files-ui/src/Components/Modules/TransferProgressToast/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React from "react" -import { createStyles, ITheme, makeStyles } from "@chainsafe/common-theme" -import { useFiles } from "../../../Contexts/FilesContext" -import TransferToast from "./TransferToast" - -const useStyles = makeStyles(({ constants, zIndex, breakpoints }: ITheme) => { - const WIDTH = 400 - return createStyles({ - root: { - margin: constants.generalUnit * 3, - position: "fixed", - right: 0, - bottom: 0, - borderRadius: 4, - padding: constants.generalUnit, - width: WIDTH, - zIndex: zIndex?.layer1, - [breakpoints.down("md")]: { - margin: constants.generalUnit, - width: `calc(100% - ${constants.generalUnit * 2}px)` - } - } - }) -}) - -const TransferProgressToasts: React.FC = () => { - const classes = useStyles() - const { transfersInProgress } = useFiles() - - if (transfersInProgress.length === 0) { return null } - return (
- {transfersInProgress.map( - (transferInProgress) => - - )} -
- ) -} - -export default TransferProgressToasts diff --git a/packages/files-ui/src/Components/Modules/UploadProgressToast/UploadToast.tsx b/packages/files-ui/src/Components/Modules/UploadProgressToast/UploadToast.tsx deleted file mode 100644 index b2c0be46c7..0000000000 --- a/packages/files-ui/src/Components/Modules/UploadProgressToast/UploadToast.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import React from "react" -import { createStyles, makeStyles } from "@chainsafe/common-theme" -import { UploadProgress } from "../../../Contexts/FilesContext" -import { ProgressBar, Typography, CheckCircleIcon, CloseCircleIcon } from "@chainsafe/common-components" -import clsx from "clsx" -import { plural, Trans } from "@lingui/macro" -import { CSFTheme } from "../../../Themes/types" - -const useStyles = makeStyles( - ({ constants, palette, animation, breakpoints }: CSFTheme) => { - return createStyles({ - boxContainer: { - backgroundColor: palette.additional["gray"][3], - margin: `${constants.generalUnit}px 0`, - border: `1px solid ${palette.additional["gray"][6]}`, - padding: constants.generalUnit * 2, - borderRadius: 4, - [breakpoints.down("md")]: { - margin: 0 - } - }, - appearBox: { - animation: `$slideLeft ${animation.translate}ms`, - [breakpoints.down("md")]: { - animation: `$slideUp ${animation.translate}ms` - } - }, - "@keyframes slideLeft": { - from: { transform: "translate(100%)" }, - to: { transform: "translate(0)" } - }, - "@keyframes slideUp": { - from: { transform: "translate(0, 100%)" }, - to: { transform: "translate(0, 0)" } - }, - contentContainer: { - display: "flex", - alignItems: "center", - "& svg": { - fill: constants.uploadAlert.icon - } - }, - marginBottom: { - marginBottom: constants.generalUnit - }, - icon: { - marginRight: constants.generalUnit * 2, - fill: constants.fileSystemItemRow.menuIcon - } - }) - } -) - -interface IUploadToast { - uploadInProgress: UploadProgress -} - -const UploadToast: React.FC = (props) => { - const { uploadInProgress } = props - const { complete, error, noOfFiles, progress, errorMessage } = uploadInProgress - const classes = useStyles() - - return ( - <> -
- {complete ? ( -
- - - Upload complete - -
- ) : error ? ( -
- - - {errorMessage} - -
- ) : ( -
- {plural(noOfFiles, { - one: `Uploading and encrypting ${noOfFiles} file`, - other: `Uploading and encrypting ${noOfFiles} files` - })} - -
- )} -
- - ) -} - -export default UploadToast diff --git a/packages/files-ui/src/Components/Modules/UploadProgressToast/index.tsx b/packages/files-ui/src/Components/Modules/UploadProgressToast/index.tsx deleted file mode 100644 index 9a2c07beb2..0000000000 --- a/packages/files-ui/src/Components/Modules/UploadProgressToast/index.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from "react" -import { - createStyles, - ITheme, - makeStyles, - useThemeSwitcher -} from "@chainsafe/common-theme" -import { useFiles } from "../../../Contexts/FilesContext" -import UploadToast from "./UploadToast" - -const useStyles = makeStyles(({ constants, zIndex, breakpoints }: ITheme) => { - const WIDTH = 400 - return createStyles({ - root: { - margin: constants.generalUnit * 3, - position: "fixed", - right: 0, - bottom: 0, - borderRadius: 4, - padding: constants.generalUnit, - width: WIDTH, - zIndex: zIndex?.layer1, - [breakpoints.down("md")]: { - margin: constants.generalUnit, - width: `calc(100% - ${constants.generalUnit * 2}px)` - } - } - }) -}) - -const UploadProgressModals: React.FC = () => { - const classes = useStyles() - const { uploadsInProgress } = useFiles() - const { desktop } = useThemeSwitcher() - - if (uploadsInProgress.length === 0) { return null } - return (
- {uploadsInProgress.map( - (uploadInProgress) => - (desktop || uploadInProgress.complete || uploadInProgress.error) && ( - - ) - )} -
- ) -} - -export default UploadProgressModals diff --git a/packages/files-ui/src/Components/SurveyBanner.tsx b/packages/files-ui/src/Components/SurveyBanner.tsx index fc0ccceb21..ea2cc52334 100644 --- a/packages/files-ui/src/Components/SurveyBanner.tsx +++ b/packages/files-ui/src/Components/SurveyBanner.tsx @@ -18,7 +18,8 @@ const useStyles = makeStyles( paddingLeft: constants.generalUnit * 2, marginTop: constants.generalUnit, borderRadius: 2, - display: "flex" + display: "flex", + alignItems: "center" }, banner: { color: constants.surveyBanner.color, @@ -34,21 +35,16 @@ const useStyles = makeStyles( }, crossIconButton: { cursor: "pointer", - - "& span": { - display: "flex", - alignContent: "center", - justifyContent: "center", - height: "100%", - fontSize: 12, - marginRight: constants.generalUnit - }, - "& svg": { - fill: constants.surveyBanner.color - } + height: constants.generalUnit * 2 }, spacer: { flex: 1 + }, + icon: { + fontSize: 12, + "& svg": { + fill: constants.surveyBanner.color + } } }) }) @@ -77,13 +73,13 @@ const SurveyBanner = ({ onHide }: Props) => { variant="body1" className={classes.banner}> - Help us improve File in less than 1 minute. + Want to help shape this product? - Continue + Schedule a 15 min call
@@ -91,7 +87,10 @@ const SurveyBanner = ({ onHide }: Props) => { className={classes.crossIconButton} onClick={onClose} > - +
)} diff --git a/packages/files-ui/src/Contexts/FileBrowserContext.tsx b/packages/files-ui/src/Contexts/FileBrowserContext.tsx index 4252705ebb..77c979342a 100644 --- a/packages/files-ui/src/Contexts/FileBrowserContext.tsx +++ b/packages/files-ui/src/Contexts/FileBrowserContext.tsx @@ -1,8 +1,7 @@ import { Crumb } from "@chainsafe/common-components" import React, { useContext } from "react" import { FileOperation, IBulkOperations, IFileBrowserModuleProps } from "../Components/Modules/FileBrowsers/types" -import { BucketKeyPermission, FileSystemItem, UploadProgress } from "./FilesContext" - +import { BucketKeyPermission, FileSystemItem } from "./FilesContext" interface FileBrowserContext extends IFileBrowserModuleProps { bucket?: BucketKeyPermission @@ -25,7 +24,6 @@ interface FileBrowserContext extends IFileBrowserModuleProps { refreshContents?: () => void currentPath: string loadingCurrentPath: boolean - uploadsInProgress?: UploadProgress[] showUploadsInTable: boolean sourceFiles: FileSystemItem[] crumbs: Crumb[] | undefined diff --git a/packages/files-ui/src/Contexts/FilesContext.tsx b/packages/files-ui/src/Contexts/FilesContext.tsx index 770304f94f..189f776cd2 100644 --- a/packages/files-ui/src/Contexts/FilesContext.tsx +++ b/packages/files-ui/src/Contexts/FilesContext.tsx @@ -8,62 +8,24 @@ import { BucketSummaryResponse, LookupUser } from "@chainsafe/files-api-client" -import React, { useCallback, useEffect, useReducer } from "react" +import React, { useCallback, useEffect } from "react" import { useState } from "react" import { decryptFile, encryptFile } from "../Utils/encryption" -import { v4 as uuidv4 } from "uuid" -import { useToaster } from "@chainsafe/common-components" -import { downloadsInProgressReducer, transfersInProgressReducer, uploadsInProgressReducer } from "./FilesReducers" +import { ToastParams, useToasts } from "@chainsafe/common-components" import axios, { CancelToken } from "axios" -import { t } from "@lingui/macro" +import { plural, t } from "@lingui/macro" import { parseFileContentResponse, readFileAsync } from "../Utils/Helpers" import { useBeforeunload } from "react-beforeunload" import { useThresholdKey } from "./ThresholdKeyContext" import { useFilesApi } from "./FilesApiContext" import { useUser } from "./UserContext" import { getPathWithFile, getRelativePath } from "../Utils/pathUtils" -import UploadProgressToasts from "../Components/Modules/UploadProgressToast" -import DownloadProgressToasts from "../Components/Modules/DownloadProgressToast" -import TransferProgressToasts from "../Components/Modules/TransferProgressToast" import { Zippable, zipSync } from "fflate" type FilesContextProps = { children: React.ReactNode | React.ReactNode[] } -export type UploadProgress = { - id: string - fileName: string - progress: number - error: boolean - errorMessage?: string - complete: boolean - noOfFiles: number - path: string -} - -export type DownloadProgress = { - id: string - fileName: string - progress: number - currentFileNumber?: number - totalFileNumber: number - error: boolean - errorMessage?: string - complete: boolean -} - -export type TransferOperation = "Download" | "Encrypt & Upload" - -export type TransferProgress = { - id: string - operation: TransferOperation - progress: number - error: boolean - errorMessage?: string - complete: boolean -} - export type SharedFolderUser = { uuid: string pubKey: string @@ -95,8 +57,6 @@ export type BucketKeyPermission = Omit Promise @@ -123,7 +83,6 @@ type FilesContext = { destinationBucket: BucketKeyPermission, deleteFromSource?: boolean ) => Promise - transfersInProgress: TransferProgress[] downloadMultipleFiles: (fileItems: FileSystemItem[], currentPath: string, bucketId: string) => void } @@ -136,7 +95,6 @@ interface FileSystemItemPath extends FileSystemItem { path: string } -const REMOVE_TOAST_DELAY = 5000 const MAX_FILE_SIZE = 2 * 1024 ** 3 const FilesContext = React.createContext(undefined) @@ -152,7 +110,7 @@ const FilesProvider = ({ children }: FilesContextProps) => { validateMasterPassword } = useFilesApi() const { publicKey, encryptForPublicKey, decryptMessageWithThresholdKey } = useThresholdKey() - const { addToastMessage } = useToaster() + const { addToast, updateToast } = useToasts() const [personalEncryptionKey, setPersonalEncryptionKey] = useState() const [buckets, setBuckets] = useState([]) const [storageSummary, setStorageSummary] = useState() @@ -321,17 +279,17 @@ const FilesProvider = ({ children }: FilesContextProps) => { secureThresholdKeyAccount(encryptedKey) } - const [uploadsInProgress, dispatchUploadsInProgress] = useReducer(uploadsInProgressReducer, []) - const [downloadsInProgress, dispatchDownloadsInProgress] = useReducer(downloadsInProgressReducer, []) - const [transfersInProgress, dispatchTransfersInProgress] = useReducer(transfersInProgressReducer, []) + const [uploadsInProgress, setUploadsInProgress] = useState(false) + const [downloadsInProgress, setDownloadsInProgress] = useState(false) + const [transfersInProgress, setTransfersInProgress] = useState(false) const [closeIntercept, setCloseIntercept] = useState() useEffect(() => { - if (downloadsInProgress.length > 0) { + if (downloadsInProgress) { setCloseIntercept("Download in progress, are you sure?") - } else if (uploadsInProgress.length > 0) { + } else if (uploadsInProgress) { setCloseIntercept("Upload in progress, are you sure?") - } else if (transfersInProgress.length > 0) { + } else if (transfersInProgress) { setCloseIntercept("Transfer is in progress, are you sure?") } else if (closeIntercept !== undefined) { setCloseIntercept(undefined) @@ -348,7 +306,9 @@ const FilesProvider = ({ children }: FilesContextProps) => { bucket: BucketKeyPermission, files: File[], path: string, - onUploadProgress?: (progressEvent: ProgressEvent) => void) => { + onUploadProgress?: (progressEvent: ProgressEvent) => void, + cancelToken?: CancelToken + ) => { const key = bucket.encryptionKey @@ -375,78 +335,91 @@ const FilesProvider = ({ children }: FilesContextProps) => { path, undefined, 1, - undefined, + cancelToken, undefined, onUploadProgress ) }, [filesApiClient]) const uploadFiles = useCallback(async (bucket: BucketKeyPermission, files: File[], path: string) => { - const id = uuidv4() - const uploadProgress: UploadProgress = { - id, - fileName: files[0].name, // TODO: Do we need this? - complete: false, - error: false, - noOfFiles: files.length, - progress: 0, - path - } - dispatchUploadsInProgress({ type: "add", payload: uploadProgress }) const hasOversizedFile = files.some(file => file.size > MAX_FILE_SIZE) - if (hasOversizedFile) { - addToastMessage({ - message: t`We can't encrypt files larger than 2GB. Some items will not be uploaded`, - appearance: "error" + addToast({ + title: t`We can't encrypt files larger than 2GB. Some items will not be uploaded`, + type: "error" }) } + const cancelSource = axios.CancelToken.source() + const cancelToken = cancelSource.token + + const toastParams: ToastParams = { + title: plural(files.length, { + one: `Encrypting and uploading ${files.length} file`, + other: `Encrypting and uploading ${files.length} files` + }) as string, + type: "success", + progress: 0, + onProgressCancel: cancelSource.cancel, + isClosable: false, + testId: "upload-status" + } + + const toastId = addToast(toastParams) + setUploadsInProgress(true) + try { await encryptAndUploadFiles( bucket, files, path, (progressEvent: { loaded: number; total: number }) => { - dispatchUploadsInProgress({ - type: "progress", - payload: { - id, - progress: Math.ceil( - (progressEvent.loaded / progressEvent.total) * 100 - ) - } + updateToast(toastId, { + ...toastParams, + progress: Math.ceil( + (progressEvent.loaded / progressEvent.total) * 100 + ) }) - }) + }, + cancelToken + ) + setUploadsInProgress(false) await refreshBuckets() // setting complete - dispatchUploadsInProgress({ type: "complete", payload: { id } }) - setTimeout(() => { - dispatchUploadsInProgress({ type: "remove", payload: { id } }) - }, REMOVE_TOAST_DELAY) - + updateToast(toastId, { + ...toastParams, + title: "Upload complete", + progress: undefined, + onProgressCancel: undefined, + isClosable: true + }, true) return Promise.resolve() - } catch (error) { - console.error(error) + } catch (error: any) { + setUploadsInProgress(false) // setting error let errorMessage = t`Something went wrong. We couldn't upload your file` + // uploads cancelled through button + if (axios.isCancel(error)) { + errorMessage = t`Uploads cancelled` + } // we will need a method to parse server errors if (Array.isArray(error) && error[0].message.includes("conflict")) { errorMessage = t`A file with the same name already exists` } - dispatchUploadsInProgress({ + updateToast(toastId, { + ...toastParams, + title: errorMessage, type: "error", - payload: { id, errorMessage } - }) - setTimeout(() => { - dispatchUploadsInProgress({ type: "remove", payload: { id } }) - }, REMOVE_TOAST_DELAY) + progress: undefined, + onProgressCancel: undefined, + isClosable: true + }, true) return Promise.reject(error) } - }, [addToastMessage, refreshBuckets, encryptAndUploadFiles]) + }, [addToast, updateToast, refreshBuckets, encryptAndUploadFiles]) const getFileContent = useCallback(async ( bucketId: string, @@ -490,7 +463,7 @@ const FilesProvider = ({ children }: FilesContextProps) => { } } catch (error) { if (axios.isCancel(error)) { - return Promise.reject() + return Promise.reject(error) } else { console.error(error) return Promise.reject(error) @@ -520,128 +493,137 @@ const FilesProvider = ({ children }: FilesContextProps) => { }, [filesApiClient]) const downloadMultipleFiles = useCallback((itemsToDownload: FileSystemItem[], currentPath: string, bucketId: string) => { + setDownloadsInProgress(true) getFileList(itemsToDownload, currentPath, bucketId) .then(async (fullStructure) => { const zipList: Zippable = {} - const toastId = uuidv4() const totalFileSize = fullStructure.reduce((sum, item) => sum + item.size, 0) - const downloadProgress: DownloadProgress = { - id: toastId, - currentFileNumber: 1, - totalFileNumber: fullStructure.length, - fileName: fullStructure[0]?.name, - complete: false, - error: false, - progress: 0 + const totalFileNumber = fullStructure.length + + const cancelSource = axios.CancelToken.source() + const cancelToken = cancelSource.token + const toastParams: ToastParams = { + title: plural(fullStructure.length, { + one: `Downloading ${fullStructure.length} file`, + other: `Downloading ${fullStructure.length} files` + }) as string, + type: "success", + progress: 0, + onProgressCancel: cancelSource.cancel, + isClosable: false } - dispatchDownloadsInProgress({ type: "add", payload: downloadProgress }) + const toastId = addToast(toastParams) // if there are no file to download return early and show an error - if (!fullStructure.length) { - dispatchDownloadsInProgress({ + if (!totalFileNumber) { + updateToast(toastId, { + title: t`No file to download.`, type: "error", - payload: { - id: toastId, - errorMessage: t`No file to download.` - } - }) - - setTimeout(() => { - dispatchDownloadsInProgress({ - type: "remove", - payload: { id: toastId } - }) - }, REMOVE_TOAST_DELAY) + progress: undefined + }, true) return } - // Idea for parrallel download https://glebbahmutov.com/blog/run-n-promises-in-parallel/ - // we need to use a reduce here because forEach doesn't wait for the Promise to resolve - await fullStructure.reduce(async (totalDownloaded: Promise, item: FileSystemItemPath, index: number): Promise => { - const file = await getFileContent(bucketId, { - cid: item.cid, - file: item, - path: getPathWithFile(item.path, item.name), - onDownloadProgress: async (progressEvent) => { - dispatchDownloadsInProgress({ - type: "progress", - payload: { - id: toastId, - fileName: item.name, - currentFileNumber: index + 1, + try { + // Idea for parallel download https://glebbahmutov.com/blog/run-n-promises-in-parallel/ + // we need to use a reduce here because forEach doesn't wait for the Promise to resolve + await fullStructure.reduce(async (totalDownloaded: Promise, item: FileSystemItemPath, index: number): Promise => { + const file = await getFileContent(bucketId, { + cid: item.cid, + file: item, + path: getPathWithFile(item.path, item.name), + cancelToken, + onDownloadProgress: async (progressEvent) => { + const currentFileNumber = index + 1 + const fileProgress = totalFileNumber > 1 && `${currentFileNumber}/${totalFileNumber}` + updateToast(toastId, { + ...toastParams, + title: t`Downloading ${fileProgress} - ${item.name}`, progress: Math.ceil( ((await totalDownloaded + progressEvent.loaded) / totalFileSize) * 100 ) - } - }) + }) + } + }) + + if(file) { + const fileArrayBuffer = await file.arrayBuffer() + const fullPath = getPathWithFile(item.path, item.name) + const relativeFilePath = getRelativePath(fullPath, currentPath) + zipList[relativeFilePath] = new Uint8Array(fileArrayBuffer) } - }) - if(file) { - const fileArrayBuffer = await file.arrayBuffer() - const fullPath = getPathWithFile(item.path, item.name) - const relativeFilePath = getRelativePath(fullPath, currentPath) - zipList[relativeFilePath] = new Uint8Array(fileArrayBuffer) + return await totalDownloaded + item.size + }, Promise.resolve(0)) + + // level 0 means without compression + const zipped = zipSync(zipList, { level: 0 }) + + if (!zipped) return + + const link = document.createElement("a") + link.href = URL.createObjectURL(new Blob([zipped])) + link.download = "archive.zip" + link.click() + setDownloadsInProgress(false) + + updateToast(toastId, { + title: t`Download Complete`, + type: "success", + progress: undefined, + onProgressCancel: undefined, + isClosable: true + }, true) + URL.revokeObjectURL(link.href) + } catch (error: any) { + let errorMessage = t`Downloads failed` + if (axios.isCancel(error)) { + errorMessage = t`Downloads cancelled` } - - return await totalDownloaded + item.size - }, Promise.resolve(0)) - - // level 0 means without compression - const zipped = zipSync(zipList, { level: 0 }) - - if (!zipped) return - - const link = document.createElement("a") - link.href = URL.createObjectURL(new Blob([zipped])) - link.download = "archive.zip" - link.click() - - dispatchDownloadsInProgress({ - type: "complete", - payload: { id: toastId } - }) - - URL.revokeObjectURL(link.href) - - setTimeout(() => { - dispatchDownloadsInProgress({ - type: "remove", - payload: { id: toastId } - }) - }, REMOVE_TOAST_DELAY) + setDownloadsInProgress(false) + updateToast(toastId, { + title: errorMessage, + type: "error", + progress: undefined, + onProgressCancel: undefined, + isClosable: true + }, true) + } }) - .catch(console.error) - }, [getFileContent, getFileList]) + .catch((error: any) => { + console.error(error) + setDownloadsInProgress(false) + }) + }, [getFileContent, getFileList, addToast, updateToast]) const downloadFile = useCallback(async (bucketId: string, itemToDownload: FileSystemItem, path: string) => { - const toastId = uuidv4() + const cancelSource = axios.CancelToken.source() + const cancelToken = cancelSource.token + + const toastParams: ToastParams = { + title: t`Downloading file - ${itemToDownload.name}`, + type: "success", + progress: 0, + isClosable: false, + onProgressCancel: cancelSource.cancel + } + const toastId = addToast(toastParams) + setDownloadsInProgress(true) + try { - const downloadProgress: DownloadProgress = { - id: toastId, - fileName: itemToDownload.name, - totalFileNumber: 1, - complete: false, - error: false, - progress: 0 - } - dispatchDownloadsInProgress({ type: "add", payload: downloadProgress }) const result = await getFileContent(bucketId, { cid: itemToDownload.cid, file: itemToDownload, path: getPathWithFile(path, itemToDownload.name), + cancelToken, onDownloadProgress: (progressEvent) => { - dispatchDownloadsInProgress({ - type: "progress", - payload: { - id: toastId, - fileName: itemToDownload.name, - progress: Math.ceil( - (progressEvent.loaded / itemToDownload.size) * 100 - ) - } + updateToast(toastId, { + ...toastParams, + progress: Math.ceil( + (progressEvent.loaded / itemToDownload.size) * 100 + ) }) } }) @@ -650,23 +632,33 @@ const FilesProvider = ({ children }: FilesContextProps) => { link.href = URL.createObjectURL(result) link.download = itemToDownload?.name || "file" link.click() - dispatchDownloadsInProgress({ - type: "complete", - payload: { id: toastId } - }) + updateToast(toastId, { + title: t`Download Complete`, + type: "success", + progress: undefined, + onProgressCancel: undefined, + isClosable: true + }, true) URL.revokeObjectURL(link.href) - setTimeout(() => { - dispatchDownloadsInProgress({ - type: "remove", - payload: { id: toastId } - }) - }, REMOVE_TOAST_DELAY) + setDownloadsInProgress(false) return Promise.resolve() - } catch (error) { - dispatchDownloadsInProgress({ type: "error", payload: { id: toastId } }) + } catch (error: any) { + console.error(error) + let errorMessage = `${t`An error occurred: `} ${typeof(error) === "string" ? error : error.length ? error[0].message : ""}` + if (axios.isCancel(error)) { + errorMessage = t`Downloads cancelled` + } + updateToast(toastId, { + title: errorMessage, + type: "error", + progress: undefined, + onProgressCancel: undefined, + isClosable: true + }, true) + setDownloadsInProgress(false) return Promise.reject() } - }, [getFileContent]) + }, [getFileContent, addToast, updateToast]) const createSharedFolder = useCallback(async (name: string, writerUsers?: SharedFolderUser[], readerUsers?: SharedFolderUser[]) => { if (!publicKey) return @@ -744,97 +736,92 @@ const FilesProvider = ({ children }: FilesContextProps) => { destinationBucket: BucketKeyPermission, keepOriginal = true ) => { - const toastId = uuidv4() const UPLOAD_PATH = "/" - const transferProgress: TransferProgress = { - id: toastId, - complete: false, - error: false, + const cancelSource = axios.CancelToken.source() + const cancelToken = cancelSource.token + + const toastParams: ToastParams = { + title: t`Sharing your file (Downloading)`, + type: "success", progress: 0, - operation: "Download" + onProgressCancel: cancelSource.cancel, + isClosable: false } - dispatchTransfersInProgress({ type: "add", payload: transferProgress }) + const toastId = addToast(toastParams) + setTransfersInProgress(true) getFileContent(sourceBucketId, { cid: sourceFile.cid, file: sourceFile, path: getPathWithFile(path, sourceFile.name), + cancelToken, onDownloadProgress: (progressEvent) => { - dispatchTransfersInProgress({ - type: "progress", - payload: { - id: toastId, - progress: Math.ceil( - (progressEvent.loaded / sourceFile.size) * 50 - ) - } + updateToast(toastId, { + ...toastParams, + progress: Math.ceil( + (progressEvent.loaded / sourceFile.size) * 50 + ) }) } }).then(async (fileContent) => { if (!fileContent) { - dispatchTransfersInProgress({ + updateToast(toastId, { + title: t`An error occurred while downloading the file`, type: "error", - payload: { - id: toastId, - errorMessage: t`An error occurred while downloading the file` - } - }) + progress: undefined, + onProgressCancel: undefined, + isClosable: true + }, true) + setTransfersInProgress(false) return } - dispatchTransfersInProgress({ - type: "operation", - payload: { - id: toastId, - operation: "Encrypt & Upload" - } - }) - await encryptAndUploadFiles( destinationBucket, [new File([fileContent], sourceFile.name, { type: sourceFile.content_type })], UPLOAD_PATH, (progressEvent) => { - dispatchTransfersInProgress({ - type: "progress", - payload: { - id: toastId, - progress: Math.ceil( - 50 + (progressEvent.loaded / sourceFile.size) * 50 - ) - } + updateToast(toastId, { + title: t`Encrypting & uploading`, + type: "success", + progress: Math.ceil( + 50 + (progressEvent.loaded / sourceFile.size) * 50 + ) }) - } + }, + cancelToken ) if (!keepOriginal) { await filesApiClient.removeBucketObject(sourceBucketId, { paths: [getPathWithFile(path, sourceFile.name)] }) } - - dispatchTransfersInProgress({ - type:"complete", - payload: { - id: toastId - } - }) + updateToast(toastId, { + title: t`Transfer complete`, + type: "success", + progress: undefined, + isClosable: true + }, true) + setTransfersInProgress(false) return Promise.resolve() }).catch((error) => { - console.error(error[0].message) - dispatchTransfersInProgress({ + console.error(error) + let errorMessage = `${t`An error occurred: `} ${typeof(error) === "string" ? error : error.length ? error[0].message : ""}` + if (axios.isCancel(error)) { + errorMessage = t`Sharing cancelled` + } + updateToast(toastId, { + title: errorMessage, type: "error", - payload: { - id: toastId, - errorMessage: `${t`An error occurred: `} ${typeof(error) === "string" ? error : error[0].message}` - } - }) + progress: undefined, + onProgressCancel: undefined, + isClosable: true + }, true) + setTransfersInProgress(false) }).finally(() => { refreshBuckets() - setTimeout(() => { - dispatchTransfersInProgress({ type: "remove", payload: { id: toastId } }) - }, REMOVE_TOAST_DELAY) }) - }, [getFileContent, encryptAndUploadFiles, filesApiClient, refreshBuckets]) + }, [getFileContent, encryptAndUploadFiles, filesApiClient, refreshBuckets, addToast, updateToast]) return ( { downloadMultipleFiles, getFileContent, personalEncryptionKey, - uploadsInProgress, storageSummary, getStorageSummary, - downloadsInProgress, secureAccountWithMasterPassword, buckets, refreshBuckets, isLoadingBuckets, createSharedFolder, editSharedFolder, - transferFileBetweenBuckets, - transfersInProgress + transferFileBetweenBuckets }} > {children} - - - ) } diff --git a/packages/files-ui/src/Contexts/FilesReducers.tsx b/packages/files-ui/src/Contexts/FilesReducers.tsx deleted file mode 100644 index f54afd91b6..0000000000 --- a/packages/files-ui/src/Contexts/FilesReducers.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import { DownloadProgress, TransferOperation, TransferProgress, UploadProgress } from "./FilesContext" - -export function uploadsInProgressReducer( - uploadsInProgress: UploadProgress[], - action: - | { type: "add"; payload: UploadProgress } - | { type: "progress"; payload: { id: string; progress: number } } - | { type: "complete"; payload: { id: string } } - | { type: "error"; payload: { id: string; errorMessage?: string } } - | { type: "remove"; payload: { id: string } } -): UploadProgress[] { - const getProgressIndex = () => - uploadsInProgress.findIndex((progress) => progress.id === action.payload.id) - switch (action.type) { - case "add": { - return [...uploadsInProgress, action.payload] - } - case "progress": { - const progressIndex = getProgressIndex() - if (progressIndex > -1) { - uploadsInProgress[progressIndex].progress = action.payload.progress - return [...uploadsInProgress] - } else { - return uploadsInProgress - } - } - case "complete": { - const progressIndex = getProgressIndex() - if (progressIndex > -1) { - uploadsInProgress[progressIndex].complete = true - return [...uploadsInProgress] - } else { - return uploadsInProgress - } - } - case "error": { - const progressIndex = getProgressIndex() - if (progressIndex > -1) { - uploadsInProgress[progressIndex].error = true - uploadsInProgress[progressIndex].errorMessage = - action.payload.errorMessage - return [...uploadsInProgress] - } else { - return uploadsInProgress - } - } - case "remove": { - const progressIndex = getProgressIndex() - if (progressIndex > -1) { - uploadsInProgress.splice(progressIndex, 1) - return [...uploadsInProgress] - } else { - return uploadsInProgress - } - } - default: - return uploadsInProgress - } -} - -type DownloadAction = - | { type: "add"; payload: DownloadProgress } - | { type: "progress"; payload: { id: string; fileName: string; currentFileNumber?: number; totalFileNumber?: number; progress: number } } - | { type: "complete"; payload: { id: string } } - | { type: "error"; payload: { id: string; errorMessage?: string } } - | { type: "remove"; payload: { id: string } } - -export function downloadsInProgressReducer(downloadsInProgress: DownloadProgress[], action:DownloadAction): DownloadProgress[] { - const progressIndex = downloadsInProgress.findIndex( - (download) => download.id === action.payload.id - ) - const currentDownload = downloadsInProgress[progressIndex] - - switch (action.type) { - case "add": { - return [...downloadsInProgress, action.payload] - } - case "progress": { - if (progressIndex > -1) { - currentDownload.progress = action.payload.progress - currentDownload.currentFileNumber = action.payload.currentFileNumber - currentDownload.fileName = action.payload.fileName - - return [...downloadsInProgress] - } else { - return downloadsInProgress - } - } - case "complete": { - if (progressIndex > -1) { - currentDownload.complete = true - - return [...downloadsInProgress] - } else { - return downloadsInProgress - } - } - case "error": { - if (progressIndex > -1) { - currentDownload.error = true - currentDownload.errorMessage = action.payload.errorMessage - - return [...downloadsInProgress] - } else { - return downloadsInProgress - } - } - case "remove": { - if (progressIndex > -1) { - downloadsInProgress.splice(progressIndex, 1) - return [...downloadsInProgress] - } else { - return downloadsInProgress - } - } - default: - return downloadsInProgress - } -} - -export function transfersInProgressReducer( - transfersInProgress: TransferProgress[], - action: - | { type: "add"; payload: TransferProgress } - | { type: "progress"; payload: { id: string; progress: number } } - | { type: "operation"; payload: { id: string; operation: TransferOperation}} - | { type: "complete"; payload: { id: string } } - | { type: "error"; payload: { id: string; errorMessage?: string } } - | { type: "remove"; payload: { id: string } } -): TransferProgress[] { - const getProgressIndex = () => - transfersInProgress.findIndex( - (transfer) => transfer.id === action.payload.id - ) - switch (action.type) { - case "add": { - return [...transfersInProgress, action.payload] - } - case "progress": { - const progressIndex = getProgressIndex() - if (progressIndex > -1) { - transfersInProgress[progressIndex].progress = action.payload.progress - return [...transfersInProgress] - } else { - return transfersInProgress - } - } - case "operation": { - const progressIndex = getProgressIndex() - if (progressIndex > -1) { - transfersInProgress[progressIndex].operation = action.payload.operation - return [...transfersInProgress] - } else { - return transfersInProgress - } - } - case "complete": { - const progressIndex = getProgressIndex() - if (progressIndex > -1) { - transfersInProgress[progressIndex].complete = true - return [...transfersInProgress] - } else { - return transfersInProgress - } - } - case "error": { - const progressIndex = getProgressIndex() - if (progressIndex > -1) { - transfersInProgress[progressIndex].error = true - transfersInProgress[progressIndex].errorMessage = action.payload.errorMessage - return [...transfersInProgress] - } else { - return transfersInProgress - } - } - case "remove": { - const progressIndex = getProgressIndex() - if (progressIndex > -1) { - transfersInProgress.splice(progressIndex, 1) - return [...transfersInProgress] - } else { - return transfersInProgress - } - } - default: - return transfersInProgress - } -} diff --git a/packages/files-ui/src/Themes/DarkTheme.ts b/packages/files-ui/src/Themes/DarkTheme.ts index 44fc11bfa6..00a80eba21 100644 --- a/packages/files-ui/src/Themes/DarkTheme.ts +++ b/packages/files-ui/src/Themes/DarkTheme.ts @@ -530,25 +530,6 @@ export const darkTheme = createTheme({ color: "var(--gray9)" } }, - Toaster: { - closeIcon: { - fill: "var(--gray9)" - }, - message: { - color: "var(--gray9)" - }, - typeIcon: { - root: { - fill: "var(--gray9)" - }, - success: { - fill: "var(--green8)" - }, - error: { - fill: "var(--red8)" - } - } - }, TagsInput: { root: { color: "var(--gray9)" diff --git a/packages/files-ui/src/locales/de/messages.po b/packages/files-ui/src/locales/de/messages.po index 5b6adca10c..06003074a9 100644 --- a/packages/files-ui/src/locales/de/messages.po +++ b/packages/files-ui/src/locales/de/messages.po @@ -3,14 +3,14 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-04-20 00:28+0200\n" -"PO-Revision-Date: 2021-09-06 00:40+0000\n" +"PO-Revision-Date: 2021-09-14 09:14+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: German \n" "Language: de\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" "Mime-Version: 1.0\n" msgid "A backup secret phrase will be generated and used for your account.<0/>We do not store it and <1>it can only be displayed once. Save it somewhere safe!" @@ -47,17 +47,14 @@ msgid "Add viewers and editors by username, sharing id or Ethereum address." msgstr "" msgid "An error occurred while downloading the file" -msgstr "" +msgstr "Beim Herunterladen der Datei ist ein Fehler aufgetreten" msgid "An error occurred:" -msgstr "" +msgstr "Es ist ein Fehler aufgetreten:" msgid "Approve" msgstr "Genehmigen" -msgid "Are we on the right track? Let us know in less than 1 minute." -msgstr "Sind wir auf dem richtigen Weg? Sagen Sie es uns in weniger als 1 Minute." - msgid "Back to plan settings" msgstr "" @@ -178,10 +175,10 @@ msgstr "" msgid "Create folder" msgstr "Ordner erstellen" -msgid "Credit card on file" +msgid "Create your public username in <0>Settings!" msgstr "" -msgid "Create your public username in <0>Settings!" +msgid "Credit card on file" msgstr "" msgid "Dark Theme" @@ -211,16 +208,25 @@ msgstr "Anzeigeeinstellungen" msgid "Download" msgstr "Herunterladen" -msgid "Download as zip" +msgid "Download Complete" msgstr "" -msgid "Download complete" -msgstr "Komplett heruntergeladen" +msgid "Download as zip" +msgstr "" msgid "Download recovery key" msgstr "Wiederherstellungsschlüssel herunterladen" -msgid "Downloading" +msgid "Downloading file - {0}" +msgstr "" + +msgid "Downloading {fileProgress} - {0}" +msgstr "" + +msgid "Downloads cancelled" +msgstr "" + +msgid "Downloads failed" msgstr "" msgid "Drop to upload files" @@ -289,6 +295,9 @@ msgstr "Ordner" msgid "Folder name is already in use" msgstr "" +msgid "Folder uploads are not supported currently" +msgstr "" + msgid "Folders" msgstr "Ordner" @@ -322,15 +331,15 @@ msgstr "" msgid "Go back" msgstr "Zurück" +msgid "Got an issue?" +msgstr "" + msgid "Got it" msgstr "" msgid "Hello again!" msgstr "Hallo nochmal!" -msgid "Help us improve File in less than 1 minute." -msgstr "" - msgid "Hey! You only have two sign-in methods. If you lose that and have only one left, you will be locked out of your account forever." msgstr "" @@ -580,6 +589,9 @@ msgstr "Gespeicherte Browser" msgid "Saved on:" msgstr "Gesichert am:" +msgid "Schedule a 15 min call" +msgstr "" + msgid "Search results" msgstr "Suchergebnisse" @@ -631,7 +643,10 @@ msgstr "" msgid "Shared with" msgstr "" -msgid "Sharing your file ({0})" +msgid "Sharing cancelled" +msgstr "" + +msgid "Sharing your file (Downloading)" msgstr "" msgid "Sign Out" @@ -757,11 +772,8 @@ msgstr "" msgid "Upload" msgstr "Hochladen" -msgid "Upload complete" -msgstr "Hochladen abgeschlossen" - -msgid "Uploading {0} files" -msgstr "Hochladen von {0} Dateien" +msgid "Uploads cancelled" +msgstr "" msgid "Use a different login method" msgstr "Eine andere Anmeldemethode verwenden" @@ -802,6 +814,9 @@ msgstr "Ordner anzeigen" msgid "Wallet address" msgstr "" +msgid "Want to help shape this product?" +msgstr "" + msgid "We can't encrypt files larger than 2GB. Some items will not be uploaded" msgstr "" @@ -827,7 +842,7 @@ msgid "You can change this later." msgstr "Sie können dies später ändern." msgid "You can now create shared folders to share a file." -msgstr "" +msgstr "Sie können nun geteilte Ordner erstellen, um eine Datei zu teilen." msgid "You can't move folders to this path" msgstr "Sie können keine Ordner in diesen Pfad verschieben" @@ -868,11 +883,14 @@ msgstr "erfolgreich wiederhergestellt" msgid "unknown" msgstr "unbekannt" +msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" +msgstr "{0, plural, one {{1} Datei wird heruntergeladen} other {{2} Dateien werden heruntergeladen}}" + +msgid "{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and uploading {2} files}}" +msgstr "{0, plural, one {{1} Datei wird verschlüsselt und hochgeladen} other {{2} Dateien werden verschlüsselt und hochgeladen}}" + msgid "{0, plural, one {You are about to delete {1} item.} other {You are about to delete {2} items.}}" msgstr "{0, plural, one {Sie sind dabei, {1} Artikel zu löschen.} other {Sie sind dabei, {2} Artikel zu löschen.}}" msgid "{0} of {1} used ({2}%)" msgstr "" - -msgid "{noOfFiles, plural, one {Uploading and encrypting {noOfFiles} file} other {Uploading and encrypting {noOfFiles} files}}" -msgstr "{noOfFiles, plural, one {{noOfFiles} Datei wird hochgeladen und verschlüsselt} other {{noOfFiles} Datein werden hochgeladen und verschlüsselt}}" diff --git a/packages/files-ui/src/locales/en/messages.po b/packages/files-ui/src/locales/en/messages.po index 79dc08dfea..bddc573609 100644 --- a/packages/files-ui/src/locales/en/messages.po +++ b/packages/files-ui/src/locales/en/messages.po @@ -55,9 +55,6 @@ msgstr "An error occurred:" msgid "Approve" msgstr "Approve" -msgid "Are we on the right track? Let us know in less than 1 minute." -msgstr "Are we on the right track? Let us know in less than 1 minute." - msgid "Back to plan settings" msgstr "Back to plan settings" @@ -178,12 +175,12 @@ msgstr "Create a new shared folder" msgid "Create folder" msgstr "Create folder" -msgid "Credit card on file" -msgstr "Credit card on file" - msgid "Create your public username in <0>Settings!" msgstr "Create your public username in <0>Settings!" +msgid "Credit card on file" +msgstr "Credit card on file" + msgid "Dark Theme" msgstr "Dark Theme" @@ -211,17 +208,26 @@ msgstr "Display Settings" msgid "Download" msgstr "Download" +msgid "Download Complete" +msgstr "Download Complete" + msgid "Download as zip" msgstr "Download as zip" -msgid "Download complete" -msgstr "Download complete" - msgid "Download recovery key" msgstr "Download recovery key" -msgid "Downloading" -msgstr "Downloading" +msgid "Downloading file - {0}" +msgstr "Downloading file - {0}" + +msgid "Downloading {fileProgress} - {0}" +msgstr "Downloading {fileProgress} - {0}" + +msgid "Downloads cancelled" +msgstr "Downloads cancelled" + +msgid "Downloads failed" +msgstr "Downloads failed" msgid "Drop to upload files" msgstr "Drop to upload files" @@ -292,6 +298,9 @@ msgstr "Folder" msgid "Folder name is already in use" msgstr "Folder name is already in use" +msgid "Folder uploads are not supported currently" +msgstr "Folder uploads are not supported currently" + msgid "Folders" msgstr "Folders" @@ -325,15 +334,15 @@ msgstr "Give view-only permission to:" msgid "Go back" msgstr "Go back" +msgid "Got an issue?" +msgstr "Got an issue?" + msgid "Got it" msgstr "Got it" msgid "Hello again!" msgstr "Hello again!" -msgid "Help us improve File in less than 1 minute." -msgstr "Help us improve File in less than 1 minute." - msgid "Hey! You only have two sign-in methods. If you lose that and have only one left, you will be locked out of your account forever." msgstr "Hey! You only have two sign-in methods. If you lose that and have only one left, you will be locked out of your account forever." @@ -583,6 +592,9 @@ msgstr "Saved Browsers" msgid "Saved on:" msgstr "Saved on:" +msgid "Schedule a 15 min call" +msgstr "Schedule a 15 min call" + msgid "Search results" msgstr "Search results" @@ -634,8 +646,11 @@ msgstr "Shared folders" msgid "Shared with" msgstr "Shared with" -msgid "Sharing your file ({0})" -msgstr "Sharing your file ({0})" +msgid "Sharing cancelled" +msgstr "Sharing cancelled" + +msgid "Sharing your file (Downloading)" +msgstr "Sharing your file (Downloading)" msgid "Sign Out" msgstr "Sign Out" @@ -760,11 +775,8 @@ msgstr "Upgrade your plan" msgid "Upload" msgstr "Upload" -msgid "Upload complete" -msgstr "Upload complete" - -msgid "Uploading {0} files" -msgstr "Uploading {0} files" +msgid "Uploads cancelled" +msgstr "Uploads cancelled" msgid "Use a different login method" msgstr "Use a different login method" @@ -805,6 +817,9 @@ msgstr "View folder" msgid "Wallet address" msgstr "Wallet address" +msgid "Want to help shape this product?" +msgstr "Want to help shape this product?" + msgid "We can't encrypt files larger than 2GB. Some items will not be uploaded" msgstr "We can't encrypt files larger than 2GB. Some items will not be uploaded" @@ -871,11 +886,14 @@ msgstr "recovered successfully" msgid "unknown" msgstr "unknown" +msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" +msgstr "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" + +msgid "{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and uploading {2} files}}" +msgstr "{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and uploading {2} files}}" + msgid "{0, plural, one {You are about to delete {1} item.} other {You are about to delete {2} items.}}" msgstr "{0, plural, one {You are about to delete {1} item.} other {You are about to delete {2} items.}}" msgid "{0} of {1} used ({2}%)" msgstr "{0} of {1} used ({2}%)" - -msgid "{noOfFiles, plural, one {Uploading and encrypting {noOfFiles} file} other {Uploading and encrypting {noOfFiles} files}}" -msgstr "{noOfFiles, plural, one {Uploading and encrypting {noOfFiles} file} other {Uploading and encrypting {noOfFiles} files}}" diff --git a/packages/files-ui/src/locales/es/messages.po b/packages/files-ui/src/locales/es/messages.po index 1e20b9050e..ceb5d2aa21 100644 --- a/packages/files-ui/src/locales/es/messages.po +++ b/packages/files-ui/src/locales/es/messages.po @@ -56,9 +56,6 @@ msgstr "" msgid "Approve" msgstr "Aprobar" -msgid "Are we on the right track? Let us know in less than 1 minute." -msgstr "" - msgid "Back to plan settings" msgstr "" @@ -179,10 +176,10 @@ msgstr "" msgid "Create folder" msgstr "Crear Carpeta" -msgid "Credit card on file" +msgid "Create your public username in <0>Settings!" msgstr "" -msgid "Create your public username in <0>Settings!" +msgid "Credit card on file" msgstr "" msgid "Dark Theme" @@ -212,16 +209,25 @@ msgstr "Configuración de pantalla" msgid "Download" msgstr "Descargar" -msgid "Download as zip" +msgid "Download Complete" msgstr "" -msgid "Download complete" -msgstr "Descarga completa" +msgid "Download as zip" +msgstr "" msgid "Download recovery key" msgstr "Descargar la clave de recuperación" -msgid "Downloading" +msgid "Downloading file - {0}" +msgstr "" + +msgid "Downloading {fileProgress} - {0}" +msgstr "" + +msgid "Downloads cancelled" +msgstr "" + +msgid "Downloads failed" msgstr "" msgid "Drop to upload files" @@ -293,6 +299,9 @@ msgstr "Archivo" msgid "Folder name is already in use" msgstr "" +msgid "Folder uploads are not supported currently" +msgstr "" + msgid "Folders" msgstr "Archivos" @@ -326,15 +335,15 @@ msgstr "" msgid "Go back" msgstr "Regresar" +msgid "Got an issue?" +msgstr "" + msgid "Got it" msgstr "" msgid "Hello again!" msgstr "Hola de nuevo!" -msgid "Help us improve File in less than 1 minute." -msgstr "" - msgid "Hey! You only have two sign-in methods. If you lose that and have only one left, you will be locked out of your account forever." msgstr "Oye! Solo tiene dos métodos de inicio de sesión. Si lo pierde y solo le queda uno, se le bloqueará su cuenta para siempre." @@ -584,6 +593,9 @@ msgstr "Navegadores guardados" msgid "Saved on:" msgstr "Guardado el:" +msgid "Schedule a 15 min call" +msgstr "" + msgid "Search results" msgstr "Resultados de la búsqueda" @@ -635,7 +647,10 @@ msgstr "" msgid "Shared with" msgstr "" -msgid "Sharing your file ({0})" +msgid "Sharing cancelled" +msgstr "" + +msgid "Sharing your file (Downloading)" msgstr "" msgid "Sign Out" @@ -761,11 +776,8 @@ msgstr "" msgid "Upload" msgstr "Subir" -msgid "Upload complete" -msgstr "Carga completa" - -msgid "Uploading {0} files" -msgstr "Subiendo {0} archivos" +msgid "Uploads cancelled" +msgstr "" msgid "Use a different login method" msgstr "Utilice un método de inicio de sesión diferente" @@ -806,6 +818,9 @@ msgstr "Utilice un navegador guardado" msgid "Wallet address" msgstr "Utilice un navegador guardado" +msgid "Want to help shape this product?" +msgstr "" + msgid "We can't encrypt files larger than 2GB. Some items will not be uploaded" msgstr "" @@ -872,11 +887,14 @@ msgstr "recuperado con éxito" msgid "unknown" msgstr "" +msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" +msgstr "" + +msgid "{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and uploading {2} files}}" +msgstr "" + msgid "{0, plural, one {You are about to delete {1} item.} other {You are about to delete {2} items.}}" msgstr "" msgid "{0} of {1} used ({2}%)" msgstr "" - -msgid "{noOfFiles, plural, one {Uploading and encrypting {noOfFiles} file} other {Uploading and encrypting {noOfFiles} files}}" -msgstr "{noOfFiles, plural, one {Carga y encriptación del archivo {noOfFiles}} other {Carga y encriptación de archivos {noOfFiles}}}" diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po index dd1b6e0782..0869b4fc12 100644 --- a/packages/files-ui/src/locales/fr/messages.po +++ b/packages/files-ui/src/locales/fr/messages.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-04-23 11:05+0200\n" -"PO-Revision-Date: 2021-08-26 18:33+0000\n" +"PO-Revision-Date: 2021-09-14 09:14+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: French \n" "Language: fr\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" "Mime-Version: 1.0\n" msgid "A backup secret phrase will be generated and used for your account.<0/>We do not store it and <1>it can only be displayed once. Save it somewhere safe!" @@ -45,7 +45,7 @@ msgid "Add more files" msgstr "Ajouter d’autres fichiers" msgid "Add viewers and editors by username, sharing id or Ethereum address." -msgstr "" +msgstr "Ajoutez des personnes pouvant visualiser ou afficher par nom d'utilisateur, identifiant de partage ou adresse Ethereum." msgid "An error occurred while downloading the file" msgstr "Une erreur s'est produite lors du téléchargement du fichier" @@ -56,9 +56,6 @@ msgstr "Une erreur s'est produite :" msgid "Approve" msgstr "Accepter" -msgid "Are we on the right track? Let us know in less than 1 minute." -msgstr "Sommes-nous sur la bonne voie ? Dites-le-nous en moins d’une minute (en anglais)." - msgid "Back to plan settings" msgstr "" @@ -179,10 +176,10 @@ msgstr "Créer un nouveau dossier partagé" msgid "Create folder" msgstr "Créer un dossier" -msgid "Credit card on file" -msgstr "" - msgid "Create your public username in <0>Settings!" +msgstr "Créez votre nom d'utilisateur public dans <0>Paramètres !" + +msgid "Credit card on file" msgstr "" msgid "Dark Theme" @@ -212,17 +209,26 @@ msgstr "Paramètres d’affichage" msgid "Download" msgstr "Télécharger" +msgid "Download Complete" +msgstr "Téléchargement terminé" + msgid "Download as zip" msgstr "Télécharger au format zip" -msgid "Download complete" -msgstr "Téléchargement terminé" - msgid "Download recovery key" msgstr "Télécharger la clé de sauvegarde" -msgid "Downloading" -msgstr "Téléchargement" +msgid "Downloading file - {0}" +msgstr "Téléchargement du fichier - {0}" + +msgid "Downloading {fileProgress} - {0}" +msgstr "Téléchargement de {fileProgress} - {0}" + +msgid "Downloads cancelled" +msgstr "Téléchargements annulés" + +msgid "Downloads failed" +msgstr "Les téléchargements ont échoué" msgid "Drop to upload files" msgstr "Faire glisser pour téléverser un fichier" @@ -293,6 +299,9 @@ msgstr "Dossier" msgid "Folder name is already in use" msgstr "Le nom du dossier est déjà utilisé" +msgid "Folder uploads are not supported currently" +msgstr "Le téléversement de dossiers n'est pas actuellement pris en charge" + msgid "Folders" msgstr "Dossiers" @@ -326,15 +335,15 @@ msgstr "Donner l’accès en lecture seule à :" msgid "Go back" msgstr "Retour" +msgid "Got an issue?" +msgstr "Vous avez un problème ?" + msgid "Got it" -msgstr "" +msgstr "Compris" msgid "Hello again!" msgstr "Ravis de vous revoir !" -msgid "Help us improve File in less than 1 minute." -msgstr "Aidez-nous à améliorer File en moins d'une minute." - msgid "Hey! You only have two sign-in methods. If you lose that and have only one left, you will be locked out of your account forever." msgstr "Hé ! Vous n’avez que deux méthodes de connexion. Si vous en perdez une et qu’il ne vous en reste qu’une, vous ne pourrez plus jamais vous connecter à votre compte." @@ -584,6 +593,9 @@ msgstr "Navigateurs enregistrés" msgid "Saved on:" msgstr "Enregistré sur :" +msgid "Schedule a 15 min call" +msgstr "" + msgid "Search results" msgstr "Résultats de recherche" @@ -635,8 +647,11 @@ msgstr "Dossiers partagés" msgid "Shared with" msgstr "Partagé avec" -msgid "Sharing your file ({0})" -msgstr "Partage de votre fichier ({0})" +msgid "Sharing cancelled" +msgstr "Partage annulé" + +msgid "Sharing your file (Downloading)" +msgstr "Partager votre fichier (Téléchargement)" msgid "Sign Out" msgstr "Se déconnecter" @@ -761,11 +776,8 @@ msgstr "" msgid "Upload" msgstr "Téléverser" -msgid "Upload complete" -msgstr "Téléversement terminé" - -msgid "Uploading {0} files" -msgstr "Téléversement de {0} fichiers" +msgid "Uploads cancelled" +msgstr "Téléversements annulés" msgid "Use a different login method" msgstr "Utilisez une méthode de connexion différente" @@ -806,6 +818,9 @@ msgstr "Voir le dossier" msgid "Wallet address" msgstr "Addresse du wallet" +msgid "Want to help shape this product?" +msgstr "" + msgid "We can't encrypt files larger than 2GB. Some items will not be uploaded" msgstr "Nous ne pouvons pas chiffrer les fichiers de plus de 2 Go. Certains éléments ne pourront pas être téléversés" @@ -831,7 +846,7 @@ msgid "You can change this later." msgstr "Vous pouvez en changer plus tard." msgid "You can now create shared folders to share a file." -msgstr "" +msgstr "Vous pouvez maintenant créer des dossiers partagés pour partager un fichier." msgid "You can't move folders to this path" msgstr "Vous ne pouvez pas déplacer les dossiers vers ce chemin" @@ -872,11 +887,14 @@ msgstr "récupéré avec succès" msgid "unknown" msgstr "inconnu" +msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" +msgstr "{0, plural, one {Téléchargement de {1} fichier} other {Téléchargement de {2} fichiers}}" + +msgid "{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and uploading {2} files}}" +msgstr "{0, plural, one {Chiffrement et téléversement de {1} fichier} other {Chiffrement et téléversements {2} fichiers}}" + msgid "{0, plural, one {You are about to delete {1} item.} other {You are about to delete {2} items.}}" msgstr "{0, plural, one {Vous êtes sur le point de supprimer {1} élément.} other {Vous êtes sur le point de supprimer {2} éléments.}}" msgid "{0} of {1} used ({2}%)" msgstr "" - -msgid "{noOfFiles, plural, one {Uploading and encrypting {noOfFiles} file} other {Uploading and encrypting {noOfFiles} files}}" -msgstr "{noOfFiles, plural, one {Upload et chiffrage de {noOfFiles} fichier} other {Upload et chiffrage de {noOfFiles} fichiers}}" diff --git a/packages/files-ui/src/locales/no/messages.po b/packages/files-ui/src/locales/no/messages.po index e5ed3ea503..36e8da8da0 100644 --- a/packages/files-ui/src/locales/no/messages.po +++ b/packages/files-ui/src/locales/no/messages.po @@ -55,9 +55,6 @@ msgstr "" msgid "Approve" msgstr "Godkjenn" -msgid "Are we on the right track? Let us know in less than 1 minute." -msgstr "" - msgid "Back to plan settings" msgstr "" @@ -178,10 +175,10 @@ msgstr "" msgid "Create folder" msgstr "Opprett mappe" -msgid "Credit card on file" +msgid "Create your public username in <0>Settings!" msgstr "" -msgid "Create your public username in <0>Settings!" +msgid "Credit card on file" msgstr "" msgid "Dark Theme" @@ -211,16 +208,25 @@ msgstr "" msgid "Download" msgstr "" -msgid "Download as zip" +msgid "Download Complete" msgstr "" -msgid "Download complete" +msgid "Download as zip" msgstr "" msgid "Download recovery key" msgstr "" -msgid "Downloading" +msgid "Downloading file - {0}" +msgstr "" + +msgid "Downloading {fileProgress} - {0}" +msgstr "" + +msgid "Downloads cancelled" +msgstr "" + +msgid "Downloads failed" msgstr "" msgid "Drop to upload files" @@ -289,6 +295,9 @@ msgstr "Mappe" msgid "Folder name is already in use" msgstr "" +msgid "Folder uploads are not supported currently" +msgstr "" + msgid "Folders" msgstr "Mapper" @@ -322,15 +331,15 @@ msgstr "" msgid "Go back" msgstr "Tilbake" +msgid "Got an issue?" +msgstr "" + msgid "Got it" msgstr "" msgid "Hello again!" msgstr "Hei igjen." -msgid "Help us improve File in less than 1 minute." -msgstr "" - msgid "Hey! You only have two sign-in methods. If you lose that and have only one left, you will be locked out of your account forever." msgstr "" @@ -580,6 +589,9 @@ msgstr "" msgid "Saved on:" msgstr "" +msgid "Schedule a 15 min call" +msgstr "" + msgid "Search results" msgstr "" @@ -631,7 +643,10 @@ msgstr "" msgid "Shared with" msgstr "" -msgid "Sharing your file ({0})" +msgid "Sharing cancelled" +msgstr "" + +msgid "Sharing your file (Downloading)" msgstr "" msgid "Sign Out" @@ -757,11 +772,8 @@ msgstr "" msgid "Upload" msgstr "Last opp" -msgid "Upload complete" -msgstr "Opplastet" - -msgid "Uploading {0} files" -msgstr "Laster opp {0} filer" +msgid "Uploads cancelled" +msgstr "" msgid "Use a different login method" msgstr "Bruk en annen innloggingsmetode" @@ -802,6 +814,9 @@ msgstr "Vis mappe" msgid "Wallet address" msgstr "" +msgid "Want to help shape this product?" +msgstr "" + msgid "We can't encrypt files larger than 2GB. Some items will not be uploaded" msgstr "" @@ -868,11 +883,14 @@ msgstr "gjenopprettet" msgid "unknown" msgstr "" -msgid "{0, plural, one {You are about to delete {1} item.} other {You are about to delete {2} items.}}" +msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" msgstr "" -msgid "{0} of {1} used ({2}%)" +msgid "{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and uploading {2} files}}" msgstr "" -msgid "{noOfFiles, plural, one {Uploading and encrypting {noOfFiles} file} other {Uploading and encrypting {noOfFiles} files}}" +msgid "{0, plural, one {You are about to delete {1} item.} other {You are about to delete {2} items.}}" +msgstr "" + +msgid "{0} of {1} used ({2}%)" msgstr "" diff --git a/packages/gaming-ui/package.json b/packages/gaming-ui/package.json index 12dea7dafa..7f9680629a 100644 --- a/packages/gaming-ui/package.json +++ b/packages/gaming-ui/package.json @@ -63,7 +63,7 @@ "@types/yup": "^0.29.9", "@types/zxcvbn": "^4.4.0", "babel-plugin-macros": "^2.8.0", - "cypress": "^8.3.1", + "cypress": "^8.4", "cypress-file-upload": "^5.0.8", "cypress-pipe": "^2.0.0" }, diff --git a/packages/gaming-ui/src/App.tsx b/packages/gaming-ui/src/App.tsx index 54aa2aa32a..6eaf3956b7 100644 --- a/packages/gaming-ui/src/App.tsx +++ b/packages/gaming-ui/src/App.tsx @@ -3,7 +3,7 @@ import { init as initSentry, ErrorBoundary, showReportDialog } from "@sentry/rea import { Web3Provider } from "@chainsafe/web3-context" import { ThemeSwitcher } from "@chainsafe/common-theme" import "@chainsafe/common-theme/dist/font-faces.css" -import { Button, CssBaseline, Modal, Router, ToasterProvider, Typography } from "@chainsafe/common-components" +import { Button, CssBaseline, Modal, Router, ToastProvider, Typography } from "@chainsafe/common-components" import StorageRoutes from "./Components/GamingRoutes" import AppWrapper from "./Components/Layouts/AppWrapper" import { LanguageProvider } from "./Contexts/LanguageContext" @@ -91,7 +91,7 @@ const App = () => { > - + { - + diff --git a/packages/gaming-ui/src/Components/Elements/CustomModal.tsx b/packages/gaming-ui/src/Components/Elements/CustomModal.tsx index 6b0966bff5..a7aa276273 100644 --- a/packages/gaming-ui/src/Components/Elements/CustomModal.tsx +++ b/packages/gaming-ui/src/Components/Elements/CustomModal.tsx @@ -48,7 +48,7 @@ const CustomModal: React.FC = ({ *": { paddingBottom: `${constants.generalUnit * 5}px` } @@ -174,7 +174,7 @@ const LoginModule = ({ className }: IInitialScreen) => { setLoginMode(loginType) try { await login(loginType) - } catch (error) { + } catch (error: any) { let errorMessage = t`There was an error authenticating` console.log(error) if (Array.isArray(error) && error[0]) { diff --git a/packages/gaming-ui/src/Themes/DarkTheme.ts b/packages/gaming-ui/src/Themes/DarkTheme.ts index 6cc50c045e..63c7839c44 100644 --- a/packages/gaming-ui/src/Themes/DarkTheme.ts +++ b/packages/gaming-ui/src/Themes/DarkTheme.ts @@ -521,25 +521,6 @@ export const darkTheme = createTheme({ color: "var(--gray9)" } }, - Toaster: { - closeIcon: { - fill: "var(--gray9)" - }, - message: { - color: "var(--gray9)" - }, - typeIcon: { - root: { - fill: "var(--gray9)" - }, - success: { - fill: "var(--green8)" - }, - error: { - fill: "var(--red8)" - } - } - }, Button: { variants: { primary: { diff --git a/packages/storage-ui/package.json b/packages/storage-ui/package.json index 690d46d46a..6c89462f61 100644 --- a/packages/storage-ui/package.json +++ b/packages/storage-ui/package.json @@ -64,7 +64,7 @@ "@types/yup": "^0.29.9", "@types/zxcvbn": "^4.4.0", "babel-plugin-macros": "^2.8.0", - "cypress": "^8.3.1", + "cypress": "^8.4", "cypress-file-upload": "^5.0.8", "cypress-pipe": "^2.0.0" }, diff --git a/packages/storage-ui/src/App.tsx b/packages/storage-ui/src/App.tsx index 0baf992a71..9708f8c5fb 100644 --- a/packages/storage-ui/src/App.tsx +++ b/packages/storage-ui/src/App.tsx @@ -3,7 +3,7 @@ import { init as initSentry, ErrorBoundary, showReportDialog } from "@sentry/rea import { Web3Provider } from "@chainsafe/web3-context" import { ThemeSwitcher } from "@chainsafe/common-theme" import "@chainsafe/common-theme/dist/font-faces.css" -import { Button, CssBaseline, Modal, Router, ToasterProvider, Typography } from "@chainsafe/common-components" +import { Button, CssBaseline, Modal, Router, ToastProvider, Typography } from "@chainsafe/common-components" import StorageRoutes from "./Components/StorageRoutes" import AppWrapper from "./Components/Layouts/AppWrapper" import { useHotjar } from "react-use-hotjar" @@ -103,7 +103,8 @@ const App = () => { > - + { - + diff --git a/packages/storage-ui/src/Components/Modules/LoginModule.tsx b/packages/storage-ui/src/Components/Modules/LoginModule.tsx index ed4d13dfd5..42bc1eb818 100644 --- a/packages/storage-ui/src/Components/Modules/LoginModule.tsx +++ b/packages/storage-ui/src/Components/Modules/LoginModule.tsx @@ -63,7 +63,7 @@ const useStyles = makeStyles( fontWeight: 400 }, [breakpoints.up("md")]: { - padding: `${constants.generalUnit * 30}px ${constants.generalUnit * 8}px`, + padding: `${constants.generalUnit * 20}px ${constants.generalUnit * 8}px`, "& > *": { paddingBottom: `${constants.generalUnit * 5}px` } @@ -217,10 +217,10 @@ const LoginModule = ({ className }: IInitialScreen) => { } } // WalletConnect be sassy - if (error?.message === "Just nope" || error?.code === 4001) { + if ((error instanceof Error && error.message === "Just nope") || ((error as any).code === 4001)) { errorMessage = t`Failed to get signature` } - if (error?.message === "user closed popup") { + if (error instanceof Error && error.message === "user closed popup") { errorMessage = t`The authentication popup was closed` } setError(errorMessage) diff --git a/packages/storage-ui/src/Components/Pages/BucketPage.tsx b/packages/storage-ui/src/Components/Pages/BucketPage.tsx index d75fb65895..e29dd0f721 100644 --- a/packages/storage-ui/src/Components/Pages/BucketPage.tsx +++ b/packages/storage-ui/src/Components/Pages/BucketPage.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useMemo, useState } from "react" -import { Crumb, useToaster, useHistory, useLocation } from "@chainsafe/common-components" +import { Crumb, useToasts, useHistory, useLocation } from "@chainsafe/common-components" import { useStorage, FileSystemItem } from "../../Contexts/StorageContext" import { getArrayOfPaths, @@ -23,7 +23,7 @@ import { DISMISSED_SURVEY_KEY } from "../Modules/SurveyBanner" const BucketPage: React.FC = () => { const { storageBuckets, uploadFiles, uploadsInProgress, getStorageSummary, downloadFile } = useStorage() const { storageApiClient } = useStorageApi() - const { addToastMessage } = useToaster() + const { addToast } = useToasts() const [loadingCurrentPath, setLoadingCurrentPath] = useState(false) const [pathContents, setPathContents] = useState([]) const { redirect } = useHistory() @@ -78,21 +78,21 @@ const BucketPage: React.FC = () => { return storageApiClient.removeBucketObject(bucket.id, { paths: itemsToDelete.map((item) => (getPathWithFile(currentPath, item?.name))) }).then(() => { - addToastMessage({ - message: t`Deletion successful`, - appearance: "success" + addToast({ + title: t`Deletion successful`, + type: "success" }) }) .catch((e) => { console.error(e) const message = t`There was an error deleting this item` - addToastMessage({ - message: message, - appearance: "error" + addToast({ + title: message, + type: "error" }) }) .finally(refreshContents) - }, [bucket, storageApiClient, refreshContents, pathContents, currentPath, addToastMessage]) + }, [bucket, storageApiClient, refreshContents, pathContents, currentPath, addToast]) const renameItem = useCallback(async (toRename: ISelectedFile, newName: string) => { const itemToRename = pathContents.find(i => i.cid === toRename.cid && i.name === toRename.name) @@ -120,21 +120,21 @@ const BucketPage: React.FC = () => { itemToMove.isFolder ? t`Folder` : t`File` } ${t`moved successfully`}` - addToastMessage({ - message: message, - appearance: "success" + addToast({ + title: message, + type: "success" }) } catch (error) { const message = `${t`There was an error moving this`} ${ itemToMove.isFolder ? t`folder` : t`file` }` - addToastMessage({ - message: message, - appearance: "error" + addToast({ + title: message, + type: "error" }) } })).finally(refreshContents) - }, [addToastMessage, pathContents, refreshContents, storageApiClient, bucket, currentPath]) + }, [addToast, pathContents, refreshContents, storageApiClient, bucket, currentPath]) const handleDownload = useCallback(async ( toDownload: ISelectedFile @@ -167,16 +167,16 @@ const BucketPage: React.FC = () => { } } if (hasFolder) { - addToastMessage({ - message: t`Folder uploads are currently not supported`, - appearance: "error" + addToast({ + title: t`Folder uploads are currently not supported`, + type: "error" }) } else { uploadFiles(bucket.id, files, path) .then(() => refreshContents()) .catch(console.error) } - }, [addToastMessage, uploadFiles, bucket, refreshContents]) + }, [addToast, uploadFiles, bucket, refreshContents]) const viewFolder = useCallback((toView: ISelectedFile) => { const fileSystemItem = pathContents.find(f => f.cid === toView.cid && f.name === toView.name) diff --git a/packages/storage-ui/src/Themes/DarkTheme.ts b/packages/storage-ui/src/Themes/DarkTheme.ts index df463b9410..483034e653 100644 --- a/packages/storage-ui/src/Themes/DarkTheme.ts +++ b/packages/storage-ui/src/Themes/DarkTheme.ts @@ -521,25 +521,6 @@ export const darkTheme = createTheme({ color: "var(--gray9)" } }, - Toaster: { - closeIcon: { - fill: "var(--gray9)" - }, - message: { - color: "var(--gray9)" - }, - typeIcon: { - root: { - fill: "var(--gray9)" - }, - success: { - fill: "var(--green8)" - }, - error: { - fill: "var(--red8)" - } - } - }, Button: { variants: { primary: { diff --git a/yarn.lock b/yarn.lock index 94a3bc3bb0..1eb4fc2e86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -44,6 +44,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.5.tgz#f56db0c4bb1bbbf221b4e81345aab4141e7cb0e9" integrity sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg== +"@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + "@babel/core@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" @@ -66,7 +71,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.4.5", "@babel/core@^7.7.5": +"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.4.5": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== @@ -87,6 +92,27 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.7.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.4.tgz#a70d06c58ae1fce39c23f8efd79f9d5eb8b2f397" + integrity sha512-Lkcv9I4a8bgUI8LJOLM6IKv6hnz1KOju6KM1lceqVMKlKKqNRopYd2Pc9MgIurqvMJ6BooemrnJz8jlIiQIpsA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + "@babel/generator@^7.11.6", "@babel/generator@^7.12.10", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.10.tgz#2b188fc329fb8e4f762181703beffc0fe6df3460" @@ -96,7 +122,7 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.15.4": +"@babel/generator@^7.12.11", "@babel/generator@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== @@ -105,7 +131,7 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.0.0": +"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== @@ -163,6 +189,16 @@ browserslist "^4.14.5" semver "^5.5.0" +"@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + "@babel/helper-compilation-targets@^7.8.7": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" @@ -174,7 +210,7 @@ levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5", "@babel/helper-create-class-features-plugin@^7.8.3": +"@babel/helper-create-class-features-plugin@^7.10.5", "@babel/helper-create-class-features-plugin@^7.8.3": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== @@ -197,6 +233,18 @@ "@babel/helper-replace-supers" "^7.12.1" "@babel/helper-split-export-declaration" "^7.10.4" +"@babel/helper-create-class-features-plugin@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-create-regexp-features-plugin@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" @@ -292,6 +340,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz#1644c01591a15a2f084dd6d092d9430eb1d1216c" @@ -299,6 +354,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.9.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" @@ -314,6 +376,20 @@ "@babel/types" "^7.12.1" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" + integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw== + dependencies: + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.14.9" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/helper-optimise-call-expression@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" @@ -321,11 +397,23 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + "@babel/helper-regex@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" @@ -373,6 +461,16 @@ "@babel/traverse" "^7.12.1" "@babel/types" "^7.12.1" +"@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/helper-simple-access@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" @@ -388,6 +486,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-skip-transparent-expression-wrappers@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" @@ -431,6 +536,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + "@babel/helper-wrap-function@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" @@ -450,7 +560,25 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" -"@babel/highlight@^7.0.0", "@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/highlight@^7.0.0", "@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== @@ -513,12 +641,12 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-proposal-class-properties@^7.7.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" - integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-proposal-decorators@7.8.3": version "7.8.3" @@ -634,7 +762,18 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.12.1" -"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0": +"@babel/plugin-proposal-object-rest-spread@^7.6.2": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" + integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== + dependencies: + "@babel/compat-data" "^7.14.7" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.14.5" + +"@babel/plugin-proposal-object-rest-spread@^7.9.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== @@ -744,7 +883,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.10.4", "@babel/plugin-syntax-flow@^7.8.3": +"@babel/plugin-syntax-flow@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz#2ff654999497d7d7d142493260005263731da180" + integrity sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-flow@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6" integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ== @@ -786,7 +932,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -998,13 +1144,13 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow" "^7.8.3" -"@babel/plugin-transform-flow-strip-types@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz#c497957f09e86e3df7296271e9eb642876bf7788" - integrity sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ== +"@babel/plugin-transform-flow-strip-types@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz#0dc9c1d11dcdc873417903d6df4bed019ef0f85e" + integrity sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-flow" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-flow" "^7.14.5" "@babel/plugin-transform-for-of@^7.12.1": version "7.12.1" @@ -1198,6 +1344,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-parameters@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" + integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-property-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" @@ -1212,13 +1365,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-constant-elements@^7.0.0", "@babel/plugin-transform-react-constant-elements@^7.12.1", "@babel/plugin-transform-react-constant-elements@^7.2.0", "@babel/plugin-transform-react-constant-elements@^7.6.3": +"@babel/plugin-transform-react-constant-elements@^7.0.0", "@babel/plugin-transform-react-constant-elements@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz#4471f0851feec3231cc9aaa0dccde39947c1ac1e" integrity sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-constant-elements@^7.2.0", "@babel/plugin-transform-react-constant-elements@^7.6.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz#41790d856f7c5cec82d2bcf5d0e5064d682522ed" + integrity sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-react-display-name@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" @@ -1610,12 +1770,13 @@ semver "^5.5.0" "@babel/preset-flow@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.10.4.tgz#e0d9c72f8cb02d1633f6a5b7b16763aa2edf659f" - integrity sha512-XI6l1CptQCOBv+ZKYwynyswhtOKwpZZp5n0LG1QKCo8erRhqjoQV6nvx61Eg30JHpysWQSBwA2AWRU3pBbSY5g== + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.14.5.tgz#a1810b0780c8b48ab0bece8e7ab8d0d37712751c" + integrity sha512-pP5QEb4qRUSVGzzKx9xqRuHUrM/jEzMqdrZpdMA+oUCRgd5zM1qGr5y5+ZgAL/1tVv1H0dyk5t4SKJntqyiVtg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-flow-strip-types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-flow-strip-types" "^7.14.5" "@babel/preset-modules@^0.1.3": version "0.1.3" @@ -1684,14 +1845,14 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.14.0": +"@babel/runtime@^7.14.0", "@babel/runtime@^7.5.0", "@babel/runtime@^7.7.6": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== @@ -1731,7 +1892,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.4.5": +"@babel/traverse@^7.1.6", "@babel/traverse@^7.15.4", "@babel/traverse@^7.4.5": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== @@ -1755,7 +1916,7 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.15.4": +"@babel/types@^7.15.4", "@babel/types@^7.2.0": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.4.tgz#74eeb86dbd6748d2741396557b9860e57fce0a0d" integrity sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw== @@ -1763,6 +1924,11 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@chainsafe/browser-storage-hooks@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@chainsafe/browser-storage-hooks/-/browser-storage-hooks-1.0.1.tgz#26d32cde1999914db755a631e2643823c54959f7" @@ -1780,11 +1946,6 @@ dependencies: redoc-cli "^0.12.3" -"@chainsafe/files-api-client@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@chainsafe/files-api-client/-/files-api-client-1.18.1.tgz#bcfdff988743d4684079dca10c4d86f86f93b822" - integrity sha512-FqNZdiBMo5GoHeQgya5u8AdjLhPqBR8iKYxrhp0oWxbb2FJdrExZTmLQT5y2e7vlSvdiY5aJT//4VioK138xmQ== - "@chainsafe/web3-context@1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@chainsafe/web3-context/-/web3-context-1.1.4.tgz#ce0f140af8ccf93af1a189fbdbd6f018b9bf5fb7" @@ -3782,6 +3943,11 @@ resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + "@jest/console@^24.7.1", "@jest/console@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" @@ -5593,11 +5759,6 @@ memory-cache "^0.2.0" web3-utils "^1.3.6" -"@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== - "@types/aria-query@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" @@ -5705,16 +5866,16 @@ integrity sha512-2xtoL22/3Mv6a70i4+4RB7VgbDDORoWwjcqeNysojZA0R7NK17RbY5Gof/2QiFfJgX+KkWghbwJ+d/2SB8Ndzg== "@types/html-minifier-terser@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#551a4589b6ee2cc9c1dff08056128aec29b94880" - integrity sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== "@types/is-function@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.0.tgz#1b0b819b1636c7baf0d6785d030d12edf70c3e83" integrity sha512-iTs9HReBu7evG77Q4EC8hZnqRt57irBDkK9nvmHroiOIVwYMQc4IvYvdRgwKfYepunIY7Oh/dBuuld+Gj9uo6w== -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== @@ -6058,10 +6219,10 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== -"@types/tapable@*", "@types/tapable@^1.0.5": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" - integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== +"@types/tapable@^1", "@types/tapable@^1.0.5": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/testing-library__jest-dom@^5.9.1": version "5.9.2" @@ -6071,9 +6232,9 @@ "@types/jest" "*" "@types/uglify-js@*": - version "3.9.3" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.3.tgz#d94ed608e295bc5424c9600e6b8565407b6b4b6b" - integrity sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w== + version "3.13.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== dependencies: source-map "^0.6.1" @@ -6098,24 +6259,24 @@ integrity sha512-5oiXqR7kwDGZ6+gmzIO2lTC+QsriNuQXZDWNYRV3l2XRN/zmPgnC21DLSx2D05zvD8vnXW6qUg7JnXZ4I6qLVQ== "@types/webpack-sources@*": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-1.4.2.tgz#5d3d4dea04008a779a90135ff96fb5c0c9e6292c" - integrity sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== dependencies: "@types/node" "*" "@types/source-list-map" "*" source-map "^0.7.3" "@types/webpack@^4.41.8": - version "4.41.21" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.21.tgz#cc685b332c33f153bb2f5fc1fa3ac8adeb592dee" - integrity sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA== + version "4.41.30" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.30.tgz#fd3db6d0d41e145a8eeeafcd3c4a7ccde9068ddc" + integrity sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA== dependencies: - "@types/anymatch" "*" "@types/node" "*" - "@types/tapable" "*" + "@types/tapable" "^1" "@types/uglify-js" "*" "@types/webpack-sources" "*" + anymatch "^3.0.0" source-map "^0.6.0" "@types/yargs-parser@*": @@ -6810,11 +6971,16 @@ acorn@^5.0.0, acorn@^5.5.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1, acorn@^6.4.1: +acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + acorn@^7.1.1, acorn@^7.4.0: version "7.4.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" @@ -6891,7 +7057,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -6997,11 +7163,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: color-convert "^2.0.1" ansi-to-html@^0.6.11: - version "0.6.14" - resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.14.tgz#65fe6d08bba5dd9db33f44a20aec331e0010dad8" - integrity sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA== + version "0.6.15" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" + integrity sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ== dependencies: - entities "^1.1.2" + entities "^2.0.0" anymatch@^2.0.0: version "2.0.0" @@ -7011,6 +7177,14 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@^3.0.0, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -7162,7 +7336,17 @@ array.prototype.flat@^1.2.1: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -array.prototype.flatmap@^1.2.1, array.prototype.flatmap@^1.2.3: +array.prototype.flatmap@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + function-bind "^1.1.1" + +array.prototype.flatmap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== @@ -7171,15 +7355,16 @@ array.prototype.flatmap@^1.2.1, array.prototype.flatmap@^1.2.3: es-abstract "^1.17.0-next.1" function-bind "^1.1.1" -array.prototype.map@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" - integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== +array.prototype.map@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.3.tgz#1609623618d3d84134a37d4a220030c2bd18420b" + integrity sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.4" + is-string "^1.0.5" arrify@^1.0.1: version "1.0.1" @@ -7231,15 +7416,12 @@ ast-types-flow@0.0.7, ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -ast-types@0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.3.tgz#c20757fe72ee71278ea0ff3d87e5c2ca30d9edf8" - integrity sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA== - -ast-types@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" - integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== +ast-types@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" astral-regex@^1.0.0: version "1.0.0" @@ -7668,7 +7850,23 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-emotion@^10.0.20, babel-plugin-emotion@^10.0.27: +babel-plugin-emotion@^10.0.20: + version "10.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz#a1fe3503cff80abfd0bdda14abd2e8e57a79d17d" + integrity sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@emotion/hash" "0.8.0" + "@emotion/memoize" "0.7.4" + "@emotion/serialize" "^0.11.16" + babel-plugin-macros "^2.0.0" + babel-plugin-syntax-jsx "^6.18.0" + convert-source-map "^1.5.0" + escape-string-regexp "^1.0.5" + find-root "^1.1.0" + source-map "^0.5.7" + +babel-plugin-emotion@^10.0.27: version "10.0.33" resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz#ce1155dcd1783bbb9286051efee53f4e2be63e03" integrity sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ== @@ -7786,19 +7984,34 @@ babel-plugin-minify-type-constructors@^0.4.3: dependencies: babel-helper-is-void-0 "^0.4.3" -babel-plugin-named-asset-import@^0.3.1, babel-plugin-named-asset-import@^0.3.6: +babel-plugin-named-asset-import@^0.3.1: + version "0.3.7" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd" + integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw== + +babel-plugin-named-asset-import@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be" integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA== babel-plugin-react-docgen@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.1.0.tgz#1dfa447dac9ca32d625a123df5733a9e47287c26" - integrity sha512-vzpnBlfGv8XOhJM2zbPyyqw2OLEbelgZZsaaRRTpVwNKuYuc+pUg4+dy7i9gCRms0uOQn4osX571HRcCJMJCmA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz#7cc8e2f94e8dc057a06e953162f0810e4e72257b" + integrity sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ== dependencies: + ast-types "^0.14.2" lodash "^4.17.15" react-docgen "^5.0.0" - recast "^0.14.7" + +"babel-plugin-styled-components@>= 1.12.0": + version "1.13.2" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz#ebe0e6deff51d7f93fceda1819e9b96aeb88278d" + integrity sha512-Vb1R3d4g+MUfPQPVDMCGjm3cDocJEUTR7Xq7QS95JWWeksN1wdFRYpD2kulDgI3Huuaf1CZd+NK4KQmqUFh5dA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-module-imports" "^7.0.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" "babel-plugin-styled-components@>= 1.12.0": version "1.13.2" @@ -8871,6 +9084,17 @@ browserslist@^4.14.5: escalade "^3.1.1" node-releases "^1.1.66" +browserslist@^4.16.6: + version "4.16.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0" + integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ== + dependencies: + caniuse-lite "^1.0.30001251" + colorette "^1.3.0" + electron-to-chromium "^1.3.811" + escalade "^3.1.1" + node-releases "^1.1.75" + bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -9009,6 +9233,24 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +c8@^7.6.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/c8/-/c8-7.8.0.tgz#8fcfe848587d9d5796f22e9b0546a387a66d1b3b" + integrity sha512-x2Bx+IIEd608B1LmjiNQ/kizRPkCWo5XzuV57J9afPjAHSnYXALwbCSOkQ7cSaNXBNblfqcvdycj+klmL+j6yA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@istanbuljs/schema" "^0.1.2" + find-up "^5.0.0" + foreground-child "^2.0.0" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-reports "^3.0.2" + rimraf "^3.0.0" + test-exclude "^6.0.0" + v8-to-istanbul "^8.0.0" + yargs "^16.2.0" + yargs-parser "^20.2.7" + cacache@^12.0.2: version "12.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" @@ -9178,10 +9420,15 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001111, caniuse-lite@^1.0.30001157: - version "1.0.30001197" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001197.tgz" - integrity sha512-8aE+sqBqtXz4G8g35Eg/XEaFr2N7rd/VQ6eABGBmNtcB8cN6qNJhMi6oSFy4UWWZgqgL3filHT8Nha4meu3tsw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001111, caniuse-lite@^1.0.30001157: + version "1.0.30001255" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz" + integrity sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ== + +caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001251: + version "1.0.30001252" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz#cb16e4e3dafe948fc4a9bb3307aea054b912019a" + integrity sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw== capture-exit@^2.0.0: version "2.0.0" @@ -9190,11 +9437,16 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -case-sensitive-paths-webpack-plugin@2.3.0, case-sensitive-paths-webpack-plugin@^2.2.0: +case-sensitive-paths-webpack-plugin@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== +case-sensitive-paths-webpack-plugin@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -9434,9 +9686,9 @@ clean-stack@^2.0.0: integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-boxes@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" - integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== cli-cursor@^2.1.0: version "2.1.0" @@ -9654,7 +9906,7 @@ colorette@^1.1.0, colorette@^1.2.2: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== -colorette@^1.2.0: +colorette@^1.2.0, colorette@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af" integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== @@ -9840,6 +10092,13 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= +convert-source-map@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -9887,21 +10146,31 @@ core-js-compat@^3.6.2: browserslist "^4.8.5" semver "7.0.0" -core-js-pure@^3.0.0, core-js-pure@^3.0.1: +core-js-pure@^3.0.0: version "3.6.5" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== +core-js-pure@^3.0.1: + version "3.17.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.17.2.tgz#ba6311b6aa1e2f2adeba4ac6ec51a9ff40bdc1af" + integrity sha512-2VV7DlIbooyTI7Bh+yzOOWL9tGwLnQKHno7qATE+fqZzDKYr6llVjVQOzpD/QLZFgXDPb8T71pJokHEZHEYJhQ== + core-js@^2.4.0, core-js@^2.5.0: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.0.1, core-js@^3.0.4, core-js@^3.5.0, core-js@^3.6.5: +core-js@^3.0.1, core-js@^3.5.0, core-js@^3.6.5: version "3.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== +core-js@^3.0.4: + version "3.17.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.17.2.tgz#f960eae710dc62c29cca93d5332e3660e289db10" + integrity sha512-XkbXqhcXeMHPRk2ItS+zQYliAMilea2euoMsnpRRdDad6b2VY6CQQcwz1K8AnWesfw4p165RzY0bTnr3UrbYiA== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -10413,10 +10682,10 @@ cypress-pipe@^2.0.0: resolved "https://registry.yarnpkg.com/cypress-pipe/-/cypress-pipe-2.0.0.tgz#577df7a70a8603d89a96dfe4092a605962181af8" integrity sha512-KW9s+bz4tFLucH3rBGfjW+Q12n7S4QpUSSyxiGrgPOfoHlbYWzAGB3H26MO0VTojqf9NVvfd5Kt0MH5XMgbfyg== -cypress@^8.3.1: - version "8.3.1" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-8.3.1.tgz#c6760dbb907df2570b0e1ac235fa31c30f9260a6" - integrity sha512-1v6pfx+/5cXhaT5T6QKOvnkawmEHWHLiVzm3MYMoQN1fkX2Ma1C32STd3jBStE9qT5qPSTILjGzypVRxCBi40g== +cypress@^8.4: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-8.4.0.tgz#09ec06a73f1cb10121c103cba15076e659e24876" + integrity sha512-RtVgGFR06ikyMaq/VqapeqOjGaIA42PpK7F0qe1MCiFArfUuJECsLmeYaOA+1TlmNUgJNMSF5fWKkZIJr5Uc7w== dependencies: "@cypress/request" "^2.88.6" "@cypress/xvfb" "^1.2.4" @@ -10530,7 +10799,14 @@ debug@=3.1.0: dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: +debug@^3.0.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -11011,7 +11287,7 @@ dotenv-webpack@^1.7.0: dependencies: dotenv-defaults "^1.0.2" -dotenv@8.2.0, dotenv@^8.0.0: +dotenv@8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== @@ -11021,6 +11297,11 @@ dotenv@^6.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== +dotenv@^8.0.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" @@ -11092,7 +11373,12 @@ ejs@^2.7.4: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.523: +electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.811: + version "1.3.829" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.829.tgz#efd360b594824fcd84e24c6eb0c8e41e2a44fbc7" + integrity sha512-5EXDbvsaLRxS1UOfRr8Hymp3dR42bvBNPgzVuPwUFj3v66bpvDUcNwwUywQUQYn/scz26/3Sgd3fNVGQOlVwvQ== + +electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.523: version "1.3.534" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.534.tgz#fc7af8518dd00a5b22a24aed3f116b5d097e2330" integrity sha512-7x2S3yUrspNHQOoPk+Eo+iHViSiJiEGPI6BpmLy1eT2KRNGCkBt/NUYqjfXLd1DpDCQp7n3+LfA1RkbG+LqTZQ== @@ -11108,9 +11394,9 @@ electron-to-chromium@^1.3.591: integrity sha512-nLO2Wd2yU42eSoNJVQKNf89CcEGqeFZd++QsnN2XIgje1s/19AgctfjLIbPORlvcCO8sYjLwX4iUgDdusOY8Sg== element-resize-detector@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.1.tgz#b0305194447a4863155e58f13323a0aef30851d1" - integrity sha512-BdFsPepnQr9fznNPF9nF4vQ457U/ZJXQDSNF1zBe7yaga8v9AdZf3/NElYxFdUh7SitSGt040QygiTo6dtatIw== + version "1.2.3" + resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" + integrity sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ== dependencies: batch-processor "1.0.0" @@ -11211,7 +11497,7 @@ enhanced-resolve@^3.4.0: object-assign "^4.0.1" tapable "^0.2.7" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0, enhanced-resolve@^4.3.0: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== @@ -11220,6 +11506,15 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0, enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -11227,7 +11522,7 @@ enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" -entities@^1.1.1, entities@^1.1.2: +entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -11256,7 +11551,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.17.5: +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: version "1.17.6" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== @@ -11273,6 +11568,29 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1, es- string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" +es-abstract@^1.17.0-next.0, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: + version "1.18.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.5.tgz#9b10de7d4c206a3581fd5b2124233e04db49ae19" + integrity sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + es-abstract@^1.18.0-next.0: version "1.18.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" @@ -11317,15 +11635,16 @@ es-array-method-boxes-properly@^1.0.0: integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-get-iterator@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" - integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== + 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: - es-abstract "^1.17.4" + call-bind "^1.0.2" + get-intrinsic "^1.1.0" has-symbols "^1.0.1" - is-arguments "^1.0.4" - is-map "^2.0.1" - is-set "^2.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" @@ -11348,9 +11667,9 @@ es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14: next-tick "~1.0.0" es5-shim@^4.5.13: - version "4.5.14" - resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.14.tgz#90009e1019d0ea327447cb523deaff8fe45697ef" - integrity sha512-7SwlpL+2JpymWTt8sNLuC2zdhhc+wrfe5cMPI2j0o6WsPdfAiPwmFy2f0AocPB4RQVBOZ9kNTgi5YF7TdhkvEg== + version "4.6.2" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.2.tgz#827cdd0c6fb5beb26fd368d65430e8b5eaeba942" + integrity sha512-n0XTVMGps+Deyr38jtqKPR5F5hb9owYeRQcKJW39eFvzUk/u/9Ww315werRzbiNMnHCUw/YHDPBphTlEnzdi+A== es6-iterator@2.0.3, es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" @@ -11395,9 +11714,9 @@ es6-set@~0.1.5: event-emitter "~0.3.5" es6-shim@^0.35.5: - version "0.35.5" - resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.5.tgz#46f59dc0a84a1c5029e8ff1166ca0a902077a9ab" - integrity sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg== + version "0.35.6" + resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.6.tgz#d10578301a83af2de58b9eadb7c2c9945f7388a0" + integrity sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA== es6-symbol@3.1.1: version "3.1.1" @@ -11700,7 +12019,7 @@ espree@^6.1.2: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" -esprima@^4.0.0, esprima@^4.0.1, 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== @@ -11736,6 +12055,15 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== +estree-to-babel@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/estree-to-babel/-/estree-to-babel-3.2.1.tgz#82e78315275c3ca74475fdc8ac1a5103c8a75bf5" + integrity sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg== + dependencies: + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.2.0" + c8 "^7.6.0" + estree-walker@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" @@ -12903,7 +13231,16 @@ find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: +find-cache-dir@^3.0.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -12947,6 +13284,14 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -13018,6 +13363,14 @@ foreach@^2.0.4, foreach@^2.0.5: resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -13267,23 +13620,24 @@ function-bind@^1.1.1: integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45" - integrity sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg== + version "1.1.4" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.4.tgz#e4ea839b9d3672ae99d0efd9f38d9191c5eaac83" + integrity sha512-iqy1pIotY/RmhdFZygSSlW0wko2yxkSCKqsuv4pr8QESohpYyG/Z7B/XXvPRKTJS//960rgguE5mSRUsDdaJrQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - functions-have-names "^1.2.0" + es-abstract "^1.18.0-next.2" + functions-have-names "^1.2.2" functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -functions-have-names@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.1.tgz#a981ac397fa0c9964551402cdc5533d7a4d52f91" - integrity sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA== +functions-have-names@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21" + integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA== fuse.js@^3.4.6: version "3.6.1" @@ -13330,6 +13684,11 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "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@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -13349,6 +13708,15 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -13373,6 +13741,14 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + 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" @@ -13434,7 +13810,19 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -13503,9 +13891,9 @@ globals@^9.18.0: integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globalthis@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" - integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" + integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== dependencies: define-properties "^1.1.3" @@ -13660,6 +14048,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -13685,6 +14078,18 @@ has-symbols@^1.0.0, has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -13886,7 +14291,12 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" -html-entities@^1.2.0, html-entities@^1.3.1: +html-entities@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-entities@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== @@ -13932,16 +14342,16 @@ html-webpack-plugin@4.0.0-beta.11: util.promisify "1.0.0" html-webpack-plugin@^4.0.0-beta.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz#53bf8f6d696c4637d5b656d3d9863d89ce8174fd" - integrity sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w== + version "4.5.2" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" + integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== dependencies: "@types/html-minifier-terser" "^5.0.0" "@types/tapable" "^1.0.5" "@types/webpack" "^4.41.8" html-minifier-terser "^5.0.1" loader-utils "^1.2.3" - lodash "^4.17.15" + lodash "^4.17.20" pretty-error "^2.1.1" tapable "^1.1.3" util.promisify "1.0.0" @@ -14335,6 +14745,15 @@ internal-slot@^1.0.2: has "^1.0.3" side-channel "^1.0.2" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -14424,6 +14843,14 @@ is-arguments@^1.0.4: resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== +is-arguments@^1.1.0: + 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" @@ -14434,6 +14861,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -14448,6 +14882,14 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@2.0.4, is-buffer@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" @@ -14473,6 +14915,11 @@ is-callable@^1.2.2: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== +is-callable@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -14506,6 +14953,13 @@ is-core-module@^2.0.0: dependencies: has "^1.0.3" +is-core-module@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" + integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -14697,10 +15151,10 @@ is-ipfs@^6.0.1: multiformats "^9.0.0" uint8arrays "^2.1.3" -is-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" - integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== +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-module@^1.0.0: version "1.0.0" @@ -14717,6 +15171,13 @@ is-negative-zero@^2.0.1: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -14804,6 +15265,14 @@ is-regex@^1.0.4, is-regex@^1.1.0, is-regex@^1.1.1: dependencies: has-symbols "^1.0.1" +is-regex@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" @@ -14819,10 +15288,10 @@ is-root@2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== -is-set@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" - integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== +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-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" @@ -14834,11 +15303,18 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-string@^1.0.4, is-string@^1.0.5: +is-string@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -14953,6 +15429,11 @@ istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" @@ -14975,6 +15456,15 @@ istanbul-lib-report@^2.0.4: make-dir "^2.1.0" supports-color "^6.1.0" +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + istanbul-lib-source-maps@^3.0.1: version "3.0.6" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" @@ -14993,12 +15483,20 @@ istanbul-reports@^2.2.6: dependencies: html-escaper "^2.0.0" +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + iterate-iterator@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== -iterate-value@^1.0.0: +iterate-value@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== @@ -15648,7 +16146,14 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.1, json5@^2.1.2: +json5@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +json5@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== @@ -16173,6 +16678,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash-es@^4.17.11, lodash-es@^4.17.14: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" @@ -16258,12 +16770,12 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@>=3.5 <5", lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5: +"lodash@>=3.5 <5", lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.21: +lodash@^4.17.12, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -16412,7 +16924,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.2: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -17429,6 +17941,11 @@ node-releases@^1.1.66: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.66.tgz#609bd0dc069381015cd982300bae51ab4f1b1814" integrity sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg== +node-releases@^1.1.75: + version "1.1.75" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" + integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== + normalize-hex@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/normalize-hex/-/normalize-hex-0.0.2.tgz#5491c43759db2f06b7168d8419f4925c271ab27e" @@ -17631,6 +18148,11 @@ object-hash@^2.0.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== +object-inspect@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + object-inspect@^1.7.0, object-inspect@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" @@ -17705,7 +18227,17 @@ object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.2: es-abstract "^1.17.5" has "^1.0.3" -"object.fromentries@^2.0.0 || ^1.0.0", object.fromentries@^2.0.2: +"object.fromentries@^2.0.0 || ^1.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has "^1.0.3" + +object.fromentries@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== @@ -17723,6 +18255,15 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0 define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +object.getownpropertydescriptors@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -17802,7 +18343,15 @@ open@^6.3.0: dependencies: is-wsl "^1.1.0" -open@^7.0.0, open@^7.0.2: +open@^7.0.0: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +open@^7.0.2: version "7.1.0" resolved "https://registry.yarnpkg.com/open/-/open-7.1.0.tgz#68865f7d3cb238520fa1225a63cf28bcf8368a1c" integrity sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA== @@ -17952,6 +18501,13 @@ p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -17973,6 +18529,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -19199,7 +19762,7 @@ postcss@^6.0.1: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== @@ -19208,6 +19771,15 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.26: + version "7.0.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + preact@10.4.1: version "10.4.1" resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" @@ -19307,7 +19879,7 @@ prismjs@~1.17.0: optionalDependencies: clipboard "^2.0.0" -private@^0.1.6, private@^0.1.8, private@~0.1.5: +private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -19346,15 +19918,16 @@ promise-to-callback@^1.0.0: set-immediate-shim "^1.0.1" promise.allsettled@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9" - integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.4.tgz#65e71f2a604082ed69c548b68603294090ee6803" + integrity sha512-o73CbvQh/OnPFShxHcHxk0baXR2a1m4ozb85ha0H14VEoi/EJJLa9mnPfEWJx9RjA9MLfhdjZ8I6HhWtBa64Ag== dependencies: - array.prototype.map "^1.0.1" + array.prototype.map "^1.0.3" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - iterate-value "^1.0.0" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.0.2" + iterate-value "^1.0.2" promise.prototype.finally@^3.1.0: version "3.1.2" @@ -19598,11 +20171,16 @@ querystring-es3@^0.2.0: resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= -querystring@0.2.0, querystring@^0.2.0: +querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -19816,15 +20394,17 @@ react-dnd@14.0.2: hoist-non-react-statics "^3.3.2" react-docgen@^5.0.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-5.3.0.tgz#9aabde5e69f1993c8ba839fd9a86696504654589" - integrity sha512-hUrv69k6nxazOuOmdGeOpC/ldiKy7Qj/UFpxaQi0eDMrUFUTIPGtY5HJu7BggSmiyAMfREaESbtBL9UzdQ+hyg== + version "5.4.0" + resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-5.4.0.tgz#2cd7236720ec2769252ef0421f23250b39a153a1" + integrity sha512-JBjVQ9cahmNlfjMGxWUxJg919xBBKAoy3hgDgKERbR+BcF4ANpDuzWAScC7j27hZfd8sJNmMPOLWo9+vB/XJEQ== dependencies: "@babel/core" "^7.7.5" + "@babel/generator" "^7.12.11" "@babel/runtime" "^7.7.6" - ast-types "^0.13.2" + ast-types "^0.14.2" commander "^2.19.0" doctrine "^3.0.0" + estree-to-babel "^3.1.0" neo-async "^2.6.1" node-dir "^0.1.10" strip-indent "^3.0.0" @@ -19849,11 +20429,11 @@ react-dom@^17.0.1: scheduler "^0.20.2" react-draggable@^4.0.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3" - integrity sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w== + version "4.4.4" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.4.tgz#5b26d9996be63d32d285a426f41055de87e59b2f" + integrity sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA== dependencies: - classnames "^2.2.5" + clsx "^1.1.1" prop-types "^15.6.0" react-dropzone@^11.2.4: @@ -19865,7 +20445,12 @@ react-dropzone@^11.2.4: file-selector "^0.2.2" prop-types "^15.7.2" -react-error-overlay@^6.0.3, react-error-overlay@^6.0.7: +react-error-overlay@^6.0.3: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== + +react-error-overlay@^6.0.7: version "6.0.7" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== @@ -20417,16 +21002,6 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" -recast@^0.14.7: - version "0.14.7" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.14.7.tgz#4f1497c2b5826d42a66e8e3c9d80c512983ff61d" - integrity sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A== - dependencies: - ast-types "0.11.3" - esprima "~4.0.0" - private "~0.1.5" - source-map "~0.6.1" - receptacle@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" @@ -20559,7 +21134,12 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: +regenerator-runtime@^0.13.2: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== @@ -20601,6 +21181,14 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -20877,7 +21465,15 @@ resolve@1.17.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.13.1, resolve@^1.15.1, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.11.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1: version "1.18.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== @@ -21240,7 +21836,7 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@2.7.0, schema-utils@^2.0.1, schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: +schema-utils@2.7.0, schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6: version "2.7.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== @@ -21258,6 +21854,15 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" +schema-utils@^2.0.1, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + schema-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" @@ -21615,6 +22220,15 @@ side-channel@^1.0.2: es-abstract "^1.17.0-next.1" object-inspect "^1.7.0" +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -22108,7 +22722,16 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -22117,7 +22740,21 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.2: +"string.prototype.matchall@^4.0.0 || ^3.0.1": + version "4.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" + integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.matchall@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== @@ -22138,12 +22775,13 @@ string.prototype.padend@^3.0.0: es-abstract "^1.17.0-next.1" string.prototype.padstart@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.0.tgz#b47c087540d0710be5a49375751a0a627bd4ff90" - integrity sha512-envqZvUp2JItI+OeQ5UAh1ihbAV5G/2bixTojvlIa090GGqF+NQRxbWb2nv9fTGrZABv6+pE6jXoAZhhS2k4Hw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.2.tgz#f9b9ce66bedd7c06acb40ece6e34c6046e1a019d" + integrity sha512-HDpngIP3pd0DeazrfqzuBrQZa+D2arKWquEHfGt5LzVjd+roLC3cjqVI0X8foaZz5rrrhcu8oJAQamW8on9dqw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.2" string.prototype.trimend@^1.0.1: version "1.0.1" @@ -22161,6 +22799,14 @@ string.prototype.trimend@^1.0.3: call-bind "^1.0.0" define-properties "^1.1.3" +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string.prototype.trimstart@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" @@ -22177,6 +22823,14 @@ string.prototype.trimstart@^1.0.3: call-bind "^1.0.0" define-properties "^1.1.3" +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -22308,12 +22962,28 @@ style-loader@0.23.1: schema-utils "^1.0.0" style-loader@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" - integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== dependencies: loader-utils "^2.0.0" - schema-utils "^2.6.6" + schema-utils "^2.7.0" + +styled-components@^5.3.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.1.tgz#8a86dcd31bff7049c2ed408bae36fa23f03f071a" + integrity sha512-JThv2JRzyH0NOIURrk9iskdxMSAAtCfj/b2Sf1WJaCUsloQkblepy1jaCLX/bYE+mhYo3unmwVSI9I5d9ncSiQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^0.8.8" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" styled-components@^5.3.0: version "5.3.1" @@ -22450,12 +23120,14 @@ symbol-tree@^3.2.2: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== symbol.prototype.description@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.2.tgz#f325e1e6ad534b3b29c9c3ca73c136c9ce03c5e2" - integrity sha512-2CW5SU4/Ki1cYOOHcL2cXK4rxSg5hCU1TwZ7X4euKhV9VnfqKslh7T6/UyKkubA8cq2tOmsOv7m3ZUmQslBRuw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz#d30e01263b6020fbbd2d2884a6276ce4d49ab568" + integrity sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ== dependencies: - es-abstract "^1.17.0-next.1" - has-symbols "^1.0.1" + call-bind "^1.0.2" + get-symbol-description "^1.0.0" + has-symbols "^1.0.2" + object.getownpropertydescriptors "^2.1.2" table@^5.2.3: version "5.4.6" @@ -22506,9 +23178,9 @@ telejson@^5.0.2: memoizerific "^1.11.3" term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== terser-webpack-plugin@2.3.8, terser-webpack-plugin@^2.1.2: version "2.3.8" @@ -22559,6 +23231,15 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + testrpc@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" @@ -22855,6 +23536,11 @@ tslib@^2.0.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== +tslib@^2.0.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tslib@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" @@ -23007,6 +23693,16 @@ ultron@~1.1.0: resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + underscore@1.12.1: version "1.12.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" @@ -23018,9 +23714,9 @@ underscore@1.9.1: integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== unfetch@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.1.0.tgz#6ec2dd0de887e58a4dee83a050ded80ffc4137db" - integrity sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg== + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -23375,6 +24071,15 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== +v8-to-istanbul@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz#4229f2a99e367f3f018fa1d5c2b8ec684667c69c" + integrity sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -23513,7 +24218,7 @@ watchpack-chokidar2@^2.0.1: dependencies: chokidar "^2.1.8" -watchpack@^1.4.0: +watchpack@^1.4.0, watchpack@^1.7.4: version "1.7.5" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== @@ -23524,7 +24229,7 @@ watchpack@^1.4.0: chokidar "^3.4.1" watchpack-chokidar2 "^2.0.1" -watchpack@^1.6.0, watchpack@^1.7.4: +watchpack@^1.6.0: version "1.7.4" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== @@ -24141,7 +24846,18 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webpack-dev-middleware@^3.7.0, webpack-dev-middleware@^3.7.2: +webpack-dev-middleware@^3.7.0: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-middleware@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== @@ -24299,9 +25015,9 @@ webpack@^3.0.0: yargs "^8.0.2" webpack@^4.33.0, webpack@^4.38.0: - version "4.44.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" - integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0" @@ -24311,7 +25027,7 @@ webpack@^4.33.0, webpack@^4.38.0: ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" + enhanced-resolve "^4.5.0" eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" loader-runner "^2.4.0" @@ -24425,6 +25141,17 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -24910,7 +25637,7 @@ yargs-parser@^2.4.1: camelcase "^3.0.0" lodash.assign "^4.0.6" -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.7: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== @@ -24955,6 +25682,19 @@ yargs@^13.0.0, yargs@^13.2.4, yargs@^13.3.0, yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" +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== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^17.0.1: version "17.1.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" @@ -25030,6 +25770,11 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + yup@^0.32.8: version "0.32.8" resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.8.tgz#16e4a949a86a69505abf99fd0941305ac9adfc39"