From 6ffbf95abd9abddbf9a6fc7b1be384f5b242f2d2 Mon Sep 17 00:00:00 2001 From: checktheroads Date: Sun, 3 Jan 2021 23:51:09 -0700 Subject: [PATCH] add typings for eslint --- hyperglass/ui/.eslintrc | 59 +- hyperglass/ui/.prettierignore | 8 + hyperglass/ui/.prettierrc | 11 + hyperglass/ui/components/card/body.tsx | 5 +- hyperglass/ui/components/card/footer.tsx | 4 +- hyperglass/ui/components/card/header.tsx | 7 +- hyperglass/ui/components/card/types.ts | 6 +- hyperglass/ui/components/codeBlock.tsx | 2 +- .../ui/components/countdown/countdown.tsx | 8 +- hyperglass/ui/components/countdown/types.ts | 4 +- hyperglass/ui/components/debugger.tsx | 7 +- hyperglass/ui/components/footer/button.tsx | 10 +- hyperglass/ui/components/footer/colorMode.tsx | 61 +- hyperglass/ui/components/footer/footer.tsx | 8 +- hyperglass/ui/components/form/field.tsx | 8 +- .../ui/components/form/queryLocation.tsx | 2 +- hyperglass/ui/components/form/queryTarget.tsx | 4 +- hyperglass/ui/components/form/queryType.tsx | 2 +- hyperglass/ui/components/form/queryVrf.tsx | 2 +- .../ui/components/form/resolvedTarget.tsx | 9 +- hyperglass/ui/components/form/row.tsx | 2 +- .../ui/components/greeting/greeting.tsx | 10 +- hyperglass/ui/components/header/header.tsx | 8 +- hyperglass/ui/components/header/logo.tsx | 2 +- .../ui/components/header/subtitleOnly.tsx | 5 +- hyperglass/ui/components/header/title.tsx | 22 +- hyperglass/ui/components/header/titleOnly.tsx | 2 +- .../ui/components/header/useTitleSize.ts | 4 +- hyperglass/ui/components/help/modal.tsx | 2 +- hyperglass/ui/components/label/label.tsx | 15 +- hyperglass/ui/components/layout/frame.tsx | 5 +- .../ui/components/layout/resetButton.tsx | 5 +- hyperglass/ui/components/loading.tsx | 3 +- hyperglass/ui/components/lookingGlass.tsx | 13 +- .../ui/components/markdown/elements.tsx | 34 +- .../ui/components/markdown/markdown.tsx | 2 +- hyperglass/ui/components/markdown/table.tsx | 6 +- hyperglass/ui/components/markdown/types.ts | 8 +- hyperglass/ui/components/meta.tsx | 2 +- hyperglass/ui/components/output/cell.tsx | 2 +- hyperglass/ui/components/output/fields.tsx | 29 +- hyperglass/ui/components/output/table.tsx | 8 +- hyperglass/ui/components/output/text.tsx | 5 +- hyperglass/ui/components/path/button.tsx | 2 +- hyperglass/ui/components/path/chart.tsx | 4 +- hyperglass/ui/components/path/controls.tsx | 5 +- hyperglass/ui/components/path/path.tsx | 5 +- hyperglass/ui/components/path/types.ts | 2 +- hyperglass/ui/components/path/util.ts | 4 +- .../ui/components/results/copyButton.tsx | 5 +- hyperglass/ui/components/results/error.tsx | 2 +- hyperglass/ui/components/results/group.tsx | 17 +- hyperglass/ui/components/results/guards.ts | 7 +- hyperglass/ui/components/results/header.tsx | 5 +- .../ui/components/results/individual.tsx | 22 +- .../ui/components/results/requeryButton.tsx | 12 +- hyperglass/ui/components/select/select.tsx | 8 +- hyperglass/ui/components/select/styles.tsx | 48 +- hyperglass/ui/components/select/types.ts | 8 + hyperglass/ui/components/submit/submit.tsx | 49 +- hyperglass/ui/components/table/body.tsx | 2 +- hyperglass/ui/components/table/button.tsx | 2 +- hyperglass/ui/components/table/cell.tsx | 2 +- hyperglass/ui/components/table/head.tsx | 2 +- hyperglass/ui/components/table/main.tsx | 18 +- hyperglass/ui/components/table/pageSelect.tsx | 2 +- hyperglass/ui/components/table/row.tsx | 2 +- hyperglass/ui/components/table/table.tsx | 2 +- hyperglass/ui/components/util/if.tsx | 6 +- hyperglass/ui/components/util/types.ts | 2 - hyperglass/ui/context/HyperglassProvider.tsx | 2 +- hyperglass/ui/context/types.ts | 6 - hyperglass/ui/hooks/useASNDetail.ts | 4 +- hyperglass/ui/hooks/useBooleanValue.ts | 2 +- hyperglass/ui/hooks/useDNSQuery.ts | 3 +- hyperglass/ui/hooks/useLGQuery.ts | 3 +- hyperglass/ui/hooks/useOpposingColor.ts | 2 +- hyperglass/ui/hooks/useStrf.ts | 2 +- hyperglass/ui/hooks/useTableToString.ts | 4 +- hyperglass/ui/package.json | 17 +- hyperglass/ui/pages/_app.tsx | 18 +- hyperglass/ui/pages/_document.tsx | 6 +- hyperglass/ui/pages/_error.tsx | 11 +- hyperglass/ui/pages/index.tsx | 5 +- hyperglass/ui/prettier.config.js | 1 - hyperglass/ui/public/noflash.js | 40 - hyperglass/ui/tsconfig.json | 11 +- hyperglass/ui/util/common.js | 263 +++++ hyperglass/ui/util/common.ts | 31 +- hyperglass/ui/yarn.lock | 956 ++++++++++++++++-- 90 files changed, 1637 insertions(+), 416 deletions(-) create mode 100644 hyperglass/ui/.prettierignore create mode 100644 hyperglass/ui/.prettierrc delete mode 100644 hyperglass/ui/prettier.config.js delete mode 100644 hyperglass/ui/public/noflash.js create mode 100644 hyperglass/ui/util/common.js diff --git a/hyperglass/ui/.eslintrc b/hyperglass/ui/.eslintrc index 6beb7e1..ace7086 100644 --- a/hyperglass/ui/.eslintrc +++ b/hyperglass/ui/.eslintrc @@ -1,9 +1,58 @@ { - "extends": "@upstatement/eslint-config/react", - "plugins": ["react-hooks"], - "settings": { "import/resolver": { "typescript": {} } }, + "root": true, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react/recommended", + "plugin:prettier/recommended", + "prettier/@typescript-eslint" + ], + "parser": "@typescript-eslint/parser", + "env": { + "browser": true, + "es6": true, + "node": true + }, + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true, + "arrowFunctions": true + }, + "project": "./tsconfig.json" + }, + "plugins": ["react", "@typescript-eslint", "prettier"], + "settings": { + "react": { + "version": "detect" + }, + "import/resolver": { + "node": { + "extensions": [".js", ".jsx", ".ts", ".tsx"], + "paths": ["./src"] + } + } + }, "rules": { - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": ["warn"] + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-unused-vars-experimental": "error", + "no-unused-vars": "off", + "react/jsx-uses-react": "off", + "react/react-in-jsx-scope": "off", + "comma-dangle": ["error", "always-multiline"], + "global-require": "off", + "import/no-dynamic-require": "off", + "import/prefer-default-export": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/no-empty-interface": [ + "error", + { + "allowSingleExtends": true + } + ] } } diff --git a/hyperglass/ui/.prettierignore b/hyperglass/ui/.prettierignore new file mode 100644 index 0000000..b1e1b18 --- /dev/null +++ b/hyperglass/ui/.prettierignore @@ -0,0 +1,8 @@ +node_modules +dist +package.json +yarn.lock +package-lock.json +.eslintrc +tsconfig.json +.next/ \ No newline at end of file diff --git a/hyperglass/ui/.prettierrc b/hyperglass/ui/.prettierrc new file mode 100644 index 0000000..354b46a --- /dev/null +++ b/hyperglass/ui/.prettierrc @@ -0,0 +1,11 @@ +{ + "semi": true, + "printWidth": 100, + "tabWidth": 2, + "singleQuote": true, + "bracketSpacing": true, + "jsxBracketSameLine": false, + "useTabs": false, + "arrowParens": "avoid", + "trailingComma": "all" +} diff --git a/hyperglass/ui/components/card/body.tsx b/hyperglass/ui/components/card/body.tsx index 277356b..7d3e882 100644 --- a/hyperglass/ui/components/card/body.tsx +++ b/hyperglass/ui/components/card/body.tsx @@ -1,12 +1,13 @@ import { Flex } from '@chakra-ui/react'; import { useColorValue } from '~/context'; -import type { ICardBody } from './types'; +import type { TCardBody } from './types'; -export const CardBody = (props: ICardBody) => { +export const CardBody: React.FC = (props: TCardBody) => { const { onClick, ...rest } = props; const bg = useColorValue('white', 'dark.500'); const color = useColorValue('dark.500', 'white'); + console.log('some shit'); return ( ( +export const CardFooter: React.FC = (props: TCardFooter) => ( { +export const CardHeader: React.FC = (props: TCardHeader) => { const { children, ...rest } = props; const bg = useColorValue('blackAlpha.50', 'whiteAlpha.100'); return ( @@ -14,7 +14,8 @@ export const CardHeader = (props: ICardHeader) => { roundedTopLeft={4} roundedTopRight={4} borderBottomWidth="1px" - {...rest}> + {...rest} + > {children} ); diff --git a/hyperglass/ui/components/card/types.ts b/hyperglass/ui/components/card/types.ts index 9c962fb..739e24e 100644 --- a/hyperglass/ui/components/card/types.ts +++ b/hyperglass/ui/components/card/types.ts @@ -1,9 +1,9 @@ import type { FlexProps } from '@chakra-ui/react'; -export interface ICardBody extends Omit { +export interface TCardBody extends Omit { onClick?: () => boolean; } -export interface ICardFooter extends FlexProps {} +export interface TCardFooter extends FlexProps {} -export interface ICardHeader extends FlexProps {} +export interface TCardHeader extends FlexProps {} diff --git a/hyperglass/ui/components/codeBlock.tsx b/hyperglass/ui/components/codeBlock.tsx index c95448a..7b8868f 100644 --- a/hyperglass/ui/components/codeBlock.tsx +++ b/hyperglass/ui/components/codeBlock.tsx @@ -3,7 +3,7 @@ import { useColorValue } from '~/context'; import type { BoxProps } from '@chakra-ui/react'; -export const CodeBlock = (props: BoxProps) => { +export const CodeBlock: React.FC = (props: BoxProps) => { const bg = useColorValue('blackAlpha.100', 'gray.800'); const color = useColorValue('black', 'white'); return ( diff --git a/hyperglass/ui/components/countdown/countdown.tsx b/hyperglass/ui/components/countdown/countdown.tsx index b33969b..6c5b869 100644 --- a/hyperglass/ui/components/countdown/countdown.tsx +++ b/hyperglass/ui/components/countdown/countdown.tsx @@ -3,11 +3,11 @@ import ReactCountdown, { zeroPad } from 'react-countdown'; import { If } from '~/components'; import { useColorValue } from '~/context'; -import type { ICountdown, IRenderer } from './types'; +import type { TCountdown, TRenderer } from './types'; -const Renderer = (props: IRenderer) => { +const Renderer: React.FC = (props: TRenderer) => { const { hours, minutes, seconds, completed, text } = props; - let time = [zeroPad(seconds)]; + const time = [zeroPad(seconds)]; minutes !== 0 && time.unshift(zeroPad(minutes)); hours !== 0 && time.unshift(zeroPad(hours)); const bg = useColorValue('black', 'white'); @@ -28,7 +28,7 @@ const Renderer = (props: IRenderer) => { ); }; -export const Countdown = (props: ICountdown) => { +export const Countdown: React.FC = (props: TCountdown) => { const { timeout, text } = props; const then = timeout * 1000; return ( diff --git a/hyperglass/ui/components/countdown/types.ts b/hyperglass/ui/components/countdown/types.ts index 7828699..c056e9d 100644 --- a/hyperglass/ui/components/countdown/types.ts +++ b/hyperglass/ui/components/countdown/types.ts @@ -1,10 +1,10 @@ import type { CountdownRenderProps } from 'react-countdown'; -export interface IRenderer extends CountdownRenderProps { +export interface TRenderer extends CountdownRenderProps { text: string; } -export interface ICountdown { +export interface TCountdown { timeout: number; text: string; } diff --git a/hyperglass/ui/components/debugger.tsx b/hyperglass/ui/components/debugger.tsx index 094b0f2..dd4b732 100644 --- a/hyperglass/ui/components/debugger.tsx +++ b/hyperglass/ui/components/debugger.tsx @@ -21,7 +21,7 @@ interface TViewer extends Pick { children: React.ReactNode; } -const Viewer = (props: TViewer) => { +const Viewer: React.FC = (props: TViewer) => { const { title, isOpen, onClose, children } = props; const bg = useColorValue('white', 'black'); const color = useColorValue('black', 'white'); @@ -39,7 +39,7 @@ const Viewer = (props: TViewer) => { ); }; -export const Debugger = () => { +export const Debugger: React.FC = () => { const { isOpen: configOpen, onOpen: onConfigOpen, onClose: configClose } = useDisclosure(); const { isOpen: themeOpen, onOpen: onThemeOpen, onClose: themeClose } = useDisclosure(); const { colorMode } = useColorMode(); @@ -64,7 +64,8 @@ export const Debugger = () => { position="relative" justifyContent="center" borderColor={borderColor} - spacing={{ base: 2, lg: 8 }}> + spacing={{ base: 2, lg: 8 }} + > {colorMode.toUpperCase()} diff --git a/hyperglass/ui/components/footer/button.tsx b/hyperglass/ui/components/footer/button.tsx index 18bc3fa..268b948 100644 --- a/hyperglass/ui/components/footer/button.tsx +++ b/hyperglass/ui/components/footer/button.tsx @@ -1,11 +1,11 @@ -import { Box, Button, Menu, MenuButton, MenuList, MenuItem } from '@chakra-ui/react'; +import { Button, Menu, MenuButton, MenuList } from '@chakra-ui/react'; import { Markdown } from '~/components'; import { useColorValue, useBreakpointValue } from '~/context'; import { useOpposingColor } from '~/hooks'; import type { TFooterButton } from './types'; -export const FooterButton = (props: TFooterButton) => { +export const FooterButton: React.FC = (props: TFooterButton) => { const { content, title, side, ...rest } = props; const placement = side === 'left' ? 'top' : side === 'right' ? 'top-end' : undefined; const bg = useColorValue('white', 'gray.900'); @@ -17,7 +17,8 @@ export const FooterButton = (props: TFooterButton) => { as={Button} size={size} variant="ghost" - aria-label={typeof title === 'string' ? title : undefined}> + aria-label={typeof title === 'string' ? title : undefined} + > {title} { textAlign="left" mx={{ base: 1, lg: 2 }} maxW={{ base: '100%', lg: '50vw' }} - {...rest}> + {...rest} + > diff --git a/hyperglass/ui/components/footer/colorMode.tsx b/hyperglass/ui/components/footer/colorMode.tsx index 3626ee0..feee0dd 100644 --- a/hyperglass/ui/components/footer/colorMode.tsx +++ b/hyperglass/ui/components/footer/colorMode.tsx @@ -10,34 +10,37 @@ import type { TColorModeToggle } from './types'; const Sun = dynamic(() => import('@meronex/icons/hi').then(i => i.HiSun)); const Moon = dynamic(() => import('@meronex/icons/hi').then(i => i.HiMoon)); -export const ColorModeToggle = forwardRef((props, ref) => { - const { size = '1.5rem', ...rest } = props; - const { colorMode, toggleColorMode } = useColorMode(); +export const ColorModeToggle = forwardRef( + (props: TColorModeToggle, ref) => { + const { size = '1.5rem', ...rest } = props; + const { colorMode, toggleColorMode } = useColorMode(); - const bg = useColorValue('primary.500', 'yellow.300'); - const color = useOpposingColor(bg); - const label = useColorValue('Switch to dark mode', 'Switch to light mode'); - const btnSize = useBreakpointValue({ base: 'xs', lg: 'sm' }); + const bg = useColorValue('primary.500', 'yellow.300'); + const color = useOpposingColor(bg); + const label = useColorValue('Switch to dark mode', 'Switch to light mode'); + const btnSize = useBreakpointValue({ base: 'xs', lg: 'sm' }); - return ( - - - - ); -}); + return ( + + + + ); + }, +); diff --git a/hyperglass/ui/components/footer/footer.tsx b/hyperglass/ui/components/footer/footer.tsx index 950af99..5ed0d7a 100644 --- a/hyperglass/ui/components/footer/footer.tsx +++ b/hyperglass/ui/components/footer/footer.tsx @@ -9,7 +9,7 @@ import { ColorModeToggle } from './colorMode'; const CodeIcon = dynamic(() => import('@meronex/icons/fi').then(i => i.FiCode)); const ExtIcon = dynamic(() => import('@meronex/icons/go').then(i => i.GoLinkExternal)); -export const Footer = () => { +export const Footer: React.FC = () => { const { web, content, primary_asn } = useConfig(); const footerBg = useColorValue('blackAlpha.50', 'whiteAlpha.100'); @@ -32,7 +32,8 @@ export const Footer = () => { bg={footerBg} color={footerColor} spacing={{ base: 8, lg: 6 }} - justifyContent={{ base: 'center', lg: 'space-between' }}> + justifyContent={{ base: 'center', lg: 'space-between' }} + > @@ -47,7 +48,8 @@ export const Footer = () => { size={btnSize} variant="ghost" rightIcon={} - aria-label={web.external_link.title}> + aria-label={web.external_link.title} + > {web.external_link.title} diff --git a/hyperglass/ui/components/form/field.tsx b/hyperglass/ui/components/form/field.tsx index d0d1a47..dd7d029 100644 --- a/hyperglass/ui/components/form/field.tsx +++ b/hyperglass/ui/components/form/field.tsx @@ -6,7 +6,7 @@ import { useBooleanValue } from '~/hooks'; import { TField, TFormError } from './types'; -export const FormField = (props: TField) => { +export const FormField: React.FC = (props: TField) => { const { name, label, children, labelAddOn, fieldAddOn, hiddenLabels = false, ...rest } = props; const labelColor = useColorValue('blackAlpha.700', 'whiteAlpha.700'); const errorColor = useColorValue('red.500', 'red.300'); @@ -30,7 +30,8 @@ export const FormField = (props: TField) => { my={{ base: 2, lg: 4 }} isInvalid={error !== false} flex={{ base: '1 0 100%', lg: '1 0 33.33%' }} - {...rest}> + {...rest} + > { opacity={opacity} alignItems="center" justifyContent="space-between" - color={error !== false ? errorColor : labelColor}> + color={error !== false ? errorColor : labelColor} + > {label} {labelAddOn} diff --git a/hyperglass/ui/components/form/queryLocation.tsx b/hyperglass/ui/components/form/queryLocation.tsx index 49a8afc..3715183 100644 --- a/hyperglass/ui/components/form/queryLocation.tsx +++ b/hyperglass/ui/components/form/queryLocation.tsx @@ -19,7 +19,7 @@ function buildOptions(networks: TNetwork[]) { }); } -export const QueryLocation = (props: TQuerySelectField) => { +export const QueryLocation: React.FC = (props: TQuerySelectField) => { const { onChange, label } = props; const { networks } = useConfig(); diff --git a/hyperglass/ui/components/form/queryTarget.tsx b/hyperglass/ui/components/form/queryTarget.tsx index 2a6324b..3001d9d 100644 --- a/hyperglass/ui/components/form/queryTarget.tsx +++ b/hyperglass/ui/components/form/queryTarget.tsx @@ -9,8 +9,6 @@ import type { OptionProps } from 'react-select'; import type { TBGPCommunity, TSelectOption } from '~/types'; import type { TQueryTarget } from './types'; -const fqdnPattern = /^(?!:\/\/)([a-zA-Z0-9-]+\.)?[a-zA-Z0-9-][a-zA-Z0-9-]+\.[a-zA-Z-]{2,6}?$/gim; - function buildOptions(communities: TBGPCommunity[]): TSelectOption[] { return communities.map(c => ({ value: c.community, @@ -32,7 +30,7 @@ const Option = (props: OptionProps) => { ); }; -export const QueryTarget = (props: TQueryTarget) => { +export const QueryTarget: React.FC = (props: TQueryTarget) => { const { name, register, onChange, placeholder } = props; const bg = useColorValue('white', 'whiteAlpha.100'); diff --git a/hyperglass/ui/components/form/queryType.tsx b/hyperglass/ui/components/form/queryType.tsx index 85b4779..8459f49 100644 --- a/hyperglass/ui/components/form/queryType.tsx +++ b/hyperglass/ui/components/form/queryType.tsx @@ -13,7 +13,7 @@ function buildOptions(queryTypes: TQuery[]): TSelectOption[] { .map(q => ({ value: q.name, label: q.display_name })); } -export const QueryType = (props: TQuerySelectField) => { +export const QueryType: React.FC = (props: TQuerySelectField) => { const { onChange, label } = props; const { queries } = useConfig(); const { errors } = useFormContext(); diff --git a/hyperglass/ui/components/form/queryVrf.tsx b/hyperglass/ui/components/form/queryVrf.tsx index 54ad00f..80d5ec8 100644 --- a/hyperglass/ui/components/form/queryVrf.tsx +++ b/hyperglass/ui/components/form/queryVrf.tsx @@ -9,7 +9,7 @@ function buildOptions(queryVrfs: TDeviceVrf[]): TSelectOption[] { return queryVrfs.map(q => ({ value: q.id, label: q.display_name })); } -export const QueryVrf = (props: TQueryVrf) => { +export const QueryVrf: React.FC = (props: TQueryVrf) => { const { vrfs, onChange, label } = props; const { selections } = useLGState(); const { exportState } = useLGMethods(); diff --git a/hyperglass/ui/components/form/resolvedTarget.tsx b/hyperglass/ui/components/form/resolvedTarget.tsx index 305f55c..e9c1808 100644 --- a/hyperglass/ui/components/form/resolvedTarget.tsx +++ b/hyperglass/ui/components/form/resolvedTarget.tsx @@ -96,7 +96,8 @@ export const ResolvedTarget = (props: TResolvedTarget) => { colorScheme="primary" justifyContent="space-between" onClick={() => selectTarget(answer4)} - rightIcon={}> + rightIcon={} + > {answer4} )} @@ -109,7 +110,8 @@ export const ResolvedTarget = (props: TResolvedTarget) => { colorScheme="secondary" justifyContent="space-between" onClick={() => selectTarget(answer6)} - rightIcon={}> + rightIcon={} + > {answer6} )} @@ -126,7 +128,8 @@ export const ResolvedTarget = (props: TResolvedTarget) => { colorScheme="red" variant="outline" onClick={errorClose} - leftIcon={}> + leftIcon={} + > {web.text.fqdn_error_button} diff --git a/hyperglass/ui/components/form/row.tsx b/hyperglass/ui/components/form/row.tsx index 2738eb7..2049c8a 100644 --- a/hyperglass/ui/components/form/row.tsx +++ b/hyperglass/ui/components/form/row.tsx @@ -2,7 +2,7 @@ import { Flex } from '@chakra-ui/react'; import { FlexProps } from '@chakra-ui/react'; -export const FormRow = (props: FlexProps) => { +export const FormRow: React.FC = (props: FlexProps) => { return ( { +export const Greeting: React.FC = (props: TGreeting) => { const { web, content } = useConfig(); - const { ack: greetingAck, isOpen, close, open } = useGreeting(); + const { ack: greetingAck, isOpen, close } = useGreeting(); const bg = useColorValue('white', 'gray.800'); const color = useOpposingColor(bg); @@ -48,7 +48,8 @@ export const Greeting = (props: TGreeting) => { isOpen={isOpen.value} motionPreset="slideInBottom" closeOnEsc={web.greeting.required} - closeOnOverlayClick={web.greeting.required}> + closeOnOverlayClick={web.greeting.required} + > { color={color} borderRadius="md" maxW={{ base: '95%', md: '75%' }} - {...props}> + {...props} + > {web.greeting.title} diff --git a/hyperglass/ui/components/header/header.tsx b/hyperglass/ui/components/header/header.tsx index feea41d..70ea337 100644 --- a/hyperglass/ui/components/header/header.tsx +++ b/hyperglass/ui/components/header/header.tsx @@ -7,7 +7,7 @@ import { Title } from './title'; import type { THeader } from './types'; -export const Header = (props: THeader) => { +export const Header: React.FC = (props: THeader) => { const { resetForm, ...rest } = props; const bg = useColorValue('white', 'black'); @@ -35,7 +35,8 @@ export const Header = (props: THeader) => { width="full" flex="0 1 auto" color="gray.500" - {...rest}> + {...rest} + > { maxW={titleWidth} // This is here for the logo justifyContent={justify} - mx={{ base: isSubmitting.value ? 'auto' : 0, lg: 'auto' }}> + mx={{ base: isSubmitting.value ? 'auto' : 0, lg: 'auto' }} + > </AnimatedDiv> </ScaleFade> diff --git a/hyperglass/ui/components/header/logo.tsx b/hyperglass/ui/components/header/logo.tsx index 59ae06e..d26a8bb 100644 --- a/hyperglass/ui/components/header/logo.tsx +++ b/hyperglass/ui/components/header/logo.tsx @@ -34,7 +34,7 @@ function useLogo(): [string, () => void] { return useMemo(() => [fallback ?? src, setFallback], [colorMode]); } -export const Logo = (props: TLogo) => { +export const Logo: React.FC<TLogo> = (props: TLogo) => { const { web } = useConfig(); const { width } = web.logo; diff --git a/hyperglass/ui/components/header/subtitleOnly.tsx b/hyperglass/ui/components/header/subtitleOnly.tsx index 68f7982..4f2d09f 100644 --- a/hyperglass/ui/components/header/subtitleOnly.tsx +++ b/hyperglass/ui/components/header/subtitleOnly.tsx @@ -2,7 +2,7 @@ import { Heading } from '@chakra-ui/react'; import { useConfig, useBreakpointValue } from '~/context'; import { useTitleSize } from './useTitleSize'; -export const SubtitleOnly = () => { +export const SubtitleOnly: React.FC = () => { const { web } = useConfig(); const sizeSm = useTitleSize(web.text.subtitle, 'sm'); const fontSize = useBreakpointValue({ base: sizeSm, lg: 'xl' }); @@ -13,7 +13,8 @@ export const SubtitleOnly = () => { fontWeight="normal" fontSize={fontSize} whiteSpace="break-spaces" - textAlign={{ base: 'left', xl: 'center' }}> + textAlign={{ base: 'left', xl: 'center' }} + > {web.text.subtitle} </Heading> ); diff --git a/hyperglass/ui/components/header/title.tsx b/hyperglass/ui/components/header/title.tsx index 4ed5055..917fae8 100644 --- a/hyperglass/ui/components/header/title.tsx +++ b/hyperglass/ui/components/header/title.tsx @@ -15,7 +15,7 @@ const AnimatedVStack = motion.custom(VStack); /** * Title wrapper for mobile devices, breakpoints sm & md. */ -const MWrapper = (props: TMWrapper) => { +const MWrapper: React.FC<TMWrapper> = (props: TMWrapper) => { const { isSubmitting } = useLGState(); return ( <AnimatedVStack @@ -30,7 +30,7 @@ const MWrapper = (props: TMWrapper) => { /** * Title wrapper for desktop devices, breakpoints lg & xl. */ -const DWrapper = (props: TDWrapper) => { +const DWrapper: React.FC<TDWrapper> = (props: TDWrapper) => { const { isSubmitting } = useLGState(); return ( <AnimatedVStack @@ -49,7 +49,7 @@ const DWrapper = (props: TDWrapper) => { * Universal wrapper for title sub-components, which will be different depending on the * `title_mode` configuration variable. */ -const TitleWrapper = (props: TDWrapper | TMWrapper) => { +const TitleWrapper: React.FC<TDWrapper | TMWrapper> = (props: TDWrapper | TMWrapper) => { const isMobile = useMobile(); return ( <> @@ -61,7 +61,7 @@ const TitleWrapper = (props: TDWrapper | TMWrapper) => { /** * Title sub-component if `title_mode` is set to `text_only`. */ -const TextOnly = (props: TTitleWrapper) => { +const TextOnly: React.FC<TTitleWrapper> = (props: TTitleWrapper) => { return ( <TitleWrapper {...props}> <TitleOnly /> @@ -73,7 +73,7 @@ const TextOnly = (props: TTitleWrapper) => { /** * Title sub-component if `title_mode` is set to `logo_only`. Renders only the logo. */ -const LogoOnly = () => ( +const LogoOnly: React.FC = () => ( <TitleWrapper> <Logo /> </TitleWrapper> @@ -83,7 +83,7 @@ const LogoOnly = () => ( * Title sub-component if `title_mode` is set to `logo_subtitle`. Renders the logo with the * subtitle underneath. */ -const LogoSubtitle = () => ( +const LogoSubtitle: React.FC = () => ( <TitleWrapper> <Logo /> <SubtitleOnly /> @@ -93,7 +93,7 @@ const LogoSubtitle = () => ( /** * Title sub-component if `title_mode` is set to `all`. Renders the logo, title, and subtitle. */ -const All = () => ( +const All: React.FC = () => ( <TitleWrapper> <Logo /> <TextOnly mt={2} /> @@ -103,7 +103,7 @@ const All = () => ( /** * Title component which renders sub-components based on the `title_mode` configuration variable. */ -export const Title = (props: TTitle) => { +export const Title: React.FC<TTitle> = (props: TTitle) => { const { fontSize, ...rest } = props; const { web } = useConfig(); const titleMode = web.text.title_mode; @@ -133,7 +133,8 @@ export const Title = (props: TTitle) => { */ flexBasis={{ base: '100%', lg: isSafari ? '33%' : '100%' }} mt={[null, isSubmitting.value ? null : 'auto']} - {...rest}> + {...rest} + > <Button px={0} variant="link" @@ -141,7 +142,8 @@ export const Title = (props: TTitle) => { flexDir="column" onClick={handleClick} _focus={{ boxShadow: 'none' }} - _hover={{ textDecoration: 'none' }}> + _hover={{ textDecoration: 'none' }} + > <If c={titleMode === 'text_only'}> <TextOnly /> </If> diff --git a/hyperglass/ui/components/header/titleOnly.tsx b/hyperglass/ui/components/header/titleOnly.tsx index ace22f9..c263999 100644 --- a/hyperglass/ui/components/header/titleOnly.tsx +++ b/hyperglass/ui/components/header/titleOnly.tsx @@ -3,7 +3,7 @@ import { useConfig } from '~/context'; import { useBooleanValue, useLGState } from '~/hooks'; import { useTitleSize } from './useTitleSize'; -export const TitleOnly = () => { +export const TitleOnly: React.FC = () => { const { web } = useConfig(); const { isSubmitting } = useLGState(); diff --git a/hyperglass/ui/components/header/useTitleSize.ts b/hyperglass/ui/components/header/useTitleSize.ts index cde6a05..23d00a7 100644 --- a/hyperglass/ui/components/header/useTitleSize.ts +++ b/hyperglass/ui/components/header/useTitleSize.ts @@ -14,9 +14,9 @@ import { useMobile } from '~/context'; // 5xl: 7 type Sizes = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl'; -export function useTitleSize(title: string, defaultSize: Sizes, deps: any[] = []) { +export function useTitleSize(title: string, defaultSize: Sizes, deps: unknown[] = []): string { const [size, setSize] = useState<Sizes>(defaultSize); - const realSize = useToken('fontSizes', size); + const realSize = useToken('fontSizes', size) as string; const isMobile = useMobile(); function getSize(l: number): void { switch (true) { diff --git a/hyperglass/ui/components/help/modal.tsx b/hyperglass/ui/components/help/modal.tsx index fe7b10c..faff30a 100644 --- a/hyperglass/ui/components/help/modal.tsx +++ b/hyperglass/ui/components/help/modal.tsx @@ -18,7 +18,7 @@ import type { THelpModal } from './types'; const Info = dynamic<MeronexIcon>(() => import('@meronex/icons/fi').then(i => i.FiInfo)); -export const HelpModal = (props: THelpModal) => { +export const HelpModal: React.FC<THelpModal> = (props: THelpModal) => { const { visible, item, name, ...rest } = props; const { isOpen, onOpen, onClose } = useDisclosure(); const bg = useColorValue('whiteSolid.50', 'blackSolid.800'); diff --git a/hyperglass/ui/components/label/label.tsx b/hyperglass/ui/components/label/label.tsx index a562b6a..5d8a0a7 100644 --- a/hyperglass/ui/components/label/label.tsx +++ b/hyperglass/ui/components/label/label.tsx @@ -5,7 +5,7 @@ import { useOpposingColor } from '~/hooks'; import type { TLabel } from './types'; -export const Label = forwardRef<HTMLDivElement, TLabel>((props, ref) => { +const _Label: React.ForwardRefRenderFunction<HTMLDivElement, TLabel> = (props: TLabel, ref) => { const { value, label, labelColor, bg = 'primary.600', valueColor, ...rest } = props; const valueColorAuto = useOpposingColor(bg); @@ -19,7 +19,8 @@ export const Label = forwardRef<HTMLDivElement, TLabel>((props, ref) => { alignItems="center" mx={{ base: 1, md: 2 }} justifyContent="flex-start" - {...rest}> + {...rest} + > <Flex mb={2} mr={0} @@ -35,7 +36,8 @@ export const Label = forwardRef<HTMLDivElement, TLabel>((props, ref) => { borderBottomLeftRadius={4} borderBottomRightRadius={0} fontSize={{ base: 'xs', md: 'sm' }} - color={valueColor ?? valueColorAuto}> + color={valueColor ?? valueColorAuto} + > {value} </Flex> <Flex @@ -53,9 +55,12 @@ export const Label = forwardRef<HTMLDivElement, TLabel>((props, ref) => { borderBottomRightRadius={4} fontSize={{ base: 'xs', md: 'sm' }} color={labelColor ?? defaultLabelColor} - boxShadow={`inset 0px 0px 0px 1px ${bg}`}> + boxShadow={`inset 0px 0px 0px 1px ${bg}`} + > {label} </Flex> </Flex> ); -}); +}; + +export const Label = forwardRef(_Label); diff --git a/hyperglass/ui/components/layout/frame.tsx b/hyperglass/ui/components/layout/frame.tsx index d876ca0..69606bc 100644 --- a/hyperglass/ui/components/layout/frame.tsx +++ b/hyperglass/ui/components/layout/frame.tsx @@ -8,7 +8,7 @@ import { ResetButton } from './resetButton'; import type { TFrame } from './types'; -export const Frame = (props: TFrame) => { +export const Frame: React.FC<TFrame> = (props: TFrame) => { const { developer_mode } = useConfig(); const { isSubmitting } = useLGState(); const { resetForm } = useLGMethods(); @@ -39,7 +39,8 @@ export const Frame = (props: TFrame) => { * viewport. Safari needs `-webkit-fill-available`, but other browsers need `100vh`. * @see https://allthingssmitty.com/2020/05/11/css-fix-for-100vh-in-mobile-webkit/ */ - minHeight={isSafari ? '-webkit-fill-available' : '100vh'}> + minHeight={isSafari ? '-webkit-fill-available' : '100vh'} + > <Header resetForm={handleReset} /> <Flex px={2} diff --git a/hyperglass/ui/components/layout/resetButton.tsx b/hyperglass/ui/components/layout/resetButton.tsx index 0ef7a49..145ea61 100644 --- a/hyperglass/ui/components/layout/resetButton.tsx +++ b/hyperglass/ui/components/layout/resetButton.tsx @@ -9,7 +9,7 @@ import type { TResetButton } from './types'; const LeftArrow = dynamic<MeronexIcon>(() => import('@meronex/icons/fa').then(i => i.FaAngleLeft)); -export const ResetButton = (props: TResetButton) => { +export const ResetButton: React.FC<TResetButton> = (props: TResetButton) => { const { developerMode, resetForm, ...rest } = props; const { isSubmitting } = useLGState(); const bg = useColorValue('primary.500', 'primary.300'); @@ -30,7 +30,8 @@ export const ResetButton = (props: TResetButton) => { borderRightRadius="md" initial={{ x: '-100%' }} mb={developerMode ? { base: 0, lg: 14 } : undefined} - transition={{ duration: 0.15, ease: [0.4, 0, 0.2, 1] }}> + transition={{ duration: 0.15, ease: [0.4, 0, 0.2, 1] }} + > <Flex boxSize="100%" justifyContent="center" alignItems="center" {...rest}> <IconButton variant="unstyled" diff --git a/hyperglass/ui/components/loading.tsx b/hyperglass/ui/components/loading.tsx index a4ec0e5..44b3202 100644 --- a/hyperglass/ui/components/loading.tsx +++ b/hyperglass/ui/components/loading.tsx @@ -17,7 +17,8 @@ export const Loading: LoadableBaseOptions['loading'] = () => ( flexDirection="column" css={{ '@media (prefers-color-scheme: dark)': { backgroundColor: 'black', color: 'white' }, - }}> + }} + > <Spinner color="primary.500" w="6rem" h="6rem" /> </Flex> </Flex> diff --git a/hyperglass/ui/components/lookingGlass.tsx b/hyperglass/ui/components/lookingGlass.tsx index 8c92a39..a8d4e48 100644 --- a/hyperglass/ui/components/lookingGlass.tsx +++ b/hyperglass/ui/components/lookingGlass.tsx @@ -41,10 +41,10 @@ function useIsFqdn(target: string, _type: string) { ); } -export const LookingGlass = () => { +export const LookingGlass: React.FC = () => { const { web, content, messages } = useConfig(); - const { ack, greetingReady, isOpen: greetingIsOpen } = useGreeting(); + const { ack, greetingReady } = useGreeting(); const getDevice = useDevice(); const noQueryType = useStrf(messages.no_input, { field: web.text.query_type }); @@ -243,7 +243,8 @@ export const LookingGlass = () => { exit={{ opacity: 0, x: -300 }} initial={{ opacity: 0, y: 300 }} maxW={{ base: '100%', lg: '75%' }} - onSubmit={handleSubmit(submitHandler)}> + onSubmit={handleSubmit(submitHandler)} + > <FormRow> <FormField name="query_location" label={web.text.query_location}> <QueryLocation onChange={handleChange} label={web.text.query_location} /> @@ -253,7 +254,8 @@ export const LookingGlass = () => { label={web.text.query_type} labelAddOn={ <HelpModal visible={isQueryContent(vrfContent)} item={vrfContent} name="query_type" /> - }> + } + > <QueryType onChange={handleChange} label={web.text.query_type} /> </FormField> </FormRow> @@ -280,7 +282,8 @@ export const LookingGlass = () => { maxW="100%" flex="0 0 0" flexDir="column" - mr={{ base: 0, lg: 2 }}> + mr={{ base: 0, lg: 2 }} + > <SubmitButton handleChange={handleChange} /> </Flex> </FormRow> diff --git a/hyperglass/ui/components/markdown/elements.tsx b/hyperglass/ui/components/markdown/elements.tsx index 2afaa90..800da1f 100644 --- a/hyperglass/ui/components/markdown/elements.tsx +++ b/hyperglass/ui/components/markdown/elements.tsx @@ -44,12 +44,12 @@ function clean<P extends ChakraProps>(props: P): P { return props; } -export const Checkbox = (props: TCheckbox & MDProps) => { +export const Checkbox: React.FC<TCheckbox & MDProps> = (props: TCheckbox & MDProps) => { const { checked, node, ...rest } = props; return <ChakraCheckbox isChecked={checked} {...rest} />; }; -export const List = (props: TList) => { +export const List: React.FC<TList> = (props: TList) => { const { ordered, ...rest } = props; return ( <> @@ -63,7 +63,7 @@ export const List = (props: TList) => { ); }; -export const ListItem = (props: TListItem & MDProps) => { +export const ListItem: React.FC<TListItem & MDProps> = (props: TListItem & MDProps) => { const { checked, node, ...rest } = props; return checked ? ( <Checkbox checked={checked} node={node} {...rest} /> @@ -72,7 +72,7 @@ export const ListItem = (props: TListItem & MDProps) => { ); }; -export const Heading = (props: THeading) => { +export const Heading: React.FC<THeading> = (props: THeading) => { const { level, ...rest } = props; const levelMap = { @@ -87,14 +87,16 @@ export const Heading = (props: THeading) => { return <ChakraHeading {...levelMap[level]} {...clean<Omit<THeading, 'level'>>(rest)} />; }; -export const Link = (props: LinkProps) => { +export const Link: React.FC<LinkProps> = (props: LinkProps) => { const color = useColorValue('blue.500', 'blue.300'); return <ChakraLink isExternal color={color} {...clean<LinkProps>(props)} />; }; -export const CodeBlock = (props: TCodeBlock) => <CustomCodeBlock>{props.value}</CustomCodeBlock>; +export const CodeBlock: React.FC<TCodeBlock> = (props: TCodeBlock) => ( + <CustomCodeBlock>{props.value}</CustomCodeBlock> +); -export const TableData = (props: TTableData) => { +export const TableData: React.FC<TTableData> = (props: TTableData) => { const { isHeader, ...rest } = props; return ( <> @@ -108,7 +110,7 @@ export const TableData = (props: TTableData) => { ); }; -export const Paragraph = (props: TextProps) => ( +export const Paragraph: React.FC<TextProps> = (props: TextProps) => ( <ChakraText my={4} css={{ @@ -118,11 +120,19 @@ export const Paragraph = (props: TextProps) => ( {...clean<TextProps>(props)} /> ); -export const InlineCode = (props: CodeProps) => ( + +export const InlineCode: React.FC<CodeProps> = (props: CodeProps) => ( <ChakraCode borderRadius="md" px={1} {...clean<CodeProps>(props)} /> ); -export const Divider = (props: DividerProps) => ( + +export const Divider: React.FC<DividerProps> = (props: DividerProps) => ( <ChakraDivider my={2} {...clean<DividerProps>(props)} /> ); -export const Table = (props: BoxProps) => <ChakraTable {...clean<BoxProps>(props)} />; -export const Br = (props: BoxProps) => <Box as="br" m={16} {...clean<BoxProps>(props)} />; + +export const Table: React.FC<BoxProps> = (props: BoxProps) => ( + <ChakraTable {...clean<BoxProps>(props)} /> +); + +export const Br: React.FC<BoxProps> = (props: BoxProps) => ( + <Box as="br" m={16} {...clean<BoxProps>(props)} /> +); diff --git a/hyperglass/ui/components/markdown/markdown.tsx b/hyperglass/ui/components/markdown/markdown.tsx index 9468db0..ae1ae93 100644 --- a/hyperglass/ui/components/markdown/markdown.tsx +++ b/hyperglass/ui/components/markdown/markdown.tsx @@ -30,6 +30,6 @@ const renderers = { thematicBreak: Divider, } as ReactMarkdownProps['renderers']; -export const Markdown = (props: TMarkdown) => ( +export const Markdown: React.FC<TMarkdown> = (props: TMarkdown) => ( <ReactMarkdown renderers={renderers} source={props.content} /> ); diff --git a/hyperglass/ui/components/markdown/table.tsx b/hyperglass/ui/components/markdown/table.tsx index d20d18c..802e0c6 100644 --- a/hyperglass/ui/components/markdown/table.tsx +++ b/hyperglass/ui/components/markdown/table.tsx @@ -3,16 +3,16 @@ import { useColorValue } from '~/context'; import type { BoxProps } from '@chakra-ui/react'; -export const Table = (props: BoxProps) => ( +export const Table: React.FC<BoxProps> = (props: BoxProps) => ( <Box as="table" textAlign="left" mt={4} width="full" {...props} /> ); -export const TH = (props: BoxProps) => { +export const TH: React.FC<BoxProps> = (props: BoxProps) => { const bg = useColorValue('blackAlpha.50', 'whiteAlpha.50'); return <Box as="th" bg={bg} fontWeight="semibold" p={2} fontSize="sm" {...props} />; }; -export const TD = (props: BoxProps) => { +export const TD: React.FC<BoxProps> = (props: BoxProps) => { return ( <Box p={2} diff --git a/hyperglass/ui/components/markdown/types.ts b/hyperglass/ui/components/markdown/types.ts index f0b5b71..b5e15aa 100644 --- a/hyperglass/ui/components/markdown/types.ts +++ b/hyperglass/ui/components/markdown/types.ts @@ -1,10 +1,4 @@ -import type { - BoxProps, - CheckboxProps, - HeadingProps, - ListProps, - ListItemProps, -} from '@chakra-ui/react'; +import type { BoxProps, CheckboxProps, HeadingProps, ListProps } from '@chakra-ui/react'; export interface TMarkdown { content: string; diff --git a/hyperglass/ui/components/meta.tsx b/hyperglass/ui/components/meta.tsx index e5b574c..70ab813 100644 --- a/hyperglass/ui/components/meta.tsx +++ b/hyperglass/ui/components/meta.tsx @@ -4,7 +4,7 @@ import { useTheme } from '@chakra-ui/react'; import { useConfig } from '~/context'; import { googleFontUrl } from '~/util'; -export const Meta = () => { +export const Meta: React.FC = () => { const config = useConfig(); const { fonts } = useTheme(); const [location, setLocation] = useState('/'); diff --git a/hyperglass/ui/components/output/cell.tsx b/hyperglass/ui/components/output/cell.tsx index db14c96..0bcb6d9 100644 --- a/hyperglass/ui/components/output/cell.tsx +++ b/hyperglass/ui/components/output/cell.tsx @@ -2,7 +2,7 @@ import { MonoField, Active, Weight, Age, Communities, RPKIState, ASPath } from ' import type { TCell } from './types'; -export const Cell = (props: TCell) => { +export const Cell: React.FC<TCell> = (props: TCell) => { const { data, rawData } = props; const cellId = data.column.id as keyof TRoute; const component = { diff --git a/hyperglass/ui/components/output/fields.tsx b/hyperglass/ui/components/output/fields.tsx index 6ef56e9..a78908e 100644 --- a/hyperglass/ui/components/output/fields.tsx +++ b/hyperglass/ui/components/output/fields.tsx @@ -26,7 +26,7 @@ import type { dayjs.extend(relativeTimePlugin); dayjs.extend(utcPlugin); -export const MonoField = (props: TMonoField) => { +export const MonoField: React.FC<TMonoField> = (props: TMonoField) => { const { v, ...rest } = props; return ( <Text as="span" fontSize="sm" fontFamily="mono" {...rest}> @@ -35,7 +35,7 @@ export const MonoField = (props: TMonoField) => { ); }; -export const Active = (props: TActive) => { +export const Active: React.FC<TActive> = (props: TActive) => { const { isActive } = props; const color = useColorValue(['gray.500', 'green.500'], ['whiteAlpha.300', 'blackAlpha.500']); return ( @@ -50,7 +50,7 @@ export const Active = (props: TActive) => { ); }; -export const Age = (props: TAge) => { +export const Age: React.FC<TAge> = (props: TAge) => { const { inSeconds, ...rest } = props; const now = dayjs.utc(); const then = now.subtract(inSeconds, 'second'); @@ -63,7 +63,7 @@ export const Age = (props: TAge) => { ); }; -export const Weight = (props: TWeight) => { +export const Weight: React.FC<TWeight> = (props: TWeight) => { const { weight, winningWeight, ...rest } = props; const fixMeText = winningWeight === 'low' ? 'Lower Weight is Preferred' : 'Higher Weight is Preferred'; @@ -76,7 +76,7 @@ export const Weight = (props: TWeight) => { ); }; -export const ASPath = (props: TASPath) => { +export const ASPath: React.FC<TASPath> = (props: TASPath) => { const { path, active } = props; const color = useColorValue( // light: inactive, active @@ -89,7 +89,7 @@ export const ASPath = (props: TASPath) => { return <Icon as={End} />; } - let paths = [] as JSX.Element[]; + const paths = [] as JSX.Element[]; path.map((asn, i) => { const asnStr = String(asn); @@ -107,7 +107,7 @@ export const ASPath = (props: TASPath) => { return <>{paths}</>; }; -export const Communities = (props: TCommunities) => { +export const Communities: React.FC<TCommunities> = (props: TCommunities) => { const { communities } = props; const bg = useColorValue('white', 'gray.900'); const color = useOpposingColor(bg); @@ -133,7 +133,8 @@ export const Communities = (props: TCommunities) => { textAlign="left" fontFamily="mono" fontWeight="normal" - whiteSpace="pre-wrap"> + whiteSpace="pre-wrap" + > {communities.join('\n')} </MenuList> </Menu> @@ -142,7 +143,10 @@ export const Communities = (props: TCommunities) => { ); }; -export const RPKIState = forwardRef<HTMLDivElement, TRPKIState>((props, ref) => { +const _RPKIState: React.ForwardRefRenderFunction<HTMLDivElement, TRPKIState> = ( + props: TRPKIState, + ref, +) => { const { state, active } = props; const { web } = useConfig(); const bg = useColorValue( @@ -171,10 +175,13 @@ export const RPKIState = forwardRef<HTMLDivElement, TRPKIState>((props, ref) => placement="right" label={text[state] ?? text[3]} bg={bg[+active][state]} - color={color}> + color={color} + > <Box ref={ref} boxSize={5}> <Box as={icon[state]} color={bg[+active][state]} /> </Box> </Tooltip> ); -}); +}; + +export const RPKIState = forwardRef<HTMLDivElement, TRPKIState>(_RPKIState); diff --git a/hyperglass/ui/components/output/table.tsx b/hyperglass/ui/components/output/table.tsx index 907b41b..a56a6fd 100644 --- a/hyperglass/ui/components/output/table.tsx +++ b/hyperglass/ui/components/output/table.tsx @@ -10,7 +10,7 @@ function makeColumns(fields: TParsedDataField[]): TColumn[] { return fields.map(pair => { const [header, accessor, align] = pair; - let columnConfig = { + const columnConfig = { align, accessor, hidden: false, @@ -25,7 +25,7 @@ function makeColumns(fields: TParsedDataField[]): TColumn[] { }); } -export const BGPTable = (props: TBGPTable) => { +export const BGPTable: React.FC<TBGPTable> = (props: TBGPTable) => { const { children: data, ...rest } = props; const { parsed_data_fields } = useConfig(); const columns = makeColumns(parsed_data_fields); @@ -34,11 +34,11 @@ export const BGPTable = (props: TBGPTable) => { <Flex my={8} justify="center" maxW="100%" w="100%" {...rest}> <Table columns={columns} + bordersHorizontal data={data.routes} + rowHighlightBg="green" rowHighlightProp="active" Cell={(d: TCellRender) => <Cell data={d} rawData={data} />} - bordersHorizontal - rowHighlightBg="green" /> </Flex> ); diff --git a/hyperglass/ui/components/output/text.tsx b/hyperglass/ui/components/output/text.tsx index 93a1cc4..8fa794c 100644 --- a/hyperglass/ui/components/output/text.tsx +++ b/hyperglass/ui/components/output/text.tsx @@ -3,7 +3,7 @@ import { useColorValue } from '~/context'; import type { TTextOutput } from './types'; -export const TextOutput = (props: TTextOutput) => { +export const TextOutput: React.FC<TTextOutput> = (props: TTextOutput) => { const { children, ...rest } = props; const bg = useColorValue('blackAlpha.100', 'gray.800'); @@ -31,7 +31,8 @@ export const TextOutput = (props: TTextOutput) => { color: selectionColor, }, }} - {...rest}> + {...rest} + > {children.split('\\n').join('\n').replace(/\n\n/g, '\n')} </Box> ); diff --git a/hyperglass/ui/components/path/button.tsx b/hyperglass/ui/components/path/button.tsx index 68bf21b..94723b4 100644 --- a/hyperglass/ui/components/path/button.tsx +++ b/hyperglass/ui/components/path/button.tsx @@ -7,7 +7,7 @@ const PathIcon = dynamic<MeronexIcon>(() => import('@meronex/icons/bi').then(i => i.BisNetworkChart), ); -export const PathButton = (props: TPathButton) => { +export const PathButton: React.FC<TPathButton> = (props: TPathButton) => { const { onOpen } = props; return ( <Tooltip hasArrow label="View AS Path" placement="top"> diff --git a/hyperglass/ui/components/path/chart.tsx b/hyperglass/ui/components/path/chart.tsx index 23020ab..a0b150b 100644 --- a/hyperglass/ui/components/path/chart.tsx +++ b/hyperglass/ui/components/path/chart.tsx @@ -11,7 +11,7 @@ import { buildElements } from './util'; import type { ReactFlowProps } from 'react-flow-renderer'; import type { TChart, TNode, TNodeData } from './types'; -export const Chart = (props: TChart) => { +export const Chart: React.FC<TChart> = (props: TChart) => { const { data } = props; const { primary_asn, org_name } = useConfig(); @@ -38,7 +38,7 @@ export const Chart = (props: TChart) => { ); }; -const ASNode = (props: TNode<TNodeData>) => { +const ASNode: React.FC<TNode<TNodeData>> = (props: TNode<TNodeData>) => { const { data } = props; const { asn, name, hasChildren, hasParents } = data; diff --git a/hyperglass/ui/components/path/controls.tsx b/hyperglass/ui/components/path/controls.tsx index 5d9dd43..4d6e13d 100644 --- a/hyperglass/ui/components/path/controls.tsx +++ b/hyperglass/ui/components/path/controls.tsx @@ -6,7 +6,7 @@ const Plus = dynamic<MeronexIcon>(() => import('@meronex/icons/fi').then(i => i. const Minus = dynamic<MeronexIcon>(() => import('@meronex/icons/fi').then(i => i.FiMinus)); const Square = dynamic<MeronexIcon>(() => import('@meronex/icons/fi').then(i => i.FiSquare)); -export const Controls = () => { +export const Controls: React.FC = () => { const { fitView, zoomIn, zoomOut } = useZoomPanHelper(); return ( <ButtonGroup @@ -18,7 +18,8 @@ export const Controls = () => { isAttached pos="absolute" variant="solid" - colorScheme="secondary"> + colorScheme="secondary" + > <IconButton icon={<Plus />} onClick={() => zoomIn()} aria-label="Zoom In" /> <IconButton icon={<Minus />} onClick={() => zoomOut()} aria-label="Zoom Out" /> <IconButton icon={<Square />} onClick={() => fitView()} aria-label="Fit Nodes" /> diff --git a/hyperglass/ui/components/path/path.tsx b/hyperglass/ui/components/path/path.tsx index be830b5..e4a6ea7 100644 --- a/hyperglass/ui/components/path/path.tsx +++ b/hyperglass/ui/components/path/path.tsx @@ -15,7 +15,7 @@ import { Chart } from './chart'; import type { TPath } from './types'; -export const Path = (props: TPath) => { +export const Path: React.FC<TPath> = (props: TPath) => { const { device } = props; const { displayTarget } = useLGState(); const { getResponse } = useLGMethods(); @@ -33,7 +33,8 @@ export const Path = (props: TPath) => { bg={bg} mt={{ base: 4, lg: '' }} maxH={{ base: '80%', lg: '60%' }} - maxW={{ base: '100%', lg: '80%' }}> + maxW={{ base: '100%', lg: '80%' }} + > <ModalHeader>{`Path to ${displayTarget.value}`}</ModalHeader> <ModalCloseButton /> <ModalBody> diff --git a/hyperglass/ui/components/path/types.ts b/hyperglass/ui/components/path/types.ts index 067b065..dd0f4ba 100644 --- a/hyperglass/ui/components/path/types.ts +++ b/hyperglass/ui/components/path/types.ts @@ -8,7 +8,7 @@ export interface TPath { device: string; } -export interface TNode<D extends any> extends Omit<NodeProps, 'data'> { +export interface TNode<D extends unknown> extends Omit<NodeProps, 'data'> { data: D; } diff --git a/hyperglass/ui/components/path/util.ts b/hyperglass/ui/components/path/util.ts index 0f17b4b..67339a2 100644 --- a/hyperglass/ui/components/path/util.ts +++ b/hyperglass/ui/components/path/util.ts @@ -7,7 +7,7 @@ import type { BasePath } from './types'; function treeToElement(part: PathPart, len: number, index: number): FlowElement[] { const x = index * 250; const y = -(len * 10); - let elements = [ + const elements = [ { id: String(part.base), type: 'ASNode', @@ -55,7 +55,7 @@ export function* buildElements(base: BasePath, data: TStructuredResponse): Gener data: { asn: base.asn, name: base.name, hasChildren: true, hasParents: false }, }; - for (const [i, path] of childPaths.entries()) { + for (const path of childPaths) { // path = Each unique path from origin const first = path[0]; yield { id: `e${base.asn}-${first.id}`, source: base.asn, target: first.id }; diff --git a/hyperglass/ui/components/results/copyButton.tsx b/hyperglass/ui/components/results/copyButton.tsx index 4f84ee0..bc031c3 100644 --- a/hyperglass/ui/components/results/copyButton.tsx +++ b/hyperglass/ui/components/results/copyButton.tsx @@ -6,7 +6,7 @@ const Check = dynamic<MeronexIcon>(() => import('@meronex/icons/fi').then(i => i import type { TCopyButton } from './types'; -export const CopyButton = (props: TCopyButton) => { +export const CopyButton: React.FC<TCopyButton> = (props: TCopyButton) => { const { copyValue, ...rest } = props; const { onCopy, hasCopied } = useClipboard(copyValue); return ( @@ -18,7 +18,8 @@ export const CopyButton = (props: TCopyButton) => { variant="ghost" onClick={onCopy} colorScheme="secondary" - {...rest}> + {...rest} + > <Icon as={hasCopied ? Check : Copy} boxSize="16px" /> </Button> </Tooltip> diff --git a/hyperglass/ui/components/results/error.tsx b/hyperglass/ui/components/results/error.tsx index 88c6db7..41c4574 100644 --- a/hyperglass/ui/components/results/error.tsx +++ b/hyperglass/ui/components/results/error.tsx @@ -22,7 +22,7 @@ function formatError(text: string, values: string[], regex: RegExp): TFormatErro }, [] as TFormatError[]); } -export const FormattedError = (props: TFormattedError) => { +export const FormattedError: React.FC<TFormattedError> = (props: TFormattedError) => { const { keywords, message } = props; const pattern = new RegExp(keywords.map(kw => `(${kw})`).join('|'), 'gi'); const things = formatError(message, keywords, pattern); diff --git a/hyperglass/ui/components/results/group.tsx b/hyperglass/ui/components/results/group.tsx index db4d3d1..e7cb5a9 100644 --- a/hyperglass/ui/components/results/group.tsx +++ b/hyperglass/ui/components/results/group.tsx @@ -7,7 +7,7 @@ import { useDevice, useLGState } from '~/hooks'; import { isQueryType } from '~/types'; import { Result } from './individual'; -export const Results = () => { +export const Results: React.FC = () => { const { queries, vrfs, web } = useConfig(); const { queryLocation, queryTarget, queryType, queryVrf } = useLGState(); @@ -83,7 +83,8 @@ export const Results = () => { w="100%" mx="auto" textAlign="left" - maxW={{ base: '100%', lg: '75%', xl: '50%' }}> + maxW={{ base: '100%', lg: '75%', xl: '50%' }} + > <Stack isInline align="center" justify="center" mt={4} flexWrap="wrap"> <AnimatePresence> {queryLocation.value && ( @@ -92,7 +93,8 @@ export const Results = () => { initial={initialLeft} animate={animateLeft} exit={{ opacity: 0, x: -100 }} - transition={{ duration: 0.3, delay: 0.3 }}> + transition={{ duration: 0.3, delay: 0.3 }} + > <Label bg={queryBg} label={web.text.query_type} @@ -104,7 +106,8 @@ export const Results = () => { initial={initialCenter} animate={animateCenter} exit={{ opacity: 0, scale: 0.5 }} - transition={{ duration: 0.3, delay: 0.3 }}> + transition={{ duration: 0.3, delay: 0.3 }} + > <Label bg={targetBg} value={queryTarget.value} @@ -116,7 +119,8 @@ export const Results = () => { initial={initialRight} animate={animateRight} exit={{ opacity: 0, x: 100 }} - transition={{ duration: 0.3, delay: 0.3 }}> + transition={{ duration: 0.3, delay: 0.3 }} + > <Label bg={vrfBg} label={web.text.query_vrf} @@ -142,7 +146,8 @@ export const Results = () => { exit={{ opacity: 0, y: 300 }} transition={{ duration: 0.3 }} animate={{ opacity: 1, y: 0 }} - maxW={{ base: '100%', md: '75%' }}> + maxW={{ base: '100%', md: '75%' }} + > <Accordion allowMultiple allowToggle index={resultsComplete}> <AnimatePresence> {queryLocation.value && diff --git a/hyperglass/ui/components/results/guards.ts b/hyperglass/ui/components/results/guards.ts index a01a1b8..3adf06f 100644 --- a/hyperglass/ui/components/results/guards.ts +++ b/hyperglass/ui/components/results/guards.ts @@ -1,9 +1,12 @@ +/* eslint @typescript-eslint/no-explicit-any: 0 */ +/* eslint @typescript-eslint/explicit-module-boundary-types: 0 */ + export function isStackError(error: any): error is Error { - return error !== null && 'message' in error; + return typeof error !== 'undefined' && error !== null && 'message' in error; } export function isFetchError(error: any): error is Response { - return error !== null && 'statusText' in error; + return typeof error !== 'undefined' && error !== null && 'statusText' in error; } export function isLGError(error: any): error is TQueryResponse { diff --git a/hyperglass/ui/components/results/header.tsx b/hyperglass/ui/components/results/header.tsx index b025eb9..070dbf2 100644 --- a/hyperglass/ui/components/results/header.tsx +++ b/hyperglass/ui/components/results/header.tsx @@ -15,7 +15,7 @@ const runtimeText = (runtime: number, text: string): string => { return `${text} ${unit}`; }; -export const ResultHeader = (props: TResultHeader) => { +export const ResultHeader: React.FC<TResultHeader> = (props: TResultHeader) => { const { title, loading, isError, errorMsg, errorLevel, runtime } = props; const status = useColorValue('primary.500', 'primary.300'); @@ -36,7 +36,8 @@ export const ResultHeader = (props: TResultHeader) => { isDisabled={loading} label={isError ? errorMsg : label} bg={isError ? warning : defaultStatus} - color={color}> + color={color} + > <Box boxSize={6}> {loading ? ( <Spinner size="sm" mr={4} color={status} /> diff --git a/hyperglass/ui/components/results/individual.tsx b/hyperglass/ui/components/results/individual.tsx index edee162..ad413b0 100644 --- a/hyperglass/ui/components/results/individual.tsx +++ b/hyperglass/ui/components/results/individual.tsx @@ -27,7 +27,9 @@ import type { TAccordionHeaderWrapper, TResult, TErrorLevels } from './types'; const AnimatedAccordionItem = motion.custom(AccordionItem); -const AccordionHeaderWrapper = (props: TAccordionHeaderWrapper) => { +const AccordionHeaderWrapper: React.FC<TAccordionHeaderWrapper> = ( + props: TAccordionHeaderWrapper, +) => { const { hoverBg, ...rest } = props; return ( <Flex @@ -39,7 +41,7 @@ const AccordionHeaderWrapper = (props: TAccordionHeaderWrapper) => { ); }; -export const Result = forwardRef<HTMLDivElement, TResult>((props, ref) => { +const _Result: React.ForwardRefRenderFunction<HTMLDivElement, TResult> = (props: TResult, ref) => { const { index, device, @@ -170,7 +172,8 @@ export const Result = forwardRef<HTMLDivElement, TResult>((props, ref) => { css={{ '&:last-of-type': { borderBottom: 'none' }, '&:first-of-type': { borderTop: 'none' }, - }}> + }} + > <AccordionHeaderWrapper hoverBg="blackAlpha.50"> <AccordionButton py={2} @@ -178,7 +181,8 @@ export const Result = forwardRef<HTMLDivElement, TResult>((props, ref) => { _hover={{}} _focus={{}} flex="1 0 auto" - onClick={handleToggle}> + onClick={handleToggle} + > <ResultHeader isError={isError} loading={isLoading} @@ -213,7 +217,8 @@ export const Result = forwardRef<HTMLDivElement, TResult>((props, ref) => { }, '-ms-overflow-style': { display: 'none' }, - }}> + }} + > <Box> <Flex direction="column" flex="1 0 auto" maxW={error ? '100%' : undefined}> {!isError && typeof data !== 'undefined' ? ( @@ -246,7 +251,8 @@ export const Result = forwardRef<HTMLDivElement, TResult>((props, ref) => { mt={2} spacing={1} flex="1 0 auto" - justifyContent={{ base: 'flex-start', lg: 'flex-end' }}> + justifyContent={{ base: 'flex-start', lg: 'flex-end' }} + > <If c={cache.show_text && !isError && isCached}> <If c={!isMobile}> <Countdown timeout={cache.timeout} text={web.text.cache_prefix} /> @@ -265,4 +271,6 @@ export const Result = forwardRef<HTMLDivElement, TResult>((props, ref) => { </AccordionPanel> </AnimatedAccordionItem> ); -}); +}; + +export const Result = forwardRef<HTMLDivElement, TResult>(_Result); diff --git a/hyperglass/ui/components/results/requeryButton.tsx b/hyperglass/ui/components/results/requeryButton.tsx index 3eb0c81..1a691a2 100644 --- a/hyperglass/ui/components/results/requeryButton.tsx +++ b/hyperglass/ui/components/results/requeryButton.tsx @@ -6,7 +6,10 @@ import type { TRequeryButton } from './types'; const Repeat = dynamic<MeronexIcon>(() => import('@meronex/icons/fi').then(i => i.FiRepeat)); -export const RequeryButton = forwardRef<HTMLButtonElement, TRequeryButton>((props, ref) => { +const _RequeryButton: React.ForwardRefRenderFunction<HTMLButtonElement, TRequeryButton> = ( + props: TRequeryButton, + ref, +) => { const { requery, ...rest } = props; return ( @@ -20,9 +23,12 @@ export const RequeryButton = forwardRef<HTMLButtonElement, TRequeryButton>((prop variant="ghost" onClick={requery as TRequeryButton['onClick']} colorScheme="secondary" - {...rest}> + {...rest} + > <Icon as={Repeat} boxSize="16px" /> </Button> </Tooltip> ); -}); +}; + +export const RequeryButton = forwardRef<HTMLButtonElement, TRequeryButton>(_RequeryButton); diff --git a/hyperglass/ui/components/select/select.tsx b/hyperglass/ui/components/select/select.tsx index 9e38f0d..1f73afc 100644 --- a/hyperglass/ui/components/select/select.tsx +++ b/hyperglass/ui/components/select/select.tsx @@ -21,11 +21,11 @@ import type { TSelectOption } from '~/types'; import type { TSelectBase, TSelectContext, TReactSelectChakra } from './types'; const SelectContext = createContext<TSelectContext>(Object()); -export const useSelectContext = () => useContext(SelectContext); +export const useSelectContext = (): TSelectContext => useContext(SelectContext); const ReactSelectChakra = chakra<typeof ReactSelect, TReactSelectChakra>(ReactSelect); -export const Select = (props: TSelectBase) => { +export const Select: React.FC<TSelectBase> = (props: TSelectBase) => { const { options, multi, onSelect, isError = false, ...rest } = props; const { isOpen, onOpen, onClose } = useDisclosure(); @@ -49,8 +49,8 @@ export const Select = (props: TSelectBase) => { const multiValue = useMultiValueStyle({ colorMode }); const multiValueLabel = useMultiValueLabelStyle({ colorMode }); const multiValueRemove = useMultiValueRemoveStyle({ colorMode }); - const menuPortal = useMenuPortal({ colorMode }); - const rsTheme = useRSTheme({ colorMode }); + const menuPortal = useMenuPortal(); + const rsTheme = useRSTheme(); return ( <SelectContext.Provider value={selectContext}> diff --git a/hyperglass/ui/components/select/styles.tsx b/hyperglass/ui/components/select/styles.tsx index 062c2f3..5c1a1ca 100644 --- a/hyperglass/ui/components/select/styles.tsx +++ b/hyperglass/ui/components/select/styles.tsx @@ -6,16 +6,14 @@ import { useColorValue, useColorToken, useMobile } from '~/context'; import { useSelectContext } from './select'; import type { - TControl, - TIndicator, TMenu, - TMenuList, - TMultiValueState, TOption, - TPlaceholder, TStyles, + TControl, TRSTheme, TMultiValue, + TRSThemeCallback, + TRSStyleCallback, } from './types'; export const useControlStyle = (base: TStyles, state: TControl): TStyles => { @@ -59,7 +57,7 @@ export const useMenuStyle = (base: TStyles, _: TMenu): TStyles => { return useMemo(() => mergeWith({}, base, styles), [colorMode, isOpen]); }; -export const useMenuListStyle = (base: TStyles, state: TMenuList): TStyles => { +export const useMenuListStyle = (base: TStyles): TStyles => { const { colorMode, isOpen } = useSelectContext(); const scrollbarTrack = useColorToken('colors', 'blackAlpha.50', 'whiteAlpha.50'); @@ -123,59 +121,51 @@ export const useOptionStyle = (base: TStyles, state: TOption): TStyles => { ]); }; -export const useIndicatorSeparatorStyle = (base: TStyles, state: TIndicator): TStyles => { +export const useIndicatorSeparatorStyle = (base: TStyles): TStyles => { const { colorMode } = useSelectContext(); const backgroundColor = useColorToken('colors', 'whiteAlpha.700', 'gray.600'); const styles = { backgroundColor }; return useMemo(() => mergeWith({}, base, styles), [colorMode]); }; -export const usePlaceholderStyle = (base: TStyles, state: TPlaceholder): TStyles => { +export const usePlaceholderStyle = (base: TStyles): TStyles => { const { colorMode } = useSelectContext(); const color = useColorToken('colors', 'gray.600', 'whiteAlpha.700'); const fontSize = useToken('fontSizes', 'lg'); return useMemo(() => mergeWith({}, base, { color, fontSize }), [colorMode]); }; -export const useSingleValueStyle = (props: TStyles) => { +export const useSingleValueStyle = (): TRSStyleCallback => { const { colorMode } = useSelectContext(); const color = useColorValue('black', 'whiteAlpha.800'); const fontSize = useToken('fontSizes', 'lg'); const styles = { color, fontSize }; - return useCallback((base: TStyles, state: TMultiValueState) => mergeWith({}, base, styles), [ - color, - colorMode, - ]); + return useCallback((base: TStyles) => mergeWith({}, base, styles), [color, colorMode]); }; -export const useMultiValueStyle = (props: TMultiValue) => { +export const useMultiValueStyle = (props: TMultiValue): TRSStyleCallback => { const { colorMode } = props; const backgroundColor = useColorToken('colors', 'primary.500', 'primary.300'); const color = useOpposingColor(backgroundColor); const styles = { backgroundColor, color }; - return useCallback((base: TStyles, state: TMultiValueState) => mergeWith({}, base, styles), [ - backgroundColor, - colorMode, - ]); + return useCallback((base: TStyles) => mergeWith({}, base, styles), [backgroundColor, colorMode]); }; -export const useMultiValueLabelStyle = (props: TMultiValue) => { +export const useMultiValueLabelStyle = (props: TMultiValue): TRSStyleCallback => { const { colorMode } = props; const backgroundColor = useColorToken('colors', 'primary.500', 'primary.300'); const color = useOpposingColor(backgroundColor); const styles = { color }; - return useCallback((base: TStyles, state: TMultiValueState) => mergeWith({}, base, styles), [ - colorMode, - ]); + return useCallback((base: TStyles) => mergeWith({}, base, styles), [colorMode]); }; -export const useMultiValueRemoveStyle = (props: TMultiValue) => { +export const useMultiValueRemoveStyle = (props: TMultiValue): TRSStyleCallback => { const { colorMode } = props; const backgroundColor = useColorToken('colors', 'primary.500', 'primary.300'); @@ -185,22 +175,18 @@ export const useMultiValueRemoveStyle = (props: TMultiValue) => { color, '&:hover': { backgroundColor: 'inherit', color, opacity: 0.7 }, }; - return useCallback((base: TStyles, state: TMultiValueState) => mergeWith({}, base, styles), [ - colorMode, - ]); + return useCallback((base: TStyles) => mergeWith({}, base, styles), [colorMode]); }; -export const useRSTheme = (props: TMultiValue) => { +export const useRSTheme = (): TRSThemeCallback => { const borderRadius = useToken('radii', 'md'); return useCallback((t: TRSTheme): TRSTheme => ({ ...t, borderRadius }), []); }; -export const useMenuPortal = (props: TMultiValue) => { +export const useMenuPortal = (): TRSStyleCallback => { const isMobile = useMobile(); const styles = { zIndex: isMobile ? 1500 : 1, }; - return useCallback((base: TStyles, state: TMultiValueState) => mergeWith({}, base, styles), [ - isMobile, - ]); + return useCallback((base: TStyles) => mergeWith({}, base, styles), [isMobile]); }; diff --git a/hyperglass/ui/components/select/types.ts b/hyperglass/ui/components/select/types.ts index 46d1393..8bcef4a 100644 --- a/hyperglass/ui/components/select/types.ts +++ b/hyperglass/ui/components/select/types.ts @@ -1,3 +1,6 @@ +/* eslint @typescript-eslint/no-explicit-any: 0 */ +/* eslint @typescript-eslint/explicit-module-boundary-types: 0 */ + import type { Props as IReactSelect, ControlProps, @@ -8,6 +11,7 @@ import type { IndicatorProps, Theme as RSTheme, PlaceholderProps, + Styles as RSStyles, } from 'react-select'; import type { BoxProps } from '@chakra-ui/react'; import type { Theme, TSelectOption, TSelectOptionMulti, TSelectOptionGroup } from '~/types'; @@ -70,4 +74,8 @@ export type TPlaceholder = PlaceholderProps<TOptions, false>; export type TMultiValue = Pick<TSelectContext, 'colorMode'>; +export type TRSStyleCallback = (base: RSStyles) => RSStyles; + +export type TRSThemeCallback = (theme: TRSTheme) => TRSTheme; + export type { Styles as TStyles } from 'react-select'; diff --git a/hyperglass/ui/components/submit/submit.tsx b/hyperglass/ui/components/submit/submit.tsx index 5f02bb0..4e718e8 100644 --- a/hyperglass/ui/components/submit/submit.tsx +++ b/hyperglass/ui/components/submit/submit.tsx @@ -22,30 +22,32 @@ import { useLGState, useLGMethods } from '~/hooks'; import type { IconButtonProps } from '@chakra-ui/react'; import type { TSubmitButton, TRSubmitButton } from './types'; -const SubmitIcon = forwardRef<HTMLButtonElement, Omit<IconButtonProps, 'aria-label'>>( - (props, ref) => { - const { isLoading, ...rest } = props; - return ( - <IconButton - ref={ref} - size="lg" - width={16} - type="submit" - icon={<FiSearch />} - title="Submit Query" - colorScheme="primary" - isLoading={isLoading} - aria-label="Submit Query" - {...rest} - /> - ); - }, -); +const _SubmitIcon: React.ForwardRefRenderFunction< + HTMLButtonElement, + Omit<IconButtonProps, 'aria-label'> +> = (props: Omit<IconButtonProps, 'aria-label'>, ref) => { + const { isLoading, ...rest } = props; + return ( + <IconButton + ref={ref} + size="lg" + width={16} + type="submit" + icon={<FiSearch />} + title="Submit Query" + colorScheme="primary" + isLoading={isLoading} + aria-label="Submit Query" + {...rest} + /> + ); +}; +const SubmitIcon = forwardRef<HTMLButtonElement, Omit<IconButtonProps, 'aria-label'>>(_SubmitIcon); /** * Mobile Submit Button */ -const MSubmitButton = (props: TRSubmitButton) => { +const MSubmitButton: React.FC<TRSubmitButton> = (props: TRSubmitButton) => { const { children, isOpen, onClose, onChange } = props; const bg = useColorValue('white', 'gray.900'); return ( @@ -58,7 +60,8 @@ const MSubmitButton = (props: TRSubmitButton) => { onClose={onClose} closeOnEsc={false} closeOnOverlayClick={false} - motionPreset="slideInBottom"> + motionPreset="slideInBottom" + > <ModalOverlay /> <ModalContent bg={bg}> <ModalCloseButton /> @@ -74,7 +77,7 @@ const MSubmitButton = (props: TRSubmitButton) => { /** * Desktop Submit Button */ -const DSubmitButton = (props: TRSubmitButton) => { +const DSubmitButton: React.FC<TRSubmitButton> = (props: TRSubmitButton) => { const { children, isOpen, onClose, onChange } = props; const bg = useColorValue('white', 'gray.900'); return ( @@ -91,7 +94,7 @@ const DSubmitButton = (props: TRSubmitButton) => { ); }; -export const SubmitButton = (props: TSubmitButton) => { +export const SubmitButton: React.FC<TSubmitButton> = (props: TSubmitButton) => { const { handleChange } = props; const isMobile = useMobile(); const { resolvedIsOpen, btnLoading } = useLGState(); diff --git a/hyperglass/ui/components/table/body.tsx b/hyperglass/ui/components/table/body.tsx index f90e06d..2d62a4f 100644 --- a/hyperglass/ui/components/table/body.tsx +++ b/hyperglass/ui/components/table/body.tsx @@ -2,7 +2,7 @@ import { Box } from '@chakra-ui/react'; import type { BoxProps } from '@chakra-ui/react'; -export const TableBody = (props: BoxProps) => ( +export const TableBody: React.FC<BoxProps> = (props: BoxProps) => ( <Box as="tbody" overflowY="scroll" diff --git a/hyperglass/ui/components/table/button.tsx b/hyperglass/ui/components/table/button.tsx index d86721f..a4e1553 100644 --- a/hyperglass/ui/components/table/button.tsx +++ b/hyperglass/ui/components/table/button.tsx @@ -2,6 +2,6 @@ import { IconButton } from '@chakra-ui/react'; import type { TTableIconButton } from './types'; -export const TableIconButton = (props: TTableIconButton) => ( +export const TableIconButton: React.FC<TTableIconButton> = (props: TTableIconButton) => ( <IconButton size="sm" borderWidth={1} {...props} aria-label="Table Icon Button" /> ); diff --git a/hyperglass/ui/components/table/cell.tsx b/hyperglass/ui/components/table/cell.tsx index 27e68e9..618d094 100644 --- a/hyperglass/ui/components/table/cell.tsx +++ b/hyperglass/ui/components/table/cell.tsx @@ -3,7 +3,7 @@ import { useColorValue } from '~/context'; import type { TTableCell } from './types'; -export const TableCell = (props: TTableCell) => { +export const TableCell: React.FC<TTableCell> = (props: TTableCell) => { const { bordersVertical = [false, 0], align, ...rest } = props; const [doVerticalBorders, index] = bordersVertical; const borderLeftColor = useColorValue('blackAlpha.100', 'whiteAlpha.100'); diff --git a/hyperglass/ui/components/table/head.tsx b/hyperglass/ui/components/table/head.tsx index adee3a8..37abe0f 100644 --- a/hyperglass/ui/components/table/head.tsx +++ b/hyperglass/ui/components/table/head.tsx @@ -3,7 +3,7 @@ import { useColorValue } from '~/context'; import type { BoxProps } from '@chakra-ui/react'; -export const TableHead = (props: BoxProps) => { +export const TableHead: React.FC<BoxProps> = (props: BoxProps) => { const bg = useColorValue('blackAlpha.100', 'whiteAlpha.100'); return <Box as="thead" overflowX="hidden" overflowY="auto" bg={bg} {...props} />; }; diff --git a/hyperglass/ui/components/table/main.tsx b/hyperglass/ui/components/table/main.tsx index d94a4b8..41bd90a 100644 --- a/hyperglass/ui/components/table/main.tsx +++ b/hyperglass/ui/components/table/main.tsx @@ -1,3 +1,6 @@ +// This rule isn't needed because react-table does this for us, for better or worse. +/* eslint react/jsx-key: 0 */ + import dynamic from 'next/dynamic'; import { Flex, Icon, Text } from '@chakra-ui/react'; import { usePagination, useSortBy, useTable } from 'react-table'; @@ -34,7 +37,7 @@ const DoubleChevronLeft = dynamic<MeronexIcon>(() => import('@meronex/icons/fi').then(i => i.FiChevronsLeft), ); -export function Table(props: TTable) { +export const Table: React.FC<TTable> = (props: TTable) => { const { data, columns, @@ -55,7 +58,7 @@ export function Table(props: TTable) { maxWidth: 300, }; - let hiddenColumns = [] as string[]; + const hiddenColumns = [] as string[]; for (const col of columns) { if (col.hidden) { @@ -102,7 +105,8 @@ export function Table(props: TTable) { as="th" align={column.align} {...column.getHeaderProps()} - {...column.getSortByToggleProps()}> + {...column.getSortByToggleProps()} + > <Text fontSize="sm" fontWeight="bold" display="inline-block"> {column.render('Header')} </Text> @@ -130,14 +134,16 @@ export function Table(props: TTable) { highlightBg={rowHighlightBg} doHorizontalBorders={bordersHorizontal} highlight={row.values[rowHighlightProp ?? ''] ?? false} - {...row.getRowProps()}> + {...row.getRowProps()} + > {row.cells.map((cell, i) => { const { column, row, value } = cell as TCellRender; return ( <TableCell align={cell.column.align} bordersVertical={[bordersVertical, i]} - {...cell.getCellProps()}> + {...cell.getCellProps()} + > {typeof Cell !== 'undefined' ? ( <Cell column={column} row={row} value={value} /> ) : ( @@ -199,4 +205,4 @@ export function Table(props: TTable) { </CardFooter> </CardBody> ); -} +}; diff --git a/hyperglass/ui/components/table/pageSelect.tsx b/hyperglass/ui/components/table/pageSelect.tsx index f58f157..fafa6d9 100644 --- a/hyperglass/ui/components/table/pageSelect.tsx +++ b/hyperglass/ui/components/table/pageSelect.tsx @@ -1,7 +1,7 @@ import { Select } from '@chakra-ui/react'; import { SelectProps } from '@chakra-ui/react'; -export const TableSelectShow = (props: SelectProps) => { +export const TableSelectShow: React.FC<SelectProps> = (props: SelectProps) => { const { value, ...rest } = props; return ( <Select size="sm" {...rest}> diff --git a/hyperglass/ui/components/table/row.tsx b/hyperglass/ui/components/table/row.tsx index 20e15db..47e4111 100644 --- a/hyperglass/ui/components/table/row.tsx +++ b/hyperglass/ui/components/table/row.tsx @@ -4,7 +4,7 @@ import { useOpposingColor } from '~/hooks'; import type { TTableRow } from './types'; -export const TableRow = (props: TTableRow) => { +export const TableRow: React.FC<TTableRow> = (props: TTableRow) => { const { index = 0, doStripe = false, diff --git a/hyperglass/ui/components/table/table.tsx b/hyperglass/ui/components/table/table.tsx index 27ca08e..9fb1c84 100644 --- a/hyperglass/ui/components/table/table.tsx +++ b/hyperglass/ui/components/table/table.tsx @@ -3,7 +3,7 @@ import { useColorValue } from '~/context'; import type { BoxProps } from '@chakra-ui/react'; -export const TableMain = (props: BoxProps) => { +export const TableMain: React.FC<BoxProps> = (props: BoxProps) => { const scrollbar = useColorValue('blackAlpha.300', 'whiteAlpha.300'); const scrollbarHover = useColorValue('blackAlpha.400', 'whiteAlpha.400'); const scrollbarBg = useColorValue('blackAlpha.50', 'whiteAlpha.50'); diff --git a/hyperglass/ui/components/util/if.tsx b/hyperglass/ui/components/util/if.tsx index 9825a83..c95e5c1 100644 --- a/hyperglass/ui/components/util/if.tsx +++ b/hyperglass/ui/components/util/if.tsx @@ -1,6 +1,6 @@ import type { TIf } from './types'; -export const If = (props: TIf) => { - const { c, render, children, ...rest } = props; - return c ? (render ? render(rest) : children) : null; +export const If = (props: React.PropsWithChildren<TIf>): React.ReactNode | null => { + const { c, children } = props; + return c ? children : null; }; diff --git a/hyperglass/ui/components/util/types.ts b/hyperglass/ui/components/util/types.ts index dfa0b58..b51b065 100644 --- a/hyperglass/ui/components/util/types.ts +++ b/hyperglass/ui/components/util/types.ts @@ -1,5 +1,3 @@ export interface TIf { c: boolean; - render?: (rest: any) => JSX.Element; - [k: string]: any; } diff --git a/hyperglass/ui/context/HyperglassProvider.tsx b/hyperglass/ui/context/HyperglassProvider.tsx index 872a3e5..0efc403 100644 --- a/hyperglass/ui/context/HyperglassProvider.tsx +++ b/hyperglass/ui/context/HyperglassProvider.tsx @@ -16,7 +16,7 @@ const HyperglassContext = createContext<IConfig>(Object()); const queryClient = new QueryClient(); -export const HyperglassProvider = (props: THyperglassProvider) => { +export const HyperglassProvider: React.FC<THyperglassProvider> = (props: THyperglassProvider) => { const { config, children } = props; const value = useMemo(() => config, []); const userTheme = value && makeTheme(value.web.theme, value.web.theme.default_color_mode); diff --git a/hyperglass/ui/context/types.ts b/hyperglass/ui/context/types.ts index 2712f0d..9168636 100644 --- a/hyperglass/ui/context/types.ts +++ b/hyperglass/ui/context/types.ts @@ -11,12 +11,6 @@ export interface TGlobalState { formData: TFormData; } -interface TGlobalStateFunctions { - resetForm(): void; -} - -// export type TUseGlobalState = State<TGlobalState> & TGlobalStateFunctions; - export interface TUseGlobalState { isSubmitting: State<TGlobalState['isSubmitting']>; formData: State<TGlobalState['formData']>; diff --git a/hyperglass/ui/hooks/useASNDetail.ts b/hyperglass/ui/hooks/useASNDetail.ts index a7764d2..26dd9bd 100644 --- a/hyperglass/ui/hooks/useASNDetail.ts +++ b/hyperglass/ui/hooks/useASNDetail.ts @@ -1,5 +1,6 @@ import { useQuery } from 'react-query'; +import type { QueryObserverResult } from 'react-query'; import type { TASNQuery } from '~/types'; import type { TUseASNDetailFn } from './types'; @@ -9,6 +10,7 @@ async function query(ctx: TUseASNDetailFn): Promise<TASNQuery> { mode: 'cors', method: 'POST', headers: { 'content-type': 'application/json' }, + /* eslint no-useless-escape: 0 */ body: JSON.stringify({ query: `{ asn(asn:\"${asn}\"){ organization { orgName } } }` }), }); return await res.json(); @@ -18,7 +20,7 @@ async function query(ctx: TUseASNDetailFn): Promise<TASNQuery> { * Query the Caida AS Rank API to get an ASN's organization name for the AS Path component. * @see https://api.asrank.caida.org/v2/docs */ -export function useASNDetail(asn: string) { +export function useASNDetail(asn: string): QueryObserverResult<TASNQuery> { return useQuery(asn, query, { refetchOnWindowFocus: false, refetchInterval: false, diff --git a/hyperglass/ui/hooks/useBooleanValue.ts b/hyperglass/ui/hooks/useBooleanValue.ts index 2922ce4..eb17e99 100644 --- a/hyperglass/ui/hooks/useBooleanValue.ts +++ b/hyperglass/ui/hooks/useBooleanValue.ts @@ -3,7 +3,7 @@ import { useMemo } from 'react'; /** * Track the state of a boolean and return values based on its state. */ -export function useBooleanValue<T extends any, F extends any>( +export function useBooleanValue<T extends unknown, F extends unknown>( status: boolean, ifTrue: T, ifFalse: F, diff --git a/hyperglass/ui/hooks/useDNSQuery.ts b/hyperglass/ui/hooks/useDNSQuery.ts index 8f7d6c4..3178181 100644 --- a/hyperglass/ui/hooks/useDNSQuery.ts +++ b/hyperglass/ui/hooks/useDNSQuery.ts @@ -2,6 +2,7 @@ import { useQuery } from 'react-query'; import { useConfig } from '~/context'; import { fetchWithTimeout } from '~/util'; +import type { QueryObserverResult } from 'react-query'; import type { DnsOverHttps } from '~/types'; import type { TUseDNSQueryFn } from './types'; @@ -46,7 +47,7 @@ export function useDNSQuery( * Address family, e.g. IPv4 or IPv6. */ family: 4 | 6, -) { +): QueryObserverResult<DnsOverHttps.Response> { const { cache, web } = useConfig(); return useQuery([web.dns_provider.url, { target, family }], dnsQuery, { cacheTime: cache.timeout * 1000, diff --git a/hyperglass/ui/hooks/useLGQuery.ts b/hyperglass/ui/hooks/useLGQuery.ts index 6b9dd57..40aae06 100644 --- a/hyperglass/ui/hooks/useLGQuery.ts +++ b/hyperglass/ui/hooks/useLGQuery.ts @@ -2,13 +2,14 @@ import { useQuery } from 'react-query'; import { useConfig } from '~/context'; import { fetchWithTimeout } from '~/util'; +import type { QueryObserverResult } from 'react-query'; import type { TFormQuery } from '~/types'; import type { TUseLGQueryFn } from './types'; /** * Custom hook handle submission of a query to the hyperglass backend. */ -export function useLGQuery(query: TFormQuery) { +export function useLGQuery(query: TFormQuery): QueryObserverResult<TQueryResponse> { const { request_timeout, cache } = useConfig(); const controller = new AbortController(); diff --git a/hyperglass/ui/hooks/useOpposingColor.ts b/hyperglass/ui/hooks/useOpposingColor.ts index ade9d92..4f2bf4d 100644 --- a/hyperglass/ui/hooks/useOpposingColor.ts +++ b/hyperglass/ui/hooks/useOpposingColor.ts @@ -8,7 +8,7 @@ import type { TOpposingOptions } from './types'; * Parse the color string to determine if it's a Chakra UI theme key, and determine if the * opposing color should be black or white. */ -export function useIsDark(color: string) { +export function useIsDark(color: string): boolean { const theme = useTheme(); if (typeof color === 'string' && color.match(/[a-zA-Z]+\.[a-zA-Z0-9]+/g)) { color = getColor(theme, color, color); diff --git a/hyperglass/ui/hooks/useStrf.ts b/hyperglass/ui/hooks/useStrf.ts index 758e6ae..f790e8f 100644 --- a/hyperglass/ui/hooks/useStrf.ts +++ b/hyperglass/ui/hooks/useStrf.ts @@ -6,6 +6,6 @@ import type { UseStrfArgs } from './types'; /** * Format a string with variables, like Python's string.format() */ -export function useStrf(str: string, fmt: UseStrfArgs, ...deps: any[]): string { +export function useStrf(str: string, fmt: UseStrfArgs, ...deps: unknown[]): string { return useMemo(() => format(str, fmt), deps); } diff --git a/hyperglass/ui/hooks/useTableToString.ts b/hyperglass/ui/hooks/useTableToString.ts index 7ddddd9..3a6af5c 100644 --- a/hyperglass/ui/hooks/useTableToString.ts +++ b/hyperglass/ui/hooks/useTableToString.ts @@ -43,7 +43,7 @@ function formatTime(val: number): string { export function useTableToString( target: string, data: TQueryResponse | undefined, - ...deps: any + ...deps: unknown[] ): () => string { const { web, parsed_data_fields, messages } = useConfig(); @@ -81,7 +81,7 @@ export function useTableToString( let result = messages.no_output; try { if (typeof data !== 'undefined' && isStructuredOutput(data)) { - let tableStringParts = [`Routes For: ${target}`, `Timestamp: ${data.timestamp} UTC`]; + const tableStringParts = [`Routes For: ${target}`, `Timestamp: ${data.timestamp} UTC`]; for (const route of data.output.routes) { for (const field of parsed_data_fields) { const [header, accessor, align] = field; diff --git a/hyperglass/ui/package.json b/hyperglass/ui/package.json index 300a98d..6f3f5d7 100644 --- a/hyperglass/ui/package.json +++ b/hyperglass/ui/package.json @@ -50,20 +50,27 @@ "@types/react-table": "^7.0.25", "@types/string-format": "^2.0.0", "@types/yup": "^0.29.9", - "@typescript-eslint/eslint-plugin": "^2.24.0", - "@typescript-eslint/parser": "^2.24.0", + "@typescript-eslint/eslint-plugin": "^4.11.1", + "@typescript-eslint/parser": "^4.11.1", "@upstatement/eslint-config": "^0.4.3", "@upstatement/prettier-config": "^0.3.0", "babel-eslint": "^10.1.0", "eslint": "^6.8.0", + "eslint-config-prettier": "^7.1.0", "eslint-config-react-app": "^5.2.0", "eslint-import-resolver-typescript": "^2.3.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.3", + "eslint-plugin-json": "^2.1.2", "eslint-plugin-jsx-a11y": "^6.2.3", - "eslint-plugin-react": "^7.19.0", - "eslint-plugin-react-hooks": "^2.3.0", + "eslint-plugin-prettier": "^3.3.0", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-react-hooks": "^4.2.0", "express": "^4.17.1", "http-proxy-middleware": "0.20.0", - "prettier": "2.0", + "onchange": "^7.1.0", + "prettier": "^2.2.1", + "prettier-eslint": "^12.0.0", "typescript": "^4.0.3" } } diff --git a/hyperglass/ui/pages/_app.tsx b/hyperglass/ui/pages/_app.tsx index ec6e867..fc9ca7f 100644 --- a/hyperglass/ui/pages/_app.tsx +++ b/hyperglass/ui/pages/_app.tsx @@ -2,21 +2,21 @@ import Head from 'next/head'; import { HyperglassProvider } from '~/context'; import { IConfig } from '~/types'; +import type { AppProps, AppInitialProps, AppContext } from 'next/app'; + if (process.env.NODE_ENV === 'development') { require('@hookstate/devtools'); } -import type { AppProps, AppInitialProps } from 'next/app'; +type TApp = { config: IConfig }; -type TAppProps = AppProps & AppInitialProps; +type GetInitialPropsReturn<IP> = AppProps & AppInitialProps & { appProps: IP }; -interface TApp extends TAppProps { - appProps: { config: IConfig }; -} +type Temp<IP> = React.FC<GetInitialPropsReturn<IP>> & { + getInitialProps(c?: AppContext): Promise<{ appProps: IP }>; +}; -type TAppInitial = Pick<TApp, 'appProps'>; - -const App = (props: TApp) => { +const App: Temp<TApp> = (props: GetInitialPropsReturn<TApp>) => { const { Component, pageProps, appProps } = props; const { config } = appProps; @@ -42,7 +42,7 @@ const App = (props: TApp) => { ); }; -App.getInitialProps = async (): Promise<TAppInitial> => { +App.getInitialProps = async function getInitialProps() { const config = (process.env._HYPERGLASS_CONFIG_ as unknown) as IConfig; return { appProps: { config } }; }; diff --git a/hyperglass/ui/pages/_document.tsx b/hyperglass/ui/pages/_document.tsx index d764e1b..9beb10f 100644 --- a/hyperglass/ui/pages/_document.tsx +++ b/hyperglass/ui/pages/_document.tsx @@ -1,13 +1,13 @@ import Document, { Html, Head, Main, NextScript } from 'next/document'; -import type { DocumentContext } from 'next/document'; +import type { DocumentContext, DocumentInitialProps } from 'next/document'; class MyDocument extends Document { - static async getInitialProps(ctx: DocumentContext) { + static async getInitialProps(ctx: DocumentContext): Promise<DocumentInitialProps> { const initialProps = await Document.getInitialProps(ctx); return { ...initialProps }; } - render() { + render(): JSX.Element { return ( <Html lang="en"> <Head> diff --git a/hyperglass/ui/pages/_error.tsx b/hyperglass/ui/pages/_error.tsx index 8aa9729..b48035d 100644 --- a/hyperglass/ui/pages/_error.tsx +++ b/hyperglass/ui/pages/_error.tsx @@ -12,14 +12,14 @@ import { } from '@chakra-ui/react'; import { inRange } from 'lodash'; -import type { NextPageContext } from 'next'; +import type { NextPage, NextPageContext } from 'next'; interface TError { status: string; code: number; } -const ErrorContent = (props: TError) => { +const ErrorContent: React.FC<TError> = (props: TError) => { const { status, code } = props; const router = useRouter(); @@ -52,12 +52,13 @@ const ErrorContent = (props: TError) => { alignItems="center" flexDirection="column" justifyContent="start" - mt={{ base: '50%', xl: '25%' }}> + mt={{ base: '50%', xl: '25%' }} + > <Heading mb={4} as="h1" fontSize="2xl"> <Text as="span" color={errorColor[baseCode]}> {status} </Text> - {code === 404 && <Text as="span"> isn't a thing...</Text>} + {code === 404 && <Text as="span">{` isn't a thing...`}</Text>} </Heading> <Button variant="outline" onClick={handleClick} colorScheme={colorScheme[baseCode]}> Home @@ -67,7 +68,7 @@ const ErrorContent = (props: TError) => { ); }; -const ErrorPage = (props: TError) => { +const ErrorPage: NextPage<TError> = (props: TError) => { const { status, code } = props; return ( <ThemeProvider theme={theme}> diff --git a/hyperglass/ui/pages/index.tsx b/hyperglass/ui/pages/index.tsx index 32259ba..bbe4adc 100644 --- a/hyperglass/ui/pages/index.tsx +++ b/hyperglass/ui/pages/index.tsx @@ -13,7 +13,7 @@ interface TIndex { favicons: FaviconComponent[]; } -const Index = (props: TIndex) => { +const Index: React.FC<TIndex> = (props: TIndex) => { const { favicons } = props; return ( <> @@ -32,7 +32,8 @@ const Index = (props: TIndex) => { export const getStaticProps: GetStaticProps<TIndex> = async () => { const faviconConfig = (process.env._HYPERGLASS_FAVICONS_ as unknown) as Favicon[]; const favicons = faviconConfig.map(icon => { - let { image_format, dimensions, prefix, rel } = icon; + const { image_format, dimensions, prefix } = icon; + let { rel } = icon; if (rel === null) { rel = ''; } diff --git a/hyperglass/ui/prettier.config.js b/hyperglass/ui/prettier.config.js deleted file mode 100644 index 7b1599d..0000000 --- a/hyperglass/ui/prettier.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@upstatement/prettier-config"); diff --git a/hyperglass/ui/public/noflash.js b/hyperglass/ui/public/noflash.js deleted file mode 100644 index 602f238..0000000 --- a/hyperglass/ui/public/noflash.js +++ /dev/null @@ -1,40 +0,0 @@ -// Insert this script in your index.html right after the <body> tag. -// This will help to prevent a flash if dark mode is the default. - -(function() { - // Change these if you use something different in your hook. - var storageKey = 'darkMode'; - var classNameDark = 'dark-mode'; - var classNameLight = 'light-mode'; - - function setClassOnDocumentBody(darkMode) { - document.body.classList.add(darkMode ? classNameDark : classNameLight); - document.body.classList.remove(darkMode ? classNameLight : classNameDark); - } - - var preferDarkQuery = '(prefers-color-scheme: dark)'; - var mql = window.matchMedia(preferDarkQuery); - var supportsColorSchemeQuery = mql.media === preferDarkQuery; - var localStorageTheme = null; - try { - localStorageTheme = localStorage.getItem(storageKey); - } catch (err) {} - var localStorageExists = localStorageTheme !== null; - if (localStorageExists) { - localStorageTheme = JSON.parse(localStorageTheme); - } - - // Determine the source of truth - if (localStorageExists) { - // source of truth from localStorage - setClassOnDocumentBody(localStorageTheme); - } else if (supportsColorSchemeQuery) { - // source of truth from system - setClassOnDocumentBody(mql.matches); - localStorage.setItem(storageKey, mql.matches); - } else { - // source of truth from document.body - var isDarkMode = document.body.classList.contains(classNameDark); - localStorage.setItem(storageKey, JSON.stringify(isDarkMode)); - } -})(); diff --git a/hyperglass/ui/tsconfig.json b/hyperglass/ui/tsconfig.json index d094dd5..8d3a05c 100644 --- a/hyperglass/ui/tsconfig.json +++ b/hyperglass/ui/tsconfig.json @@ -30,6 +30,13 @@ "isolatedModules": true, "jsx": "preserve" }, - "exclude": ["node_modules"], - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "types/globals.d.ts"] + "exclude": ["node_modules", ".next"], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "types/globals.d.ts", + "next.config.js", + "nextdev.js" + ] } diff --git a/hyperglass/ui/util/common.js b/hyperglass/ui/util/common.js new file mode 100644 index 0000000..3a53f2c --- /dev/null +++ b/hyperglass/ui/util/common.js @@ -0,0 +1,263 @@ +'use strict'; +var __assign = + (this && this.__assign) || + function () { + __assign = + Object.assign || + function (t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; +var __awaiter = + (this && this.__awaiter) || + function (thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P + ? value + : new P(function (resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator['throw'](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; +var __generator = + (this && this.__generator) || + function (thisArg, body) { + var _ = { + label: 0, + sent: function () { + if (t[0] & 1) throw t[1]; + return t[1]; + }, + trys: [], + ops: [], + }, + f, + y, + t, + g; + return ( + (g = { next: verb(0), throw: verb(1), return: verb(2) }), + typeof Symbol === 'function' && + (g[Symbol.iterator] = function () { + return this; + }), + g + ); + function verb(n) { + return function (v) { + return step([n, v]); + }; + } + function step(op) { + if (f) throw new TypeError('Generator is already executing.'); + while (_) + try { + if ( + ((f = 1), + y && + (t = + op[0] & 2 + ? y['return'] + : op[0] + ? y['throw'] || ((t = y['return']) && t.call(y), 0) + : y.next) && + !(t = t.call(y, op[1])).done) + ) + return t; + if (((y = 0), t)) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if ( + !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && + (op[0] === 6 || op[0] === 2) + ) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) _.ops.pop(); + _.trys.pop(); + continue; + } + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + if (op[0] & 5) throw op[1]; + return { value: op[0] ? op[1] : void 0, done: true }; + } + }; +var __rest = + (this && this.__rest) || + function (s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === 'function') + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + }; +exports.__esModule = true; +exports.fetchWithTimeout = exports.arrangeIntoTree = exports.chunkArray = exports.flatten = exports.all = void 0; +function all() { + var iter = []; + for (var _i = 0; _i < arguments.length; _i++) { + iter[_i] = arguments[_i]; + } + for (var _a = 0, iter_1 = iter; _a < iter_1.length; _a++) { + var i = iter_1[_a]; + if (!i) { + return false; + } + } + return true; +} +exports.all = all; +function flatten(arr) { + return arr.reduce(function (flat, toFlatten) { + return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten); + }, []); +} +exports.flatten = flatten; +function chunkArray(array, size) { + var result = []; + for (var i = 0; i < array.length; i += size) { + var chunk = array.slice(i, i + size); + result.push(chunk); + } + return result; +} +exports.chunkArray = chunkArray; +/** + * Arrange an array of arrays into a tree of nodes. + * + * Blatantly stolen from: + * @see https://gist.github.com/stephanbogner/4b590f992ead470658a5ebf09167b03d + */ +function arrangeIntoTree(paths) { + var tree = []; + for (var i = 0; i < paths.length; i++) { + var path = paths[i]; + var currentLevel = tree; + for (var j = 0; j < path.length; j++) { + var part = path[j]; + var existingPath = findWhere(currentLevel, 'base', part); + if (existingPath !== false) { + currentLevel = existingPath.children; + } else { + var newPart = { + base: part, + children: [], + }; + currentLevel.push(newPart); + currentLevel = newPart.children; + } + } + } + return tree; + function findWhere(array, idx, value) { + var t = 0; + while (t < array.length && array[t][idx] !== value) { + t++; + } + if (t < array.length) { + return array[t]; + } else { + return false; + } + } +} +exports.arrangeIntoTree = arrangeIntoTree; +/** + * Fetch Wrapper that incorporates a timeout via a passed AbortController instance. + * + * Adapted from: https://lowmess.com/blog/fetch-with-timeout + */ +function fetchWithTimeout(uri, options, timeout, controller) { + if (options === void 0) { + options = {}; + } + return __awaiter(this, void 0, void 0, function () { + var _a, signal, allOptions, config; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + (_a = options.signal), + (signal = _a === void 0 ? new AbortController().signal : _a), + (allOptions = __rest(options, ['signal'])); + config = __assign(__assign({}, allOptions), { signal: signal }); + /** + * Set a timeout limit for the request using `setTimeout`. If the body of this timeout is + * reached before the request is completed, it will be cancelled. + */ + setTimeout(function () { + controller.abort(); + }, timeout); + return [4 /*yield*/, fetch(uri, config)]; + case 1: + return [2 /*return*/, _b.sent()]; + } + }); + }); +} +exports.fetchWithTimeout = fetchWithTimeout; diff --git a/hyperglass/ui/util/common.ts b/hyperglass/ui/util/common.ts index e56bce8..3417700 100644 --- a/hyperglass/ui/util/common.ts +++ b/hyperglass/ui/util/common.ts @@ -1,5 +1,5 @@ -export function all(...iter: any[]) { - for (let i of iter) { +export function all<I extends unknown>(...iter: I[]): boolean { + for (const i of iter) { if (!i) { return false; } @@ -13,19 +13,19 @@ export function flatten<T extends unknown>(arr: any[][]): T[] { }, []); } -export function chunkArray<A extends any>(array: A[], size: number): A[][] { - let result = [] as A[][]; +export function chunkArray<A extends unknown>(array: A[], size: number): A[][] { + const result = [] as A[][]; for (let i = 0; i < array.length; i += size) { - let chunk = array.slice(i, i + size); + const chunk = array.slice(i, i + size); result.push(chunk); } return result; } -interface PathPart { +type PathPart = { base: number; children: PathPart[]; -} +}; /** * Arrange an array of arrays into a tree of nodes. @@ -33,17 +33,17 @@ interface PathPart { * Blatantly stolen from: * @see https://gist.github.com/stephanbogner/4b590f992ead470658a5ebf09167b03d */ -export function arrangeIntoTree<P extends any>(paths: P[][]): PathPart[] { - let tree = [] as PathPart[]; +export function arrangeIntoTree<P extends unknown>(paths: P[][]): PathPart[] { + const tree = [] as PathPart[]; for (let i = 0; i < paths.length; i++) { - let path = paths[i]; + const path = paths[i]; let currentLevel = tree; for (let j = 0; j < path.length; j++) { - let part = path[j]; + const part = path[j]; - const existingPath = findWhere(currentLevel, 'base', part); + const existingPath = findWhere<PathPart, typeof part>(currentLevel, 'base', part); if (existingPath !== false) { currentLevel = existingPath.children; @@ -60,8 +60,13 @@ export function arrangeIntoTree<P extends any>(paths: P[][]): PathPart[] { } return tree; - function findWhere<V extends any>(array: any[], idx: string, value: V): PathPart | false { + function findWhere<A extends Record<string, unknown>, V extends unknown>( + array: A[], + idx: string, + value: V, + ): A | false { let t = 0; + while (t < array.length && array[t][idx] !== value) { t++; } diff --git a/hyperglass/ui/yarn.lock b/hyperglass/ui/yarn.lock index 867f1c0..bf3d44b 100644 --- a/hyperglass/ui/yarn.lock +++ b/hyperglass/ui/yarn.lock @@ -210,6 +210,16 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@blakeembrey/deque@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@blakeembrey/deque/-/deque-1.0.5.tgz#f4fa17fc5ee18317ec01a763d355782c7b395eaf" + integrity sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg== + +"@blakeembrey/template@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@blakeembrey/template/-/template-1.0.0.tgz#bf8828bc3ae8004d97904d78f64e3cc2cd216438" + integrity sha512-J6WGZqCLdRMHUkyRG6fBSIFJ0rL60/nsQNh5rQvsYZ5u0PsKw6XQcJcA3DWvd9cN3j/IQx5yB1fexhCafwwUUw== + "@chakra-ui/accordion@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@chakra-ui/accordion/-/accordion-1.0.3.tgz#2c23e6f80edfc6877585faf92a0f4857a5fb5bd4" @@ -875,6 +885,22 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@eslint/eslintrc@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@hapi/accept@5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.1.tgz#068553e867f0f63225a506ed74e899441af53e10" @@ -957,6 +983,27 @@ resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.0.4.tgz#5ad753572891aa7cb1010b358cc4241d7be20d20" integrity sha512-kZ/37aSQaR0GCZVqh7WDLkeEZqzjPQoZUDdo6TOWiIEb+089AmfYp8A4/1ra9Fu8T4b4wnB76TRl6tp6DeJLXg== +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + "@opentelemetry/api@0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-0.14.0.tgz#4e17d8d2f1da72b19374efa7b6526aa001267cae" @@ -1133,49 +1180,124 @@ resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.29.9.tgz#e2015187ae5739fd3b791b3b7ab9094f2aa5a474" integrity sha512-ZtjjlrHuHTYctHDz3c8XgInjj0v+Hahe32N/4cDa2banibf9w6aAgxwx0jZtBjKKzmGIU4NXhofEsBW1BbqrNg== -"@typescript-eslint/eslint-plugin@^2.24.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== +"@typescript-eslint/eslint-plugin@^4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz#7579c6d17ad862154c10bc14b40e5427b729e209" + integrity sha512-fABclAX2QIEDmTMk6Yd7Muv1CzFLwWM4505nETzRHpP3br6jfahD9UUJkhnJ/g2m7lwfz8IlswcwGGPGiq9exw== dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/experimental-utils" "4.11.1" + "@typescript-eslint/scope-manager" "4.11.1" + debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" + semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== +"@typescript-eslint/experimental-utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^2.24.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" - integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== +"@typescript-eslint/experimental-utils@4.11.1", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz#2dad3535b878c25c7424e40bfa79d899f3f485bc" + integrity sha512-mAlWowT4A6h0TC9F+J5pdbEhjNiEMO+kqPKQ4sc3fVieKL71dEqfkKgtcFVSX3cjSBwYwhImaQ/mXQF0oaI38g== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.11.1" + "@typescript-eslint/types" "4.11.1" + "@typescript-eslint/typescript-estree" "4.11.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^3.0.0": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.34.0" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/experimental-utils" "3.10.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== +"@typescript-eslint/parser@^4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.11.1.tgz#981e18de2e019d6ca312596615f92e8f6f6598ed" + integrity sha512-BJ3jwPQu1jeynJ5BrjLuGfK/UJu6uwHxJ/di7sanqmUmxzmyIcd3vz58PMR7wpi8k3iWq2Q11KMYgZbUpRoIPw== dependencies: + "@typescript-eslint/scope-manager" "4.11.1" + "@typescript-eslint/types" "4.11.1" + "@typescript-eslint/typescript-estree" "4.11.1" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz#72dc2b60b0029ab0888479b12bf83034920b4b69" + integrity sha512-Al2P394dx+kXCl61fhrrZ1FTI7qsRDIUiVSuN6rTwss6lUn8uVO2+nnF4AvO0ug8vMsy3ShkbxLu/uWZdTtJMQ== + dependencies: + "@typescript-eslint/types" "4.11.1" + "@typescript-eslint/visitor-keys" "4.11.1" + +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== + +"@typescript-eslint/types@4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.11.1.tgz#3ba30c965963ef9f8ced5a29938dd0c465bd3e05" + integrity sha512-5kvd38wZpqGY4yP/6W3qhYX6Hz0NwUbijVsX2rxczpY6OXaMxh0+5E5uLJKVFwaBM7PJe1wnMym85NfKYIh6CA== + +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== + dependencies: + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" debug "^4.1.1" - eslint-visitor-keys "^1.1.0" glob "^7.1.6" is-glob "^4.0.1" lodash "^4.17.15" semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/typescript-estree@4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz#a4416b4a65872a48773b9e47afabdf7519eb10bc" + integrity sha512-tC7MKZIMRTYxQhrVAFoJq/DlRwv1bnqA4/S2r3+HuHibqvbrPcyf858lNzU7bFmy4mLeIHFYr34ar/1KumwyRw== + dependencies: + "@typescript-eslint/types" "4.11.1" + "@typescript-eslint/visitor-keys" "4.11.1" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== + dependencies: + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/visitor-keys@4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz#4c050a4c1f7239786e2dd4e69691436143024e05" + integrity sha512-IrlBhD9bm4bdYcS8xpWarazkKXlE7iYb1HzRuyBP114mIaj5DJPo11Us1HgH60dTt41TCZXMaTCAW+OILIYPOg== + dependencies: + "@typescript-eslint/types" "4.11.1" + eslint-visitor-keys "^2.0.0" + "@upstatement/eslint-config@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@upstatement/eslint-config/-/eslint-config-0.4.3.tgz#9cfbe22d15c0fee2f7154e9f61455c4e53718027" @@ -1358,7 +1480,7 @@ accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^5.2.0: +acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== @@ -1368,7 +1490,7 @@ acorn@^6.4.1: 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.1.1, acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -1408,6 +1530,16 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" + integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ally.js@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/ally.js/-/ally.js-1.4.1.tgz#9fb7e6ba58efac4ee9131cb29aa9ee3b540bcf1e" @@ -1421,6 +1553,11 @@ anser@1.4.9: resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^4.2.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" @@ -1448,6 +1585,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1455,7 +1597,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -1491,6 +1633,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1547,11 +1694,25 @@ array-includes@^3.1.1: es-abstract "^1.17.0" is-string "^1.0.5" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.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" @@ -1599,6 +1760,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -1957,6 +2123,14 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1999,7 +2173,18 @@ chalk@4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.0: +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== @@ -2027,7 +2212,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@3.4.3, chokidar@^3.4.1: +chokidar@3.4.3, chokidar@^3.3.1, chokidar@^3.4.1: version "3.4.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== @@ -2181,6 +2366,11 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +common-tags@^1.4.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2238,6 +2428,11 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -2366,6 +2561,15 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-browserify@3.12.0, crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -2551,7 +2755,7 @@ dayjs@^1.8.25: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.9.3.tgz#b7f94b22ad2a136a4ca02a01ab68ae893fe1a268" integrity sha512-V+1SyIvkS+HmNbN1G7A9+ERbFTV9KTXu6Oor98v2xHmzzpp52OIJhQuJSTywWuBY5pyAEmlwbCi1Me87n/SLOw== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2596,7 +2800,7 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -2677,6 +2881,26 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -2827,6 +3051,13 @@ enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" @@ -2839,7 +3070,7 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -2863,7 +3094,7 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-abstract@^1.18.0-next.0: +es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: version "1.18.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== @@ -2926,7 +3157,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -2936,6 +3167,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-config-prettier@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz#5402eb559aa94b894effd6bddfa0b1ca051c858f" + integrity sha512-9sm5/PxaFG7qNJvJzTROMM1Bk1ozXVTKI0buKOyb0Bsr1hrwi0H/TzxF/COtf1uxikIK8SwhX7K6zg78jAzbeA== + eslint-config-react-app@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df" @@ -2943,6 +3179,14 @@ eslint-config-react-app@^5.2.0: dependencies: confusing-browser-globals "^1.0.9" +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + eslint-import-resolver-typescript@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.3.0.tgz#0870988098bc6c6419c87705e6b42bee89425445" @@ -2954,6 +3198,48 @@ eslint-import-resolver-typescript@^2.3.0: resolve "^1.17.0" tsconfig-paths "^3.9.0" +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jest@^24.1.3: + version "24.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.3.tgz#fa3db864f06c5623ff43485ca6c0e8fc5fe8ba0c" + integrity sha512-dNGGjzuEzCE3d5EPZQ/QGtmlMotqnYWD/QpCZ1UuZlrMAdhG5rldh0N0haCvhGnUkSeuORS5VNROwF9Hrgn3Lg== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +eslint-plugin-json@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-json/-/eslint-plugin-json-2.1.2.tgz#5bc1c221984583c0c5ff21c488386e8263a6bbb7" + integrity sha512-isM/fsUxS4wN1+nLsWoV5T4gLgBQnsql3nMTr8u+cEls1bL8rRQO5CP5GtxJxaOfbcKqnz401styw+H/P+e78Q== + dependencies: + lodash "^4.17.19" + vscode-json-languageservice "^3.7.0" + eslint-plugin-jsx-a11y@^6.2.3: version "6.3.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz#99ef7e97f567cc6a5b8dd5ab95a94a67058a2660" @@ -2971,15 +3257,22 @@ eslint-plugin-jsx-a11y@^6.2.3: jsx-ast-utils "^2.4.1" language-tags "^1.0.5" -eslint-plugin-react-hooks@^2.3.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.1.tgz#4ef5930592588ce171abeb26f400c7fbcbc23cd0" - integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g== +eslint-plugin-prettier@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz#61e295349a65688ffac0b7808ef0a8244bdd8d40" + integrity sha512-tMTwO8iUWlSRZIwS9k7/E4vrTsfvsrcM5p1eftyuqWH25nKsz/o6/54I7jwQ/3zobISyC7wMy9ZsFwgTxOcOpQ== + dependencies: + prettier-linter-helpers "^1.0.0" -eslint-plugin-react@^7.19.0: - version "7.21.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.4.tgz#31060b2e5ff82b12e24a3cc33edb7d12f904775c" - integrity sha512-uHeQ8A0hg0ltNDXFu3qSfFqTNPXm1XithH6/SY318UX76CMj7Q599qWpgmMhVQyvhq36pm7qvoN3pb6/3jsTFg== +eslint-plugin-react-hooks@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + +eslint-plugin-react@^7.22.0: + version "7.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" + integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== dependencies: array-includes "^3.1.1" array.prototype.flatmap "^1.2.3" @@ -2990,7 +3283,7 @@ eslint-plugin-react@^7.19.0: object.fromentries "^2.0.2" object.values "^1.1.1" prop-types "^15.7.2" - resolve "^1.17.0" + resolve "^1.18.1" string.prototype.matchall "^4.0.2" eslint-scope@^4.0.3: @@ -3001,7 +3294,7 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0: +eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3016,18 +3309,23 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^2.0.0: +eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + eslint@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" @@ -3071,7 +3369,50 @@ eslint@^6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.2: +eslint@^7.9.0: + version "7.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0" + integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.19" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2, espree@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== @@ -3080,12 +3421,21 @@ espree@^6.1.2: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: +esquery@^1.0.1, esquery@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== @@ -3251,16 +3601,40 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" + integrity sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA== + dependencies: + reusify "^1.0.4" + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -3280,6 +3654,13 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + dependencies: + flat-cache "^3.0.4" + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -3338,6 +3719,13 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -3362,11 +3750,24 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" + integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -3490,6 +3891,15 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +get-intrinsic@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" + integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -3513,7 +3923,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== @@ -3549,11 +3959,30 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3655,6 +4084,11 @@ hoist-non-react-statics@^3.3.1: dependencies: react-is "^16.7.0" +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + html-to-react@^1.3.4: version "1.4.4" resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.4.tgz#dd5edb76ff28ab7fc34faabd91446bece292dc38" @@ -3773,6 +4207,11 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + immer@7.0.9: version "7.0.9" resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.9.tgz#28e7552c21d39dd76feccd2b800b7bc86ee4a62e" @@ -3786,11 +4225,24 @@ import-fresh@^3.0.0, import-fresh@^3.1.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -3935,6 +4387,13 @@ is-callable@^1.1.4, 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-core-module@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + 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" @@ -4156,6 +4615,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -4175,6 +4639,11 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" +jsonc-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + jsx-ast-utils@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" @@ -4240,6 +4709,14 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + line-column@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" @@ -4253,6 +4730,16 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -4285,6 +4772,14 @@ loader-utils@^1.2.3: emojis-list "^3.0.0" json5 "^1.0.1" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -4310,6 +4805,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= +lodash.merge@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.mergewith@4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" @@ -4325,6 +4825,19 @@ lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +loglevel-colored-level-prefix@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" + integrity sha1-akAhj9x64V/HbD0PPmdsRlOIYD4= + dependencies: + chalk "^1.1.3" + loglevel "^1.4.1" + +loglevel@^1.4.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -4332,7 +4845,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lru-cache@6.0.0: +lru-cache@6.0.0, lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== @@ -4461,6 +4974,11 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -4827,6 +5345,16 @@ normalize-html-whitespace@1.0.0: resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34" integrity sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA== +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -4945,6 +5473,19 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onchange@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/onchange/-/onchange-7.1.0.tgz#a6f0f7733e4d47014b4cd70aa1ad36c2b4cf3804" + integrity sha512-ZJcqsPiWUAUpvmnJri5TPBooqJOPmC0ttN65juhN15Q8xA+Nbg3BaxBHXQ45EistKKlKElb0edmbPWnKSBkvMg== + dependencies: + "@blakeembrey/deque" "^1.0.5" + "@blakeembrey/template" "^1.0.0" + arg "^4.1.3" + chokidar "^3.3.1" + cross-spawn "^7.0.1" + ignore "^5.1.4" + tree-kill "^1.2.2" + onetime@^5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -4964,6 +5505,18 @@ optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" @@ -4981,6 +5534,13 @@ p-limit@3.1.0: dependencies: yocto-queue "^0.1.0" +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4988,6 +5548,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -5002,6 +5569,11 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -5051,6 +5623,13 @@ parse-entities@^2.0.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + parse-json@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" @@ -5106,6 +5685,11 @@ path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -5116,6 +5700,13 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -5137,11 +5728,23 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -5296,21 +5899,59 @@ prebuild-install@^5.3.5: tunnel-agent "^0.6.0" which-pm-runs "^1.0.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prettier@2.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" - integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== +prettier-eslint@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-12.0.0.tgz#b4dab5111aad1c0dca062eb7f92a69d5fb1ac1d3" + integrity sha512-N8SGGQwAosISXTNl1E57sBbtnqUGlyRWjcfIUxyD3HF4ynehA9GZ8IfJgiep/OfYvCof/JEpy9ZqSl250Wia7A== + dependencies: + "@typescript-eslint/parser" "^3.0.0" + common-tags "^1.4.0" + dlv "^1.1.0" + eslint "^7.9.0" + indent-string "^4.0.0" + lodash.merge "^4.6.0" + loglevel-colored-level-prefix "^1.0.0" + prettier "^2.0.0" + pretty-format "^23.0.1" + require-relative "^0.8.7" + typescript "^3.9.3" + vue-eslint-parser "~7.1.0" + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" prettier@^1.x.x: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.0.0, prettier@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + +pretty-format@^23.0.1: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -5659,6 +6300,23 @@ react@^17.0.1: loose-envify "^1.1.0" object-assign "^4.1.1" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -5746,7 +6404,7 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpp@^3.0.0: +regexpp@^3.0.0, regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== @@ -5778,6 +6436,16 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -5809,6 +6477,14 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@^1.10.0, resolve@^1.13.1, resolve@^1.18.1: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + resolve@^1.12.0, resolve@^1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -5829,6 +6505,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rework-visit@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" @@ -5856,6 +6537,13 @@ rimraf@^2.5.4, rimraf@^2.6.3: dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -5869,6 +6557,11 @@ run-async@^2.4.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -5951,7 +6644,7 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -5961,6 +6654,13 @@ semver@^6.0.0, semver@^6.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.2.1: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" @@ -6057,11 +6757,23 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shell-quote@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" @@ -6110,6 +6822,11 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -6119,6 +6836,15 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -6200,6 +6926,32 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -6315,7 +7067,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.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== @@ -6399,7 +7151,7 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-json-comments@^3.0.1: +strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -6454,6 +7206,11 @@ stylis@^4.0.3: resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.3.tgz#0d714765f3f694a685550f0c45411ebf90a9bded" integrity sha512-iAxdFyR9cHKp4H5M2dJlDnvcb/3TvPprzlKjvYVbH7Sh+y8hjY/mUu/ssdcvVz6Z4lKI3vsoS0jAkMYmX7ozfA== +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -6495,6 +7252,16 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +table@^6.0.4: + version "6.0.6" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.6.tgz#e9223f1e851213e2e43ab584b0fec33fb09a8e7a" + integrity sha512-OInCtPmDNieVBkVFi6C8RwU2S2H0h8mF3e3TQK4nreaUNCpooQUkI+A/KuEkm5FawfhWIfNqG+qfelVVR+V00g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -6665,6 +7432,11 @@ traverse@0.6.6: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trough@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" @@ -6719,6 +7491,13 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -6764,6 +7543,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^3.9.3: + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + typescript@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.3.tgz#153bbd468ef07725c1df9c77e8b453f8d36abba5" @@ -6946,6 +7730,14 @@ 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== +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" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -6974,6 +7766,49 @@ vm-browserify@1.1.2, vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vscode-json-languageservice@^3.7.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.11.0.tgz#ad574b36c4346bd7830f1d34b5a5213d3af8d232" + integrity sha512-QxI+qV97uD7HHOCjh3MrM1TfbdwmTXrMckri5Tus1/FQiG3baDZb2C9Y0y8QThs7PwHYBIQXcAc59ZveCRZKPA== + dependencies: + jsonc-parser "^3.0.0" + vscode-languageserver-textdocument "^1.0.1" + vscode-languageserver-types "3.16.0-next.2" + vscode-nls "^5.0.0" + vscode-uri "^2.1.2" + +vscode-languageserver-textdocument@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f" + integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA== + +vscode-languageserver-types@3.16.0-next.2: + version "3.16.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083" + integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q== + +vscode-nls@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" + integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA== + +vscode-uri@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" + integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== + +vue-eslint-parser@~7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz#c43c1c715ff50778b9a7e9a4e16921185f3425d3" + integrity sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA== + dependencies: + debug "^4.1.1" + eslint-scope "^5.0.0" + eslint-visitor-keys "^1.1.0" + espree "^6.2.1" + esquery "^1.0.1" + lodash "^4.17.15" + warning@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" @@ -7070,6 +7905,13 @@ which@^1.2.9: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -7077,7 +7919,7 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==