From 99d135cc31e6239032c1118fbcafb04b7b65af12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Gangloff?= Date: Mon, 30 Dec 2024 23:50:15 +0100 Subject: [PATCH] feat: add eslint linter --- .github/workflows/symfony.yml | 7 +- assets/App.tsx | 206 +-- assets/components/LoginForm.tsx | 105 +- assets/components/RegisterForm.tsx | 85 +- assets/components/Sider.tsx | 69 +- assets/components/search/DomainDiagram.tsx | 57 +- .../search/DomainLifecycleSteps.tsx | 33 +- assets/components/search/DomainResult.tsx | 204 +-- assets/components/search/DomainSearchBar.tsx | 72 +- assets/components/search/EntitiesList.tsx | 68 +- assets/components/search/EventTimeline.tsx | 84 +- assets/components/tracking/DomainToTag.tsx | 46 +- assets/components/tracking/StatusToTag.tsx | 17 + .../tracking/connector/ConnectorForm.tsx | 462 ++--- .../tracking/connector/ConnectorsList.tsx | 65 +- .../watchlist/CalendarWatchlistButton.tsx | 40 +- .../watchlist/DeleteWatchlistButton.tsx | 38 +- .../tracking/watchlist/TrackedDomainTable.tsx | 167 +- .../watchlist/UpdateWatchlistButton.tsx | 103 +- .../tracking/watchlist/WatchlistCard.tsx | 146 +- .../tracking/watchlist/WatchlistForm.tsx | 431 ++--- .../tracking/watchlist/WatchlistsList.tsx | 42 +- .../diagram/ViewDiagramWatchlistButton.tsx | 117 +- .../watchlist/diagram/getLayoutedElements.tsx | 39 +- .../watchlist/diagram/watchlistToEdges.tsx | 21 +- .../watchlist/diagram/watchlistToNodes.tsx | 26 +- assets/declaration.d.ts | 6 +- assets/hooks/useBreakpoint.tsx | 10 +- assets/index.tsx | 16 +- assets/pages/LoginPage.tsx | 59 +- assets/pages/NotFoundPage.tsx | 19 +- assets/pages/StatisticsPage.tsx | 206 +-- assets/pages/TextPage.tsx | 32 +- assets/pages/UserPage.tsx | 35 +- assets/pages/search/DomainSearchPage.tsx | 46 +- assets/pages/search/EntitySearchPage.tsx | 12 +- assets/pages/search/NameserverSearchPage.tsx | 12 +- assets/pages/search/TldPage.tsx | 206 +-- assets/pages/tracking/ConnectorPage.tsx | 47 +- assets/pages/tracking/TrackedDomainPage.tsx | 6 +- assets/pages/tracking/WatchlistPage.tsx | 80 +- assets/utils/api/connectors.ts | 16 +- assets/utils/api/domain.ts | 3 +- assets/utils/api/index.ts | 46 +- assets/utils/api/tld.ts | 18 +- assets/utils/api/user.ts | 6 +- assets/utils/api/watchlist.ts | 20 +- assets/utils/functions/actionToColor.tsx | 28 +- assets/utils/functions/actionToIcon.tsx | 45 +- assets/utils/functions/entityToName.tsx | 6 +- .../utils/functions/eppStatusCodeToColor.tsx | 11 +- .../functions/extractDetailsFromJCard.tsx | 8 +- assets/utils/functions/getCountryCode.tsx | 2 +- assets/utils/functions/rdapTranslation.ts | 28 +- assets/utils/functions/roleToAvatar.tsx | 34 +- assets/utils/functions/rolesToColor.tsx | 17 +- assets/utils/functions/showErrorAPI.tsx | 9 +- assets/utils/functions/sortDomainEntities.tsx | 15 +- assets/utils/functions/tldToEmoji.tsx | 4 +- assets/utils/providers/index.tsx | 47 +- assets/utils/providers/ovh.tsx | 6 +- eslint.config.mjs | 29 + package.json | 5 + yarn.lock | 1480 ++++++++++++++++- 64 files changed, 3579 insertions(+), 1846 deletions(-) create mode 100644 assets/components/tracking/StatusToTag.tsx create mode 100644 eslint.config.mjs diff --git a/.github/workflows/symfony.yml b/.github/workflows/symfony.yml index 5f7c449..c86b3b8 100644 --- a/.github/workflows/symfony.yml +++ b/.github/workflows/symfony.yml @@ -23,10 +23,15 @@ jobs: extensions: mbstring, xml, intl, curl, iconv, pdo_pgsql, sodium, zip, http - name: Install dependencies - run: composer install --prefer-dist --no-progress --no-suggest --optimize-autoloader + run: > + composer install --prefer-dist --no-progress --no-suggest --optimize-autoloader + yarn install - name: Run PHP-CS-Fixer run: vendor/bin/php-cs-fixer fix --dry-run --diff - name: Run PHPStan run: vendor/bin/phpstan analyse + + - name: Run ESLint + run: yarn run eslint diff --git a/assets/App.tsx b/assets/App.tsx index aabef41..890b5c7 100644 --- a/assets/App.tsx +++ b/assets/App.tsx @@ -1,23 +1,23 @@ -import {Button, ConfigProvider, FloatButton, Layout, Space, theme, Tooltip, Typography} from "antd"; -import {Link, Navigate, Route, Routes, useLocation, useNavigate} from "react-router-dom"; -import TextPage from "./pages/TextPage"; -import DomainSearchPage from "./pages/search/DomainSearchPage"; -import EntitySearchPage from "./pages/search/EntitySearchPage"; -import NameserverSearchPage from "./pages/search/NameserverSearchPage"; -import TldPage from "./pages/search/TldPage"; -import StatisticsPage from "./pages/StatisticsPage"; -import WatchlistPage from "./pages/tracking/WatchlistPage"; -import UserPage from "./pages/UserPage"; -import React, {useCallback, useEffect, useMemo, useState} from "react"; -import {getUser} from "./utils/api"; -import LoginPage, {AuthenticatedContext} from "./pages/LoginPage"; -import ConnectorPage from "./pages/tracking/ConnectorPage"; -import NotFoundPage from "./pages/NotFoundPage"; -import useBreakpoint from "./hooks/useBreakpoint"; -import {Sider} from "./components/Sider"; -import {jt, t} from "ttag"; +import {Button, ConfigProvider, FloatButton, Layout, Space, theme, Tooltip, Typography} from 'antd' +import {Link, Navigate, Route, Routes, useLocation, useNavigate} from 'react-router-dom' +import TextPage from './pages/TextPage' +import DomainSearchPage from './pages/search/DomainSearchPage' +import EntitySearchPage from './pages/search/EntitySearchPage' +import NameserverSearchPage from './pages/search/NameserverSearchPage' +import TldPage from './pages/search/TldPage' +import StatisticsPage from './pages/StatisticsPage' +import WatchlistPage from './pages/tracking/WatchlistPage' +import UserPage from './pages/UserPage' +import React, {useCallback, useEffect, useMemo, useState} from 'react' +import {getUser} from './utils/api' +import LoginPage, {AuthenticatedContext} from './pages/LoginPage' +import ConnectorPage from './pages/tracking/ConnectorPage' +import NotFoundPage from './pages/NotFoundPage' +import useBreakpoint from './hooks/useBreakpoint' +import {Sider} from './components/Sider' +import {jt, t} from 'ttag' import {BugOutlined, InfoCircleOutlined, MergeOutlined} from '@ant-design/icons' -import TrackedDomainPage from "./pages/tracking/TrackedDomainPage"; +import TrackedDomainPage from './pages/tracking/TrackedDomainPage' const PROJECT_LINK = 'https://github.com/maelgangloff/domain-watchdog' const LICENSE_LINK = 'https://www.gnu.org/licenses/agpl-3.0.txt' @@ -25,35 +25,33 @@ const LICENSE_LINK = 'https://www.gnu.org/licenses/agpl-3.0.txt' const ProjectLink = Domain Watchdog const LicenseLink = AGPL-3.0-or-later -export default function App() { - +export default function App(): React.ReactElement { const navigate = useNavigate() const location = useLocation() const sm = useBreakpoint('sm') - const [isAuthenticated, setIsAuthenticated] = useState(false) const authenticated = useCallback((authenticated: boolean) => { setIsAuthenticated(authenticated) - }, []); + }, []) const contextValue = useMemo(() => ({ authenticated, setIsAuthenticated }), [authenticated, setIsAuthenticated]) - const [darkMode, setDarkMode] = useState(false); + const [darkMode, setDarkMode] = useState(false) - const windowQuery = window.matchMedia("(prefers-color-scheme:dark)"); + const windowQuery = window.matchMedia('(prefers-color-scheme:dark)') const darkModeChange = useCallback((event: MediaQueryListEvent) => { setDarkMode(event.matches) }, []) useEffect(() => { - windowQuery.addEventListener("change", darkModeChange) + windowQuery.addEventListener('change', darkModeChange) return () => { - windowQuery.removeEventListener("change", darkModeChange) + windowQuery.removeEventListener('change', darkModeChange) } }, [windowQuery, darkModeChange]) @@ -69,83 +67,91 @@ export default function App() { }) }, []) + return ( + + + + {/* Ant will use a break-off tab to toggle the collapse of the sider when collapseWidth = 0 */} + + + + + + +
+ + }/> + }/> - return - - - {/* Ant will use a break-off tab to toggle the collapse of the sider when collapseWidth = 0*/} - - - - - - -
- - }/> - }/> + }/> + }/> + }/> + }/> + }/> - }/> - }/> - }/> - }/> - }/> + }/> + }/> + }/> - }/> - }/> - }/> + }/> + }/> - }/> - }/> + }/> + }/> + }/> - }/> - }/> - }/> + }/> - }/> - - }/> - -
-
- - - - - - - - - {jt`${ProjectLink} is an open source project distributed under the ${LicenseLink} license.`} - - + }/> +
+
+
+ + + + + + + + + + + {jt`${ProjectLink} is an open source project distributed under the ${LicenseLink} license.`} + + +
+ } + > + + } target='_blank' href={PROJECT_LINK}/> + + + } target='_blank' href={PROJECT_LINK + '/issues'}/> + +
- } - > - - } target='_blank' href={PROJECT_LINK}/> - - - } target='_blank' href={PROJECT_LINK + '/issues'}/> - - - -
-
-} \ No newline at end of file + + + ) +} diff --git a/assets/components/LoginForm.tsx b/assets/components/LoginForm.tsx index 036634c..c0e1b4f 100644 --- a/assets/components/LoginForm.tsx +++ b/assets/components/LoginForm.tsx @@ -1,34 +1,29 @@ -import {Button, Form, Input, message, Space} from "antd"; -import {t} from "ttag"; -import React, {useContext, useEffect} from "react"; -import {getUser, login} from "../utils/api"; -import {AuthenticatedContext} from "../pages/LoginPage"; -import {useNavigate} from "react-router-dom"; +import {Button, Form, Input, message, Space} from 'antd' +import {t} from 'ttag' +import React, {useContext, useEffect} from 'react' +import {getUser, login} from '../utils/api' +import {AuthenticatedContext} from '../pages/LoginPage' +import {useNavigate} from 'react-router-dom' -import {showErrorAPI} from "../utils/functions/showErrorAPI"; +import {showErrorAPI} from '../utils/functions/showErrorAPI' - -type FieldType = { - username: string; - password: string; +interface FieldType { + username: string + password: string } export function LoginForm({ssoLogin}: { ssoLogin?: boolean }) { - const navigate = useNavigate() const [messageApi, contextHolder] = message.useMessage() const {setIsAuthenticated} = useContext(AuthenticatedContext) - useEffect(() => { getUser().then(() => { setIsAuthenticated(true) navigate('/home') }) - }, []) - const onFinish = (data: FieldType) => { login(data.username, data.password).then(() => { setIsAuthenticated(true) @@ -38,44 +33,46 @@ export function LoginForm({ssoLogin}: { ssoLogin?: boolean }) { showErrorAPI(e, messageApi) }) } - return <> - {contextHolder} -
- + {contextHolder} + - - - - - label={t`Password`} - name="password" - rules={[{required: true, message: t`Required`}]} - > - - - - - - + + - {ssoLogin && - - } - - - -} \ No newline at end of file + + + label={t`Password`} + name='password' + rules={[{required: true, message: t`Required`}]} + > + + + + + + + + {ssoLogin && + + } + + + + ) +} diff --git a/assets/components/RegisterForm.tsx b/assets/components/RegisterForm.tsx index 9035035..23044ea 100644 --- a/assets/components/RegisterForm.tsx +++ b/assets/components/RegisterForm.tsx @@ -1,20 +1,17 @@ -import {Button, Form, Input, message} from "antd"; -import {t} from "ttag"; -import React, {useState} from "react"; -import {register} from "../utils/api"; -import {useNavigate} from "react-router-dom"; +import {Button, Form, Input, message} from 'antd' +import {t} from 'ttag' +import React from 'react' +import {register} from '../utils/api' +import {useNavigate} from 'react-router-dom' -import {showErrorAPI} from "../utils/functions/showErrorAPI"; +import {showErrorAPI} from '../utils/functions/showErrorAPI' - -type FieldType = { - username: string; - password: string; +interface FieldType { + username: string + password: string } export function RegisterForm() { - - const [error, setError] = useState() const navigate = useNavigate() const [messageApi, contextHolder] = message.useMessage() @@ -25,37 +22,39 @@ export function RegisterForm() { showErrorAPI(e, messageApi) }) } - return <> - {contextHolder} -
- + {contextHolder} + - - + + + - - label={t`Password`} - name="password" - rules={[{required: true, message: t`Required`}]} - > - - + + label={t`Password`} + name='password' + rules={[{required: true, message: t`Required`}]} + > + + - - - - - -} \ No newline at end of file + + + + + + ) +} diff --git a/assets/components/Sider.tsx b/assets/components/Sider.tsx index 6d21041..8ea0b6c 100644 --- a/assets/components/Sider.tsx +++ b/assets/components/Sider.tsx @@ -1,5 +1,5 @@ -import {ItemType} from "antd/lib/menu/interface"; -import {t} from "ttag"; +import {ItemType} from 'antd/lib/menu/interface' +import {t} from 'ttag' import { AimOutlined, ApiOutlined, @@ -13,10 +13,10 @@ import { SearchOutlined, TableOutlined, UserOutlined -} from "@ant-design/icons"; -import {Menu} from "antd"; -import React from "react"; -import {useLocation, useNavigate} from "react-router-dom"; +} from '@ant-design/icons' +import {Menu} from 'antd' +import React from 'react' +import {useLocation, useNavigate} from 'react-router-dom' export function Sider({isAuthenticated}: { isAuthenticated: boolean }) { const navigate = useNavigate() @@ -49,25 +49,25 @@ export function Sider({isAuthenticated}: { isAuthenticated: boolean }) { title: t`TLD list`, disabled: !isAuthenticated, onClick: () => navigate('/search/tld') - }, - /* - { - key: 'entity-finder', - icon: , - label: t`Entity`, - title: t`Entity Finder`, - disabled: true, - onClick: () => navigate('/search/entity') - }, - { - key: 'ns-finder', - icon: , - label: t`Nameserver`, - title: t`Nameserver Finder`, - disabled: true, - onClick: () => navigate('/search/nameserver') } - */ + /* + { + key: 'entity-finder', + icon: , + label: t`Entity`, + title: t`Entity Finder`, + disabled: true, + onClick: () => navigate('/search/entity') + }, + { + key: 'ns-finder', + icon: , + label: t`Nameserver`, + title: t`Nameserver Finder`, + disabled: true, + onClick: () => navigate('/search/nameserver') + } + */ ] }, { @@ -118,7 +118,7 @@ export function Sider({isAuthenticated}: { isAuthenticated: boolean }) { icon: , label: t`Log out`, danger: true, - onClick: () => window.location.replace("/logout") + onClick: () => window.location.replace('/logout') }]) } else { menuItems.push({ @@ -129,12 +129,13 @@ export function Sider({isAuthenticated}: { isAuthenticated: boolean }) { }) } - return - -} \ No newline at end of file + return ( + + ) +} diff --git a/assets/components/search/DomainDiagram.tsx b/assets/components/search/DomainDiagram.tsx index 21442fb..ec79951 100644 --- a/assets/components/search/DomainDiagram.tsx +++ b/assets/components/search/DomainDiagram.tsx @@ -1,15 +1,14 @@ -import React, {useEffect} from "react"; -import {Background, Controls, MiniMap, ReactFlow, useEdgesState, useNodesState} from "@xyflow/react"; -import {Flex} from "antd"; -import {Domain} from "../../utils/api"; -import {getLayoutedElements} from "../tracking/watchlist/diagram/getLayoutedElements"; -import {domainEntitiesToNode, domainToNode, nsToNode, tldToNode} from "../tracking/watchlist/diagram/watchlistToNodes"; -import {domainEntitiesToEdges, domainNSToEdges, tldToEdge} from "../tracking/watchlist/diagram/watchlistToEdges"; +import React, {useEffect} from 'react' +import {Background, Controls, Edge, MiniMap, Node, ReactFlow, useEdgesState, useNodesState} from '@xyflow/react' +import {Flex} from 'antd' +import {Domain} from '../../utils/api' +import {getLayoutedElements} from '../tracking/watchlist/diagram/getLayoutedElements' +import {domainEntitiesToNode, domainToNode, nsToNode, tldToNode} from '../tracking/watchlist/diagram/watchlistToNodes' +import {domainEntitiesToEdges, domainNSToEdges, tldToEdge} from '../tracking/watchlist/diagram/watchlistToEdges' export function DomainDiagram({domain}: { domain: Domain }) { - const [nodes, setNodes, onNodesChange] = useNodesState([]) - const [edges, setEdges, onEdgesChange] = useEdgesState([]) - + const [nodes, setNodes, onNodesChange] = useNodesState([]) + const [edges, setEdges, onEdgesChange] = useEdgesState([]) useEffect(() => { const nodes = [ @@ -33,21 +32,23 @@ export function DomainDiagram({domain}: { domain: Domain }) { setEdges(e.edges) }, []) - return - - - - - - -} \ No newline at end of file + return ( + + + + + + + + ) +} diff --git a/assets/components/search/DomainLifecycleSteps.tsx b/assets/components/search/DomainLifecycleSteps.tsx index 7f269e0..bdd401d 100644 --- a/assets/components/search/DomainLifecycleSteps.tsx +++ b/assets/components/search/DomainLifecycleSteps.tsx @@ -1,21 +1,19 @@ -import {StepProps, Steps, Tooltip} from "antd"; -import React from "react"; -import {t} from "ttag"; +import {StepProps, Steps, Tooltip} from 'antd' +import React from 'react' +import {t} from 'ttag' import { CheckOutlined, DeleteOutlined, ExclamationCircleOutlined, FieldTimeOutlined, SignatureOutlined -} from "@ant-design/icons"; -import {rdapEventDetailTranslation, rdapStatusCodeDetailTranslation} from "../../utils/functions/rdapTranslation"; +} from '@ant-design/icons' +import {rdapEventDetailTranslation, rdapStatusCodeDetailTranslation} from '../../utils/functions/rdapTranslation' export function DomainLifecycleSteps({status}: { status: string[] }) { - const rdapEventDetailTranslated = rdapEventDetailTranslation() const rdapStatusCodeDetailTranslated = rdapStatusCodeDetailTranslation() - const steps: StepProps[] = [ { title: {t`Registration`}, @@ -26,16 +24,19 @@ export function DomainLifecycleSteps({status}: { status: string[] }) { icon: }, { - title: {t`Auto-Renew Grace Period`}, + title: {t`Auto-Renew Grace Period`}, icon: }, { title: {t`Redemption Grace Period`}, + title={rdapStatusCodeDetailTranslated['redemption period']} + >{t`Redemption Grace Period`} + , icon: }, { - title: {t`Pending Delete`}, + title: {t`Pending Delete`}, icon: } ] @@ -50,8 +51,10 @@ export function DomainLifecycleSteps({status}: { status: string[] }) { currentStep = 4 } - return -} \ No newline at end of file + return ( + + ) +} diff --git a/assets/components/search/DomainResult.tsx b/assets/components/search/DomainResult.tsx index 1c911cc..956a0e7 100644 --- a/assets/components/search/DomainResult.tsx +++ b/assets/components/search/DomainResult.tsx @@ -1,107 +1,121 @@ -import {Badge, Card, Col, Divider, Flex, Row, Space, Tag, Tooltip, Typography} from "antd"; -import {t} from "ttag"; -import {EventTimeline} from "./EventTimeline"; -import {EntitiesList} from "./EntitiesList"; -import {DomainDiagram} from "./DomainDiagram"; -import React from "react"; -import {Domain} from "../../utils/api"; -import {rdapStatusCodeDetailTranslation} from "../../utils/functions/rdapTranslation"; -import {regionNames} from "../../i18n"; +import {Badge, Card, Col, Divider, Flex, Row, Space, Tag, Tooltip, Typography} from 'antd' +import {t} from 'ttag' +import {EventTimeline} from './EventTimeline' +import {EntitiesList} from './EntitiesList' +import {DomainDiagram} from './DomainDiagram' +import React from 'react' +import {Domain} from '../../utils/api' +import {regionNames} from '../../i18n' -import {getCountryCode} from "../../utils/functions/getCountryCode"; -import {eppStatusCodeToColor} from "../../utils/functions/eppStatusCodeToColor"; -import {DomainLifecycleSteps} from "./DomainLifecycleSteps"; +import {getCountryCode} from '../../utils/functions/getCountryCode' +import {DomainLifecycleSteps} from './DomainLifecycleSteps' import {BankOutlined, KeyOutlined, SafetyCertificateOutlined} from '@ant-design/icons' +import {statusToTag} from '../tracking/StatusToTag' export function DomainResult({domain}: { domain: Domain }) { - - const rdapStatusCodeDetailTranslated = rdapStatusCodeDetailTranslation() const {tld, events} = domain const domainEvents = events.sort((e1, e2) => new Date(e2.date).getTime() - new Date(e1.date).getTime()) const clientStatus = domain.status.filter(s => s.startsWith('client')) const serverStatus = domain.status.filter(s => !clientStatus.includes(s)) - const isLocked = (type: 'client' | 'server'): boolean => - (domain.status.includes(type + ' update prohibited') && domain.status.includes(type + ' delete prohibited')) - || domain.status.includes(type + ' transfer prohibited') + const isDomainLocked = (type: 'client' | 'server'): boolean => + (domain.status.includes(type + ' update prohibited') && domain.status.includes(type + ' delete prohibited')) || + domain.status.includes(type + ' transfer prohibited') - const statusToTag = (s: string) => - {s} - + return ( + - return - - - {`${domain.tld.tld.toUpperCase()} (${tld.type})`} - - } - color={ - tld.type === 'ccTLD' ? 'purple' : - (tld.type === 'gTLD' && tld.specification13) ? "volcano" : - tld.type === 'gTLD' ? "green" - : "cyan" - }> - - - {domain.ldhName}{domain.handle && {domain.handle}} - } - size="small"> - { - domain.events.length > 0 && + + {`${domain.tld.tld.toUpperCase()} (${tld.type})`} + } - - - - - }>{t`Registry Lock`} - - - }>{t`Registrar Lock`} - - - }>{t`DNSSEC`} - - - {domain.status.length > 0 && - <> - {t`EPP Status Codes`} - - {serverStatus.map(statusToTag)} - {clientStatus.map(statusToTag)} - - - } - { - domain.events.length > 0 && <> - {t`Timeline`} - - - } - { - domain.entities.length > 0 && - <> - {t`Entities`} - - - } - - - - - - - - -} \ No newline at end of file + color={ + tld.type === 'ccTLD' + ? 'purple' + : (tld.type === 'gTLD' && tld.specification13) + ? 'volcano' + : tld.type === 'gTLD' + ? 'green' + : 'cyan' + } + > + + + {domain.ldhName}{domain.handle && {domain.handle}} + } + size='small' + > + { + domain.events.length > 0 && + } + + + + + } + >{t`Registry Lock`} + + + + } + >{t`Registrar Lock`} + + + + } + >{t`DNSSEC`} + + + + {domain.status.length > 0 && + <> + {t`EPP Status Codes`} + + {serverStatus.map(statusToTag)} + {clientStatus.map(statusToTag)} + + } + { + domain.events.length > 0 && <> + {t`Timeline`} + + + } + { + domain.entities.length > 0 && + <> + {t`Entities`} + + + } + + + + + + + + + ) +} diff --git a/assets/components/search/DomainSearchBar.tsx b/assets/components/search/DomainSearchBar.tsx index e315783..ea82e29 100644 --- a/assets/components/search/DomainSearchBar.tsx +++ b/assets/components/search/DomainSearchBar.tsx @@ -1,38 +1,44 @@ -import {Form, Input} from "antd"; -import {t} from "ttag"; -import {SearchOutlined} from "@ant-design/icons"; -import React from "react"; +import {Form, Input} from 'antd' +import {t} from 'ttag' +import {SearchOutlined} from '@ant-design/icons' +import React from 'react' -export type FieldType = { +export interface FieldType { ldhName: string } -export function DomainSearchBar({onFinish, initialValue}: { onFinish: (values: FieldType) => void, initialValue?: string }) { - return
- - name="ldhName" - initialValue={initialValue} - rules={[{ - required: true, - message: t`Required` - }, { - pattern: /^(?=.*\.)?\S*[^.\s]$/, - message: t`This domain name does not appear to be valid`, - max: 63, - min: 2 - }]} +export function DomainSearchBar({onFinish, initialValue}: { + onFinish: (values: FieldType) => void, + initialValue?: string +}) { + return ( + - } - placeholder="example.com" - autoComplete='off' - autoFocus - /> - - -} \ No newline at end of file + + name='ldhName' + initialValue={initialValue} + rules={[{ + required: true, + message: t`Required` + }, { + pattern: /^(?=.*\.)?\S*[^.\s]$/, + message: t`This domain name does not appear to be valid`, + max: 63, + min: 2 + }]} + > + } + placeholder='example.com' + autoComplete='off' + autoFocus + /> + + + ) +} diff --git a/assets/components/search/EntitiesList.tsx b/assets/components/search/EntitiesList.tsx index 705f398..86d1a3e 100644 --- a/assets/components/search/EntitiesList.tsx +++ b/assets/components/search/EntitiesList.tsx @@ -1,41 +1,45 @@ -import {List, Tag, Tooltip, Typography} from "antd"; -import React from "react"; -import {Domain} from "../../utils/api"; -import {rdapRoleDetailTranslation, rdapRoleTranslation} from "../../utils/functions/rdapTranslation"; -import {roleToAvatar} from "../../utils/functions/roleToAvatar"; -import {rolesToColor} from "../../utils/functions/rolesToColor"; -import {sortDomainEntities} from "../../utils/functions/sortDomainEntities"; -import {extractDetailsFromJCard} from "../../utils/functions/extractDetailsFromJCard"; +import {List, Tag, Tooltip, Typography} from 'antd' +import React from 'react' +import {Domain} from '../../utils/api' +import {rdapRoleDetailTranslation, rdapRoleTranslation} from '../../utils/functions/rdapTranslation' +import {roleToAvatar} from '../../utils/functions/roleToAvatar' +import {rolesToColor} from '../../utils/functions/rolesToColor' +import {sortDomainEntities} from '../../utils/functions/sortDomainEntities' +import {extractDetailsFromJCard} from '../../utils/functions/extractDetailsFromJCard' export function EntitiesList({domain}: { domain: Domain }) { const rdapRoleTranslated = rdapRoleTranslation() const rdapRoleDetailTranslated = rdapRoleDetailTranslation() const roleToTag = (r: string) => - {rdapRoleTranslated[r as keyof typeof rdapRoleTranslated] || r - } + title={rdapRoleDetailTranslated[r as keyof typeof rdapRoleDetailTranslated] || undefined} + > + {rdapRoleTranslated[r as keyof typeof rdapRoleTranslated] || r} + - return { - const details = extractDetailsFromJCard(e) + return ( + { + const details = extractDetailsFromJCard(e) - return - {e.entity.handle}} - description={<> - {details.fn &&
👤 {details.fn}
} - {details.organization &&
🏢 {details.organization}
} - } - /> - {e.roles.map(roleToTag)} -
- } - } - /> -} \ No newline at end of file + return ( + + {e.entity.handle}} + description={<> + {details.fn &&
👤 {details.fn}
} + {details.organization &&
🏢 {details.organization}
} + } + /> + {e.roles.map(roleToTag)} +
+ ) + }} + /> + ) +} diff --git a/assets/components/search/EventTimeline.tsx b/assets/components/search/EventTimeline.tsx index 2f6f30c..30ba28b 100644 --- a/assets/components/search/EventTimeline.tsx +++ b/assets/components/search/EventTimeline.tsx @@ -1,10 +1,10 @@ -import {Timeline, Tooltip, Typography} from "antd"; -import React from "react"; -import {Event} from "../../utils/api"; -import useBreakpoint from "../../hooks/useBreakpoint"; -import {rdapEventDetailTranslation, rdapEventNameTranslation} from "../../utils/functions/rdapTranslation"; -import {actionToColor} from "../../utils/functions/actionToColor"; -import {actionToIcon} from "../../utils/functions/actionToIcon"; +import {Timeline, Tooltip, Typography} from 'antd' +import React from 'react' +import {Event} from '../../utils/api' +import useBreakpoint from '../../hooks/useBreakpoint' +import {rdapEventDetailTranslation, rdapEventNameTranslation} from '../../utils/functions/rdapTranslation' +import {actionToColor} from '../../utils/functions/actionToColor' +import {actionToIcon} from '../../utils/functions/actionToIcon' export function EventTimeline({events}: { events: Event[] }) { const sm = useBreakpoint('sm') @@ -13,38 +13,46 @@ export function EventTimeline({events}: { events: Event[] }) { const rdapEventNameTranslated = rdapEventNameTranslation() const rdapEventDetailTranslated = rdapEventDetailTranslation() - return <> - { - const eventName = - {rdapEventNameTranslated[e.action as keyof typeof rdapEventNameTranslated] || e.action} - + return ( + <> + { + const eventName = ( + + {rdapEventNameTranslated[e.action as keyof typeof rdapEventNameTranslated] || e.action} + + ) - const dateStr = {new Date(e.date).toLocaleString(locale)} - + const dateStr = ( + {new Date(e.date).toLocaleString(locale)} + + ) - const eventDetail = rdapEventDetailTranslated[e.action as keyof typeof rdapEventDetailTranslated] || undefined + const eventDetail = rdapEventDetailTranslated[e.action as keyof typeof rdapEventDetailTranslated] || undefined - const text = sm ? { - children: - {eventName} {dateStr} - - } : { - label: dateStr, - children: {eventName}, + const text = sm + ? { + children: + {eventName} {dateStr} + + } + : { + label: dateStr, + children: {eventName} + } + + return { + color: e.deleted ? 'grey' : actionToColor(e.action), + dot: actionToIcon(e.action), + pending: new Date(e.date).getTime() > new Date().getTime(), + ...text + } } - - return { - color: e.deleted ? 'grey' : actionToColor(e.action), - dot: actionToIcon(e.action), - pending: new Date(e.date).getTime() > new Date().getTime(), - ...text - } - } - ) - } - /> - -} \ No newline at end of file + )} + /> + + ) +} diff --git a/assets/components/tracking/DomainToTag.tsx b/assets/components/tracking/DomainToTag.tsx index a8e94f7..d77114e 100644 --- a/assets/components/tracking/DomainToTag.tsx +++ b/assets/components/tracking/DomainToTag.tsx @@ -1,21 +1,29 @@ -import {Tag} from "antd"; -import {DeleteOutlined, ExclamationCircleOutlined} from "@ant-design/icons"; -import punycode from "punycode/punycode"; -import {Link} from "react-router-dom"; -import React from "react"; +import {Tag} from 'antd' +import {DeleteOutlined, ExclamationCircleOutlined} from '@ant-design/icons' +import punycode from 'punycode/punycode' +import {Link} from 'react-router-dom' +import React from 'react' export function DomainToTag({domain}: { domain: { ldhName: string, deleted: boolean, status: string[] } }) { - return - : - domain.status.includes('redemption period') ? : - domain.status.includes('pending delete') ? : null - }>{punycode.toUnicode(domain.ldhName)} - -} \ No newline at end of file + return ( + + + : domain.status.includes('redemption period') + ? + : domain.status.includes('pending delete') ? : null + } + >{punycode.toUnicode(domain.ldhName)} + + + ) +} diff --git a/assets/components/tracking/StatusToTag.tsx b/assets/components/tracking/StatusToTag.tsx new file mode 100644 index 0000000..4b5b295 --- /dev/null +++ b/assets/components/tracking/StatusToTag.tsx @@ -0,0 +1,17 @@ +import {Tag, Tooltip} from 'antd' +import {eppStatusCodeToColor} from '../../utils/functions/eppStatusCodeToColor' +import React from 'react' +import {rdapStatusCodeDetailTranslation} from '../../utils/functions/rdapTranslation' + +export function statusToTag(s: string) { + const rdapStatusCodeDetailTranslated = rdapStatusCodeDetailTranslation() + + return ( + + {s} + + ) +} diff --git a/assets/components/tracking/connector/ConnectorForm.tsx b/assets/components/tracking/connector/ConnectorForm.tsx index f5a914f..ede2d12 100644 --- a/assets/components/tracking/connector/ConnectorForm.tsx +++ b/assets/components/tracking/connector/ConnectorForm.tsx @@ -1,21 +1,21 @@ -import {Alert, Button, Checkbox, Form, FormInstance, Input, Popconfirm, Select, Space, Typography} from "antd"; -import React, {useState} from "react"; -import {Connector, ConnectorProvider} from "../../../utils/api/connectors"; -import {t} from "ttag"; -import {BankOutlined} from "@ant-design/icons"; +import {Alert, Button, Checkbox, Form, FormInstance, Input, Popconfirm, Select, Space, Typography} from 'antd' +import React, {useState} from 'react' +import {Connector, ConnectorProvider} from '../../../utils/api/connectors' +import {t} from 'ttag' +import {BankOutlined} from '@ant-design/icons' import { ovhEndpointList as ovhEndpointListFunction, ovhFields as ovhFieldsFunction, ovhPricingMode as ovhPricingModeFunction, ovhSubsidiaryList as ovhSubsidiaryListFunction -} from "../../../utils/providers/ovh"; -import {helpGetTokenLink, tosHyperlink} from "../../../utils/providers"; +} from '../../../utils/providers/ovh' +import {helpGetTokenLink, tosHyperlink} from '../../../utils/providers' const formItemLayoutWithOutLabel = { wrapperCol: { xs: {span: 24, offset: 0}, - sm: {span: 20, offset: 4}, - }, + sm: {span: 20, offset: 4} + } } export function ConnectorForm({form, onCreate}: { form: FormInstance, onCreate: (values: Connector) => void }) { @@ -27,229 +27,257 @@ export function ConnectorForm({form, onCreate}: { form: FormInstance, onCreate: const [open, setOpen] = useState(false) const [ovhPricingModeValue, setOvhPricingModeValue] = useState() - - return
- - } + options={Object.keys(ConnectorProvider).map((c) => ({ + value: ConnectorProvider[c as keyof typeof ConnectorProvider], + label: ( + <> + {' '} {c} + + ) + }))} + value={provider} + onChange={setProvider} + autoFocus + /> + - { - provider === ConnectorProvider.OVH && <> - { - Object.keys(ovhFields).map(fieldName => + { + Object.keys(ovhFields).map(fieldName => + + ) + } + - - ) - } - - - - - - { - form.resetFields(['authData']) - setOvhPricingModeValue(undefined) - setOpen(false) - }} - onConfirm={() => setOpen(false)} - open={open} + + + + + { + form.resetFields(['authData']) + setOvhPricingModeValue(undefined) + setOpen(false) + }} + onConfirm={() => setOpen(false)} + open={open} + > + - - {t`It indicates the organization that will pay for the ordered product`}} - required={false}> - - - - } - { - provider === ConnectorProvider.AUTODNS && <> - -
- {t`Attention: AutoDNS do not support 2-Factor Authentication on API Users for automated systems`}} - rules={[{required: true, message: t`Required`}]}> - - - - - - {t`The nic-handle of the domain name owner`}{t`You can get it from this page`}} - rules={[{required: true, message: t`Required`}]} - required={true}> - - + }} + /> + +
+ + } + { + provider === ConnectorProvider.GANDI && <> + + + + {t`It indicates the organization that will pay for the ordered product`} + } + required={false} + > + + + + } + { + provider === ConnectorProvider.AUTODNS && <> + +
+ {t`Attention: AutoDNS do not support 2-Factor Authentication on API Users for automated systems`} + } + rules={[{required: true, message: t`Required`}]} + > + + + + + + {t`The nic-handle of the domain name owner`}{t`You can get it from this page`} + + } + rules={[{required: true, message: t`Required`}]} + required + > + + - {t`If you not sure, use the default value 4`}} + {t`If you not sure, use the default value 4`} + } - required={false}> - - + required={false} + > + + - - {t`Owner confirms his consent of domain order jobs`} - - + rules={[{required: true, message: t`Required`}]} + > + {t`Owner confirms his consent of domain order jobs`} + + + - } - { - provider === ConnectorProvider.NAMECHEAP && <> - - - - - - - - } + } + { + provider === ConnectorProvider.NAMECHEAP && <> + + + + + + + + } - { - provider !== undefined && <> - - - - {t`I have read and accepted the conditions of use of the Provider API, accessible from this hyperlink`} - - - - - {t`I am of the minimum age required to consent to these conditions`} - - - {t`I waive my right of withdrawal regarding the purchase of domain names via the Provider's API`} - - - } + { + provider !== undefined && <> + + + + {t`I have read and accepted the conditions of use of the Provider API, accessible from this hyperlink`} + + + + + {t`I am of the minimum age required to consent to these conditions`} + + + + {t`I waive my right of withdrawal regarding the purchase of domain names via the Provider's API`} + + + + } - - - - - - - -} \ No newline at end of file + + + + + + + + ) +} diff --git a/assets/components/tracking/connector/ConnectorsList.tsx b/assets/components/tracking/connector/ConnectorsList.tsx index 24671ed..ba98160 100644 --- a/assets/components/tracking/connector/ConnectorsList.tsx +++ b/assets/components/tracking/connector/ConnectorsList.tsx @@ -1,11 +1,10 @@ -import {Card, Divider, message, Popconfirm, theme, Typography} from "antd"; -import {t} from "ttag"; -import {DeleteFilled} from "@ant-design/icons"; -import React from "react"; -import {Connector, deleteConnector} from "../../../utils/api/connectors"; - -const {useToken} = theme; +import {Card, Divider, message, Popconfirm, theme, Typography} from 'antd' +import {t} from 'ttag' +import {DeleteFilled} from '@ant-design/icons' +import React from 'react' +import {Connector, deleteConnector} from '../../../utils/api/connectors' +const {useToken} = theme export type ConnectorElement = Connector & { id: string, createdAt: string } @@ -13,28 +12,36 @@ export function ConnectorsList({connectors, onDelete}: { connectors: ConnectorEl const {token} = useToken() const [messageApi, contextHolder] = message.useMessage() - const onConnectorDelete = (connector: ConnectorElement) => deleteConnector(connector.id) + const onConnectorDelete = async (connector: ConnectorElement) => await deleteConnector(connector.id) .then(onDelete) .catch(() => messageApi.error(t`An error occurred while deleting the Connector. Make sure it is not used in any Watchlist`)) - return <> - {connectors.map(connector => - <> - {contextHolder} - {t`Connector ${connector.provider}`}} - size='small' - style={{width: '100%'}} - extra={ onConnectorDelete(connector)} - okText={t`Yes`} - cancelText={t`No`} - >}> - - - - - )} - -} \ No newline at end of file + return ( + <> + {connectors.map(connector => + <> + {contextHolder} + {t`Connector ${connector.provider}`} + } + size='small' + style={{width: '100%'}} + extra={ await onConnectorDelete(connector)} + okText={t`Yes`} + cancelText={t`No`} + > + } + > + + + + + )} + + ) +} diff --git a/assets/components/tracking/watchlist/CalendarWatchlistButton.tsx b/assets/components/tracking/watchlist/CalendarWatchlistButton.tsx index 9e541bf..9957cdf 100644 --- a/assets/components/tracking/watchlist/CalendarWatchlistButton.tsx +++ b/assets/components/tracking/watchlist/CalendarWatchlistButton.tsx @@ -1,22 +1,26 @@ -import {CalendarFilled} from "@ant-design/icons"; -import {t} from "ttag"; -import {Popover, QRCode, Typography} from "antd"; -import React from "react"; -import {Watchlist} from "../../../pages/tracking/WatchlistPage"; +import {CalendarFilled} from '@ant-design/icons' +import {t} from 'ttag' +import {Popover, QRCode, Typography} from 'antd' +import React from 'react' +import {Watchlist} from '../../../utils/api' export function CalendarWatchlistButton({watchlist}: { watchlist: Watchlist }) { - const icsResourceLink = `${window.location.origin}/api/watchlists/${watchlist.token}/calendar` - return - }> - - - -} \ No newline at end of file + return ( + + } + > + + + + ) +} diff --git a/assets/components/tracking/watchlist/DeleteWatchlistButton.tsx b/assets/components/tracking/watchlist/DeleteWatchlistButton.tsx index f8ba3bb..9fb3856 100644 --- a/assets/components/tracking/watchlist/DeleteWatchlistButton.tsx +++ b/assets/components/tracking/watchlist/DeleteWatchlistButton.tsx @@ -1,22 +1,24 @@ -import {Popconfirm, theme, Typography} from "antd"; -import {t} from "ttag"; -import {deleteWatchlist} from "../../../utils/api"; -import {DeleteFilled} from "@ant-design/icons"; -import React from "react"; -import {Watchlist} from "../../../pages/tracking/WatchlistPage"; +import {Popconfirm, theme, Typography} from 'antd' +import {t} from 'ttag' +import {deleteWatchlist, Watchlist} from '../../../utils/api' +import {DeleteFilled} from '@ant-design/icons' +import React from 'react' export function DeleteWatchlistButton({watchlist, onDelete}: { watchlist: Watchlist, onDelete: () => void }) { const {token} = theme.useToken() - return deleteWatchlist(watchlist.token).then(onDelete)} - okText={t`Yes`} - cancelText={t`No`} - okButtonProps={{danger: true}}> - - - - -} \ No newline at end of file + return ( + await deleteWatchlist(watchlist.token).then(onDelete)} + okText={t`Yes`} + cancelText={t`No`} + okButtonProps={{danger: true}} + > + + + + + ) +} diff --git a/assets/components/tracking/watchlist/TrackedDomainTable.tsx b/assets/components/tracking/watchlist/TrackedDomainTable.tsx index 081c8fe..969314a 100644 --- a/assets/components/tracking/watchlist/TrackedDomainTable.tsx +++ b/assets/components/tracking/watchlist/TrackedDomainTable.tsx @@ -1,27 +1,41 @@ -import React, {ReactElement, useEffect, useState} from "react"; -import {Domain, getTrackedDomainList} from "../../../utils/api"; -import {Button, Empty, Result, Skeleton, Table, Tag, Tooltip} from "antd"; -import {t} from "ttag"; -import {ColumnType} from "antd/es/table"; -import {rdapStatusCodeDetailTranslation} from "../../../utils/functions/rdapTranslation"; -import {eppStatusCodeToColor} from "../../../utils/functions/eppStatusCodeToColor"; -import {Link} from "react-router-dom"; +import React, {ReactElement, useEffect, useState} from 'react' +import {Domain, getTrackedDomainList} from '../../../utils/api' +import {Button, Empty, Result, Skeleton, Table, Tag, Tooltip} from 'antd' +import {t} from 'ttag' +import {ColumnType} from 'antd/es/table' +import {rdapStatusCodeDetailTranslation} from '../../../utils/functions/rdapTranslation' +import {eppStatusCodeToColor} from '../../../utils/functions/eppStatusCodeToColor' +import {Link} from 'react-router-dom' import {ExceptionOutlined, MonitorOutlined} from '@ant-design/icons' -import {DomainToTag} from "../DomainToTag"; - +import {DomainToTag} from '../DomainToTag' export function TrackedDomainTable() { - const REDEMPTION_NOTICE = - redemption period - + const REDEMPTION_NOTICE = ( + + redemption period + + ) - const PENDING_DELETE_NOTICE = - pending delete - + const PENDING_DELETE_NOTICE = ( + + pending delete + + ) - const [dataTable, setDataTable] = useState<(Domain & { domain: Domain })[]>([]) + interface TableRow { + key: string + ldhName: ReactElement + expirationDate: string + status: ReactElement[] + updatedAt: string + domain: Domain + } + + const [dataTable, setDataTable] = useState([]) const [total, setTotal] = useState() const [specialNotice, setSpecialNotice] = useState([]) @@ -46,8 +60,10 @@ export function TrackedDomainTable() { ldhName: , expirationDate: expirationDate ? new Date(expirationDate).toLocaleString() : '-', status: d.status.map(s => + title={rdapStatusCodeDetailTranslated[s as keyof typeof rdapStatusCodeDetailTranslated] || undefined} + > {s} ), @@ -63,17 +79,19 @@ export function TrackedDomainTable() { fetchData({page: 1, itemsPerPage: 30}) }, []) + interface RecordType { + domain: Domain + } - const columns: ColumnType[] = [ + const columns: Array> = [ { title: t`Domain`, - dataIndex: "ldhName" + dataIndex: 'ldhName' }, { title: t`Expiration date`, dataIndex: 'expirationDate', - sorter: (a: { domain: Domain }, b: { domain: Domain }) => { - + sorter: (a: RecordType, b: RecordType) => { const expirationDate1 = a.domain.events.find(e => e.action === 'expiration' && !e.deleted)?.date const expirationDate2 = b.domain.events.find(e => e.action === 'expiration' && !e.deleted)?.date @@ -85,65 +103,70 @@ export function TrackedDomainTable() { { title: t`Updated at`, dataIndex: 'updatedAt', - sorter: (a: { domain: Domain }, b: { - domain: Domain - }) => new Date(a.domain.updatedAt).getTime() - new Date(b.domain.updatedAt).getTime() + sorter: (a: RecordType, b: RecordType) => new Date(a.domain.updatedAt).getTime() - new Date(b.domain.updatedAt).getTime() }, { title: t`Status`, dataIndex: 'status', showSorterTooltip: {target: 'full-header'}, - filters: [...new Set(dataTable.map((d: any) => d.domain.status).flat())].map(s => ({ + filters: [...new Set(dataTable.map((d: RecordType) => d.domain.status).flat())].map(s => ({ text: + title={rdapStatusCodeDetailTranslated[s as keyof typeof rdapStatusCodeDetailTranslated] || undefined} + > {s} , - value: s, + value: s })), - onFilter: (value, record: { domain: Domain }) => record.domain.status.includes(value as string) + onFilter: (value, record: RecordType) => record.domain.status.includes(value as string) } ] - return <> - { - total === 0 ? - - - - : - 0 ? { - icon: , - status: 'warning', - title: t`At least one domain name you are tracking requires special attention`, - extra: specialNotice - } : { - icon: , - status: 'info', - title: t`The domain names below are subject to special monitoring`, - })} - /> + return ( + <> + { + total === 0 + ? + + + + + : + 0 + ? { + icon: , + status: 'warning', + title: t`At least one domain name you are tracking requires special attention`, + extra: specialNotice + } + : { + icon: , + status: 'info', + title: t`The domain names below are subject to special monitoring` + })} + /> - { - fetchData({page, itemsPerPage}) - } - }} - scroll={{y: '50vh'}} - /> - - } - -} \ No newline at end of file +
{ + fetchData({page, itemsPerPage}) + } + }} + scroll={{y: '50vh'}} + /> + + } + + ) +} diff --git a/assets/components/tracking/watchlist/UpdateWatchlistButton.tsx b/assets/components/tracking/watchlist/UpdateWatchlistButton.tsx index c6411ae..7fd422d 100644 --- a/assets/components/tracking/watchlist/UpdateWatchlistButton.tsx +++ b/assets/components/tracking/watchlist/UpdateWatchlistButton.tsx @@ -1,22 +1,20 @@ -import {Button, Drawer, Form, Typography} from "antd"; -import {t} from "ttag"; -import {WatchlistForm} from "./WatchlistForm"; -import React, {useState} from "react"; -import {Watchlist} from "../../../pages/tracking/WatchlistPage"; -import {EditOutlined} from "@ant-design/icons"; -import {Connector} from "../../../utils/api/connectors"; +import {Button, Drawer, Form, Typography} from 'antd' +import {t} from 'ttag' +import {WatchlistForm} from './WatchlistForm' +import React, {useState} from 'react' +import {EditOutlined} from '@ant-design/icons' +import {Connector} from '../../../utils/api/connectors' +import {Watchlist} from '../../../utils/api' export function UpdateWatchlistButton({watchlist, onUpdateWatchlist, connectors}: { - watchlist: Watchlist, - onUpdateWatchlist: (values: { domains: string[], triggers: string[], token: string }) => Promise, - connectors: (Connector & { id: string })[] + watchlist: Watchlist + onUpdateWatchlist: (values: { domains: string[], triggers: string[], token: string }) => Promise + connectors: Array }) { - const [form] = Form.useForm() const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) - const showDrawer = () => { setOpen(true) } @@ -26,43 +24,46 @@ export function UpdateWatchlistButton({watchlist, onUpdateWatchlist, connectors} setLoading(false) } - return <> - - { - showDrawer() - form.setFields([ - {name: 'token', value: watchlist.token}, - {name: 'name', value: watchlist.name}, - {name: 'connector', value: watchlist.connector?.id}, - {name: 'domains', value: watchlist.domains.map(d => d.ldhName)}, - {name: 'triggers', value: [...new Set(watchlist.triggers?.map(t => t.event))]}, - {name: 'dsn', value: watchlist.dsn} - ]) - }}/> - - {t`Cancel`}} - > - { - setLoading(true) - onUpdateWatchlist(values).then(onClose).catch(() => setLoading(false)) + return ( + <> + + { + showDrawer() + form.setFields([ + {name: 'token', value: watchlist.token}, + {name: 'name', value: watchlist.name}, + {name: 'connector', value: watchlist.connector?.id}, + {name: 'domains', value: watchlist.domains.map(d => d.ldhName)}, + {name: 'triggers', value: [...new Set(watchlist.triggers?.map(t => t.event))]}, + {name: 'dsn', value: watchlist.dsn} + ]) }} - connectors={connectors} - isCreation={false} - /> - - - -} \ No newline at end of file + /> + + {t`Cancel`}} + > + { + setLoading(true) + onUpdateWatchlist(values).then(onClose).catch(() => setLoading(false)) + }} + connectors={connectors} + isCreation={false} + /> + + + ) +} diff --git a/assets/components/tracking/watchlist/WatchlistCard.tsx b/assets/components/tracking/watchlist/WatchlistCard.tsx index 888e7b3..9c0c877 100644 --- a/assets/components/tracking/watchlist/WatchlistCard.tsx +++ b/assets/components/tracking/watchlist/WatchlistCard.tsx @@ -1,81 +1,83 @@ -import {Card, Col, Divider, Row, Space, Tag, Tooltip} from "antd"; -import {DisconnectOutlined, LinkOutlined} from "@ant-design/icons"; -import {t} from "ttag"; -import {ViewDiagramWatchlistButton} from "./diagram/ViewDiagramWatchlistButton"; -import {UpdateWatchlistButton} from "./UpdateWatchlistButton"; -import {DeleteWatchlistButton} from "./DeleteWatchlistButton"; -import React from "react"; -import {Watchlist} from "../../../pages/tracking/WatchlistPage"; -import {Connector} from "../../../utils/api/connectors"; -import useBreakpoint from "../../../hooks/useBreakpoint"; -import {CalendarWatchlistButton} from "./CalendarWatchlistButton"; -import {rdapEventDetailTranslation, rdapEventNameTranslation} from "../../../utils/functions/rdapTranslation"; +import {Card, Col, Divider, Row, Space, Tag, Tooltip} from 'antd' +import {DisconnectOutlined, LinkOutlined} from '@ant-design/icons' +import {t} from 'ttag' +import {ViewDiagramWatchlistButton} from './diagram/ViewDiagramWatchlistButton' +import {UpdateWatchlistButton} from './UpdateWatchlistButton' +import {DeleteWatchlistButton} from './DeleteWatchlistButton' +import React from 'react' +import {Connector} from '../../../utils/api/connectors' +import {CalendarWatchlistButton} from './CalendarWatchlistButton' +import {rdapEventDetailTranslation, rdapEventNameTranslation} from '../../../utils/functions/rdapTranslation' -import {actionToColor} from "../../../utils/functions/actionToColor"; -import {DomainToTag} from "../DomainToTag"; +import {actionToColor} from '../../../utils/functions/actionToColor' +import {DomainToTag} from '../DomainToTag' +import {Watchlist} from '../../../utils/api' export function WatchlistCard({watchlist, onUpdateWatchlist, connectors, onDelete}: { - watchlist: Watchlist, - onUpdateWatchlist: (values: { domains: string[], triggers: string[], token: string }) => Promise, - connectors: (Connector & { id: string })[], + watchlist: Watchlist + onUpdateWatchlist: (values: { domains: string[], triggers: string[], token: string }) => Promise + connectors: Array onDelete: () => void }) { const rdapEventNameTranslated = rdapEventNameTranslation() const rdapEventDetailTranslated = rdapEventDetailTranslation() - return <> - - { - watchlist.connector ? - - } color="lime-inverse"/> - : - - } color="default"/> - - } - - {t`Watchlist` + (watchlist.name ? ` (${watchlist.name})` : '')} - - - } - size='small' - style={{width: '100%'}} - extra={ - - - - - - - - - - } - > - - - - {watchlist.domains.map(d => )} - - - {watchlist.triggers?.filter(t => t.action === 'email') - .map(t => - - {rdapEventNameTranslated[t.event as keyof typeof rdapEventNameTranslated]} - + return ( + <> + + { + (watchlist.connector != null) + ? + } color='lime-inverse'/> - )} - - - - - -} \ No newline at end of file + : + } color='default'/> + + } + + {t`Watchlist` + (watchlist.name ? ` (${watchlist.name})` : '')} + + } + size='small' + style={{width: '100%'}} + extra={ + + + + + + + + + + } + > + + + + {watchlist.domains.map(d => )} + + + {watchlist.triggers?.filter(t => t.action === 'email') + .map(t => + + {rdapEventNameTranslated[t.event as keyof typeof rdapEventNameTranslated]} + + + )} + + + + + + ) +} diff --git a/assets/components/tracking/watchlist/WatchlistForm.tsx b/assets/components/tracking/watchlist/WatchlistForm.tsx index 8e9a9d4..54a066f 100644 --- a/assets/components/tracking/watchlist/WatchlistForm.tsx +++ b/assets/components/tracking/watchlist/WatchlistForm.tsx @@ -1,49 +1,55 @@ -import {Button, Form, FormInstance, Input, Select, SelectProps, Space, Tag, Tooltip, Typography} from "antd"; -import {t} from "ttag"; -import {ApiOutlined, MinusCircleOutlined, PlusOutlined} from "@ant-design/icons"; -import React from "react"; -import {Connector} from "../../../utils/api/connectors"; -import {rdapEventDetailTranslation, rdapEventNameTranslation} from "../../../utils/functions/rdapTranslation"; -import {actionToColor} from "../../../utils/functions/actionToColor"; -import {actionToIcon} from "../../../utils/functions/actionToIcon"; +import {Button, Form, FormInstance, Input, Select, SelectProps, Space, Tag, Tooltip, Typography} from 'antd' +import {t} from 'ttag' +import {ApiOutlined, MinusCircleOutlined, PlusOutlined} from '@ant-design/icons' +import React from 'react' +import {Connector} from '../../../utils/api/connectors' +import {rdapEventDetailTranslation, rdapEventNameTranslation} from '../../../utils/functions/rdapTranslation' +import {actionToColor} from '../../../utils/functions/actionToColor' +import {actionToIcon} from '../../../utils/functions/actionToIcon' +import {EventAction} from '../../../utils/api' -type TagRender = SelectProps['tagRender']; +type TagRender = SelectProps['tagRender'] const formItemLayout = { labelCol: { xs: {span: 24}, - sm: {span: 4}, + sm: {span: 4} }, wrapperCol: { xs: {span: 24}, - sm: {span: 20}, - }, -}; + sm: {span: 20} + } +} const formItemLayoutWithOutLabel = { wrapperCol: { xs: {span: 24, offset: 0}, - sm: {span: 20, offset: 4}, - }, -}; + sm: {span: 20, offset: 4} + } +} export function WatchlistForm({form, connectors, onFinish, isCreation}: { - form: FormInstance, - connectors: (Connector & { id: string })[] + form: FormInstance + connectors: Array onFinish: (values: { domains: string[], triggers: string[], token: string }) => void isCreation: boolean }) { const rdapEventNameTranslated = rdapEventNameTranslation() const rdapEventDetailTranslated = rdapEventDetailTranslation() - const triggerTagRenderer: TagRender = (props) => { - const {value, closable, onClose} = props; + const triggerTagRenderer: TagRender = ({value, closable, onClose}: { + value: EventAction + closable: boolean + onClose: () => void + }) => { const onPreventMouseDown = (event: React.MouseEvent) => { event.preventDefault() event.stopPropagation() } - return ( + return ( + - - - - - - - { - if (!domains || domains.length < 1) { - return Promise.reject(new Error(t`At least one domain name`)); + + + + + + + { + if (!domains || domains.length < 1) { + return await Promise.reject(new Error(t`At least one domain name`)) + } } - }, - }, - ]} - > - {(fields, {add, remove}, {errors}) => ( - <> - {fields.map((field, index) => ( - + } + ]} + > + {(fields, {add, remove}, {errors}) => ( + <> + {fields.map((field, index) => ( - + + + + {fields.length > 1 + ? ( + remove(field.name)} + /> + ) + : null} - {fields.length > 1 ? ( - remove(field.name)} - /> - ) : null} + ))} + + + - ))} - - - - - - )} - - - ({ + value: e, + title: rdapEventDetailTranslated[e as keyof typeof rdapEventDetailTranslated] || undefined, + label: rdapEventNameTranslated[e as keyof typeof rdapEventNameTranslated] + }))} + /> + - - } - optionFilterProp="label" + optionFilterProp='label' options={connectors.map(c => ({ label: `${c.provider} (${c.id})`, value: c.id }))} - /> - - - {(fields, {add, remove}, {errors}) => ( - <> - {fields.map((field, index) => ( - + /> + + + {(fields, {add, remove}, {errors}) => ( + <> + {fields.map((field, index) => ( - + + + + {fields.length > 0 + ? ( + remove(field.name)} + /> + ) + : null} - {fields.length > 0 ? ( - remove(field.name)} - /> - ) : null} - - ))} - - {t`Check out this link to the Symfony documentation to help you build the DSN`} - } - > - - - - - )} - - - - - - - - -} \ No newline at end of file + + + + + )} + + + + + + + + + ) +} diff --git a/assets/components/tracking/watchlist/WatchlistsList.tsx b/assets/components/tracking/watchlist/WatchlistsList.tsx index 2cb01f1..e265e35 100644 --- a/assets/components/tracking/watchlist/WatchlistsList.tsx +++ b/assets/components/tracking/watchlist/WatchlistsList.tsx @@ -1,23 +1,25 @@ -import React from "react"; -import {Watchlist} from "../../../pages/tracking/WatchlistPage"; -import {Connector} from "../../../utils/api/connectors"; -import {WatchlistCard} from "./WatchlistCard"; +import React from 'react' +import {Connector} from '../../../utils/api/connectors' +import {WatchlistCard} from './WatchlistCard' +import {Watchlist} from '../../../utils/api' export function WatchlistsList({watchlists, onDelete, onUpdateWatchlist, connectors}: { - watchlists: Watchlist[], - onDelete: () => void, - onUpdateWatchlist: (values: { domains: string[], triggers: string[], token: string }) => Promise, - connectors: (Connector & { id: string })[] + watchlists: Watchlist[] + onDelete: () => void + onUpdateWatchlist: (values: { domains: string[], triggers: string[], token: string }) => Promise + connectors: Array }) { - - - return <> - {watchlists.map(watchlist => - - ) - } - -} \ No newline at end of file + return ( + <> + {watchlists.map(watchlist => + + )} + + ) +} diff --git a/assets/components/tracking/watchlist/diagram/ViewDiagramWatchlistButton.tsx b/assets/components/tracking/watchlist/diagram/ViewDiagramWatchlistButton.tsx index e7db62c..89eae11 100644 --- a/assets/components/tracking/watchlist/diagram/ViewDiagramWatchlistButton.tsx +++ b/assets/components/tracking/watchlist/diagram/ViewDiagramWatchlistButton.tsx @@ -1,21 +1,20 @@ -import {Button, Flex, Modal, Space, Typography} from "antd" -import {t} from "ttag" -import React, {useEffect, useState} from "react" -import {ApartmentOutlined} from "@ant-design/icons" +import {Button, Flex, Modal, Space, Typography} from 'antd' +import {t} from 'ttag' +import React, {useEffect, useState} from 'react' +import {ApartmentOutlined} from '@ant-design/icons' import '@xyflow/react/dist/style.css' -import {Background, Controls, MiniMap, ReactFlow, useEdgesState, useNodesState} from "@xyflow/react"; -import {getWatchlist} from "../../../../utils/api"; -import {getLayoutedElements} from "./getLayoutedElements"; -import {watchlistToNodes} from "./watchlistToNodes"; -import {watchlistToEdges} from "./watchlistToEdges"; +import {Background, Controls, Edge, MiniMap, Node, ReactFlow, useEdgesState, useNodesState} from '@xyflow/react' +import {getWatchlist} from '../../../../utils/api' +import {getLayoutedElements} from './getLayoutedElements' +import {watchlistToNodes} from './watchlistToNodes' +import {watchlistToEdges} from './watchlistToEdges' export function ViewDiagramWatchlistButton({token}: { token: string }) { - const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) - const [nodes, setNodes, onNodesChange] = useNodesState([]) - const [edges, setEdges, onEdgesChange] = useEdgesState([]) + const [nodes, setNodes, onNodesChange] = useNodesState([]) + const [edges, setEdges, onEdgesChange] = useEdgesState([]) useEffect(() => { setEdges([]) @@ -30,52 +29,54 @@ export function ViewDiagramWatchlistButton({token}: { token: string }) { setNodes(e.nodes) setEdges(e.edges) }).catch(() => setOpen(false)).finally(() => setLoading(false)) - }, [open]) - - return <> - - setOpen(true)}/> - - - - - } - onOk={() => setOpen(false)} - onCancel={() => setOpen(false)} - width='90vw' - height='100%' - > - - - - - - - - - + return ( + <> + + setOpen(true)} + /> + + + + + } + onOk={() => setOpen(false)} + onCancel={() => setOpen(false)} + width='90vw' + height='100%' + > + + + + + + + + + + ) } diff --git a/assets/components/tracking/watchlist/diagram/getLayoutedElements.tsx b/assets/components/tracking/watchlist/diagram/getLayoutedElements.tsx index 456f9db..674c061 100644 --- a/assets/components/tracking/watchlist/diagram/getLayoutedElements.tsx +++ b/assets/components/tracking/watchlist/diagram/getLayoutedElements.tsx @@ -1,38 +1,39 @@ -import dagre from "dagre" +import dagre from 'dagre' +import {Edge, Node, Position} from '@xyflow/react' -export const getLayoutedElements = (nodes: any, edges: any, direction = 'TB') => { +export const getLayoutedElements = (nodes: Node[], edges: Edge[], direction = 'TB') => { const dagreGraph = new dagre.graphlib.Graph() dagreGraph.setDefaultEdgeLabel(() => ({})) const nodeWidth = 172 const nodeHeight = 200 - const isHorizontal = direction === 'LR'; - dagreGraph.setGraph({rankdir: direction}); + const isHorizontal = direction === 'LR' + dagreGraph.setGraph({rankdir: direction}) - nodes.forEach((node: any) => { - dagreGraph.setNode(node.id, {width: nodeWidth, height: nodeHeight}); - }); + nodes.forEach(node => { + dagreGraph.setNode(node.id, {width: nodeWidth, height: nodeHeight}) + }) - edges.forEach((edge: any) => { - dagreGraph.setEdge(edge.source, edge.target); - }); + edges.forEach(edge => { + dagreGraph.setEdge(edge.source, edge.target) + }) - dagre.layout(dagreGraph); + dagre.layout(dagreGraph) - const newNodes = nodes.map((node: any) => { + const newNodes: Node[] = nodes.map(node => { const nodeWithPosition = dagreGraph.node(node.id) return { ...node, - targetPosition: isHorizontal ? 'left' : 'top', - sourcePosition: isHorizontal ? 'right' : 'bottom', + targetPosition: isHorizontal ? Position.Left : Position.Top, + sourcePosition: isHorizontal ? Position.Right : Position.Bottom, position: { x: nodeWithPosition.x - nodeWidth / 2, y: nodeWithPosition.y - nodeHeight / 2 - }, - }; - }); + } + } + }) - return {nodes: newNodes, edges}; -} \ No newline at end of file + return {nodes: newNodes, edges} +} diff --git a/assets/components/tracking/watchlist/diagram/watchlistToEdges.tsx b/assets/components/tracking/watchlist/diagram/watchlistToEdges.tsx index 7a27bb6..7592cd8 100644 --- a/assets/components/tracking/watchlist/diagram/watchlistToEdges.tsx +++ b/assets/components/tracking/watchlist/diagram/watchlistToEdges.tsx @@ -1,17 +1,18 @@ -import {Domain, Watchlist} from "../../../../utils/api"; -import {rdapRoleTranslation} from "../../../../utils/functions/rdapTranslation"; -import {t} from "ttag"; +import {Domain, Watchlist} from '../../../../utils/api' +import {rdapRoleTranslation} from '../../../../utils/functions/rdapTranslation' +import {t} from 'ttag' -import {rolesToColor} from "../../../../utils/functions/rolesToColor"; +import {rolesToColor} from '../../../../utils/functions/rolesToColor' +import {Edge} from '@xyflow/react' -export function domainEntitiesToEdges(d: Domain, withRegistrar = false) { +export function domainEntitiesToEdges(d: Domain, withRegistrar = false): Edge[] { const rdapRoleTranslated = rdapRoleTranslation() const sponsor = d.entities.find(e => !e.deleted && e.roles.includes('sponsor')) return d.entities .filter(e => !e.deleted && (withRegistrar || !e.roles.includes('registrar')) && - (!sponsor || !e.roles.includes('registrar') || e.roles.includes('sponsor')) + ((sponsor == null) || !e.roles.includes('registrar') || e.roles.includes('sponsor')) ) .map(e => ({ id: `e-${d.ldhName}-${e.entity.handle}`, @@ -21,11 +22,11 @@ export function domainEntitiesToEdges(d: Domain, withRegistrar = false) { label: e.roles .map(r => rdapRoleTranslated[r as keyof typeof rdapRoleTranslated] || r) .join(', '), - animated: e.roles.includes('registrant'), + animated: e.roles.includes('registrant') })) } -export const domainNSToEdges = (d: Domain) => d.nameservers +export const domainNSToEdges = (d: Domain): Edge[] => d.nameservers .map(ns => ({ id: `ns-${d.ldhName}-${ns.ldhName}`, source: d.ldhName, @@ -34,7 +35,7 @@ export const domainNSToEdges = (d: Domain) => d.nameservers label: 'DNS' })) -export const tldToEdge = (d: Domain) => ({ +export const tldToEdge = (d: Domain): Edge => ({ id: `tld-${d.ldhName}-${d.tld.tld}`, source: d.tld.tld, target: d.ldhName, @@ -42,7 +43,7 @@ export const tldToEdge = (d: Domain) => ({ label: t`Registry` }) -export function watchlistToEdges(watchlist: Watchlist, withRegistrar = false, withTld = false) { +export function watchlistToEdges(watchlist: Watchlist, withRegistrar = false, withTld = false): Edge[] { const entitiesEdges = watchlist.domains.map(d => domainEntitiesToEdges(d, withRegistrar)).flat() const nameserversEdges = watchlist.domains.map(domainNSToEdges).flat() const tldEdge = watchlist.domains.map(tldToEdge) diff --git a/assets/components/tracking/watchlist/diagram/watchlistToNodes.tsx b/assets/components/tracking/watchlist/diagram/watchlistToNodes.tsx index 1909185..306e120 100644 --- a/assets/components/tracking/watchlist/diagram/watchlistToNodes.tsx +++ b/assets/components/tracking/watchlist/diagram/watchlistToNodes.tsx @@ -1,28 +1,31 @@ -import {Domain, Nameserver, Tld, Watchlist} from "../../../../utils/api"; -import React from "react"; +import {Domain, Nameserver, Tld, Watchlist} from '../../../../utils/api' +import React from 'react' import {t} from 'ttag' -import {entityToName} from "../../../../utils/functions/entityToName"; +import {entityToName} from '../../../../utils/functions/entityToName' +import {Node} from '@xyflow/react' -export const domainToNode = (d: Domain) => ({ +export const domainToNode = (d: Domain): Node => ({ id: d.ldhName, + position: {x: 0, y: 0}, data: {label: {d.ldhName}}, style: { width: 200 } }) -export const domainEntitiesToNode = (d: Domain, withRegistrar = false) => { +export const domainEntitiesToNode = (d: Domain, withRegistrar = false): Node[] => { const sponsor = d.entities.find(e => !e.deleted && e.roles.includes('sponsor')) return d.entities .filter(e => !e.deleted && (withRegistrar || !e.roles.includes('registrar')) && - (!sponsor || !e.roles.includes('registrar') || e.roles.includes('sponsor')) + ((sponsor == null) || !e.roles.includes('registrar') || e.roles.includes('sponsor')) ) .map(e => { return { id: e.entity.handle, + position: {x: 0, y: 0}, type: e.roles.includes('registrant') || e.roles.includes('registrar') ? 'input' : 'output', data: {label: entityToName(e)}, style: { @@ -32,8 +35,9 @@ export const domainEntitiesToNode = (d: Domain, withRegistrar = false) => { }) } -export const tldToNode = (tld: Tld) => ({ +export const tldToNode = (tld: Tld): Node => ({ id: tld.tld, + position: {x: 0, y: 0}, data: {label: t`.${tld.tld} Registry`}, type: 'input', style: { @@ -41,8 +45,9 @@ export const tldToNode = (tld: Tld) => ({ } }) -export const nsToNode = (ns: Nameserver) => ({ +export const nsToNode = (ns: Nameserver): Node => ({ id: ns.ldhName, + position: {x: 0, y: 0}, data: {label: ns.ldhName}, type: 'output', style: { @@ -50,12 +55,11 @@ export const nsToNode = (ns: Nameserver) => ({ } }) -export function watchlistToNodes(watchlist: Watchlist, withRegistrar = false, withTld = false) { - +export function watchlistToNodes(watchlist: Watchlist, withRegistrar = false, withTld = false): Node[] { const domains = watchlist.domains.map(domainToNode) const entities = [...new Set(watchlist.domains.map(d => domainEntitiesToNode(d, withRegistrar)).flat())] const tlds = [...new Set(watchlist.domains.map(d => d.tld))].filter(t => t.tld !== '.').map(tldToNode) const nameservers = [...new Set(watchlist.domains.map(d => d.nameservers))].flat().map(nsToNode, withRegistrar) return [...domains, ...entities, ...nameservers, ...(withTld ? tlds : [])] -} \ No newline at end of file +} diff --git a/assets/declaration.d.ts b/assets/declaration.d.ts index dc003b7..70bcd65 100644 --- a/assets/declaration.d.ts +++ b/assets/declaration.d.ts @@ -1,4 +1,4 @@ -declare module "*.md" { - const content: string; - export default content; +declare module '*.md' { + const content: string + export default content } diff --git a/assets/hooks/useBreakpoint.tsx b/assets/hooks/useBreakpoint.tsx index b6608cc..cf92760 100644 --- a/assets/hooks/useBreakpoint.tsx +++ b/assets/hooks/useBreakpoint.tsx @@ -1,13 +1,13 @@ -import {Breakpoint, theme} from 'antd'; -import {useMediaQuery} from 'react-responsive'; +import {Breakpoint, theme} from 'antd' +import {useMediaQuery} from 'react-responsive' -const {useToken} = theme; +const {useToken} = theme -type ScreenProperty = 'screenXXL' | 'screenXL' | 'screenLG' | 'screenMD' | 'screenSM' | 'screenXS'; +type ScreenProperty = 'screenXXL' | 'screenXL' | 'screenLG' | 'screenMD' | 'screenSM' | 'screenXS' const propertyName = (breakpoint: Breakpoint): ScreenProperty => { return 'screen' + breakpoint.toUpperCase() as ScreenProperty -}; +} export default function useBreakpoint( breakpoint: Breakpoint diff --git a/assets/index.tsx b/assets/index.tsx index 3659847..a68a911 100644 --- a/assets/index.tsx +++ b/assets/index.tsx @@ -1,23 +1,21 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import App from "./App"; -import {HashRouter} from "react-router-dom"; +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import {HashRouter} from 'react-router-dom' -import 'antd/dist/reset.css'; +import 'antd/dist/reset.css' import './i18n' import './index.css' - -const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement) +const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement) function Index() { - return ( - ); + ) } root.render() diff --git a/assets/pages/LoginPage.tsx b/assets/pages/LoginPage.tsx index d663da8..a047fc3 100644 --- a/assets/pages/LoginPage.tsx +++ b/assets/pages/LoginPage.tsx @@ -1,16 +1,24 @@ -import React, {createContext, useEffect, useState} from "react"; -import {Button, Card} from "antd"; +import React, {createContext, useEffect, useState} from 'react' +import {Button, Card} from 'antd' import {t} from 'ttag' -import TextPage from "./TextPage"; -import {LoginForm} from "../components/LoginForm"; -import {getConfiguration, InstanceConfig} from "../utils/api"; -import {RegisterForm} from "../components/RegisterForm"; +import TextPage from './TextPage' +import {LoginForm} from '../components/LoginForm' +import {getConfiguration, InstanceConfig} from '../utils/api' +import {RegisterForm} from '../components/RegisterForm' - -export const AuthenticatedContext = createContext(null) +export const AuthenticatedContext = createContext< + { + authenticated: (authenticated: boolean) => void + setIsAuthenticated: React.Dispatch> + } +>({ + authenticated: () => { + }, + setIsAuthenticated: () => { + } +}) export default function LoginPage() { - const [wantRegister, setWantRegister] = useState(false) const [configuration, setConfiguration] = useState() @@ -22,19 +30,24 @@ export default function LoginPage() { getConfiguration().then(setConfiguration) }, []) - return - - {wantRegister ? : } - { - configuration?.registerEnabled && - - } - - - - - -} \ No newline at end of file + onClick={toggleWantRegister} + >{wantRegister ? t`Log in` : t`Create an account`} + + } + + + + + + ) +} diff --git a/assets/pages/NotFoundPage.tsx b/assets/pages/NotFoundPage.tsx index 86b8350..d44d4a4 100644 --- a/assets/pages/NotFoundPage.tsx +++ b/assets/pages/NotFoundPage.tsx @@ -1,12 +1,13 @@ -import {Result} from "antd"; -import React from "react"; +import {Result} from 'antd' +import React from 'react' import {t} from 'ttag' - export default function NotFoundPage() { - return -} \ No newline at end of file + return ( + + ) +} diff --git a/assets/pages/StatisticsPage.tsx b/assets/pages/StatisticsPage.tsx index b77b92b..a79c4ee 100644 --- a/assets/pages/StatisticsPage.tsx +++ b/assets/pages/StatisticsPage.tsx @@ -1,17 +1,16 @@ -import React, {useEffect, useState} from "react"; -import {getStatistics, Statistics} from "../utils/api"; -import {Card, Col, Divider, Row, Statistic, Tooltip} from "antd"; -import {t} from "ttag"; +import React, {useEffect, useState} from 'react' +import {getStatistics, Statistics} from '../utils/api' +import {Card, Col, Divider, Row, Statistic, Tooltip} from 'antd' +import {t} from 'ttag' import { - AimOutlined, - CompassOutlined, - DatabaseOutlined, - FieldTimeOutlined, - NotificationOutlined -} from "@ant-design/icons"; + AimOutlined, + CompassOutlined, + DatabaseOutlined, + FieldTimeOutlined, + NotificationOutlined +} from '@ant-design/icons' export default function StatisticsPage() { - const [stats, setStats] = useState() useEffect(() => { @@ -20,101 +19,104 @@ export default function StatisticsPage() { const totalDomainPurchase = (stats?.domainPurchased ?? 0) + (stats?.domainPurchaseFailed ?? 0) - const successRate = stats !== undefined ? - (totalDomainPurchase === 0 ? undefined : stats.domainPurchased / totalDomainPurchase) + const successRate = stats !== undefined + ? (totalDomainPurchase === 0 ? undefined : stats.domainPurchased / totalDomainPurchase) : undefined - return <> - - - - } - title={t`RDAP queries`} - value={stats?.rdapQueries} - /> - - - - - } - value={stats?.alertSent} - valueStyle={{color: 'violet'}} - /> - - - - - - - - } - value={stats?.domainCountTotal} - valueStyle={{color: 'orange'}} - /> - - - - - } - value={stats?.domainTracked} - valueStyle={{color: 'violet'}} - /> - - - - - - - - } - value={stats?.domainPurchased} - valueStyle={{color: 'green'}} - /> - - - - - - = 0.5 ? 'darkgreen' : 'orange'}} - /> - - - - - - - {stats?.domainCount - .sort((a, b) => b.domain - a.domain) - .map(({domain, tld}) => + return ( + <> + + } + title={t`RDAP queries`} + value={stats?.rdapQueries} /> - )} - - -} \ No newline at end of file + + + + } + value={stats?.alertSent} + valueStyle={{color: 'violet'}} + /> + + + + + + + + } + value={stats?.domainCountTotal} + valueStyle={{color: 'orange'}} + /> + + + + + } + value={stats?.domainTracked} + valueStyle={{color: 'violet'}} + /> + + + + + + + + } + value={stats?.domainPurchased} + valueStyle={{color: 'green'}} + /> + + + + + + = 0.5 ? 'darkgreen' : 'orange'}} + /> + + + + + + + {stats?.domainCount + .sort((a, b) => b.domain - a.domain) + .map(({domain, tld}) => + + + + )} + + + ) +} diff --git a/assets/pages/TextPage.tsx b/assets/pages/TextPage.tsx index c68c5b8..a3da62b 100644 --- a/assets/pages/TextPage.tsx +++ b/assets/pages/TextPage.tsx @@ -1,8 +1,8 @@ -import React, {useEffect, useState} from "react"; -import snarkdown from "snarkdown" -import {Skeleton, Typography} from "antd"; -import axios from "axios"; -import {t} from "ttag"; +import React, {useEffect, useState} from 'react' +import snarkdown from 'snarkdown' +import {Skeleton, Typography} from 'antd' +import axios from 'axios' +import {t} from 'ttag' export default function TextPage({resource}: { resource: string }) { const [loading, setLoading] = useState(false) @@ -12,18 +12,22 @@ export default function TextPage({resource}: { resource: string }) { setLoading(true) axios.get('/content/' + resource) .then(res => setMarkdown(res.data)) - .catch(err => { + .catch(() => { console.error(`Please create the /public/content/${resource} file.`) setMarkdown(undefined) }) .finally(() => setLoading(false)) }, [resource]) - return - {markdown !== undefined ?
: - - {t`📝 Please create the /public/content/${resource} file.`} - } -
-} \ No newline at end of file + return ( + + {markdown !== undefined + ?
+ : + {t`📝 Please create the /public/content/${resource} file.`} + } + + ) +} diff --git a/assets/pages/UserPage.tsx b/assets/pages/UserPage.tsx index 11c74ed..c092e4c 100644 --- a/assets/pages/UserPage.tsx +++ b/assets/pages/UserPage.tsx @@ -1,26 +1,27 @@ -import React, {useEffect, useState} from "react"; -import {Card, Flex, Skeleton, Typography} from "antd"; -import {getUser, User} from "../utils/api"; +import React, {useEffect, useState} from 'react' +import {Card, Flex, Skeleton, Typography} from 'antd' +import {getUser, User} from '../utils/api' import {t} from 'ttag' export default function UserPage() { - const [user, setUser] = useState(null) useEffect(() => { getUser().then(setUser) }, []) - return - - - - {t`Username`} : {user?.email} - - - {t`Roles`} : {user?.roles.join(',')} - - - - -} \ No newline at end of file + return ( + + + + + {t`Username`} : {user?.email} + + + {t`Roles`} : {user?.roles.join(',')} + + + + + ) +} diff --git a/assets/pages/search/DomainSearchPage.tsx b/assets/pages/search/DomainSearchPage.tsx index c2c20c0..9bede54 100644 --- a/assets/pages/search/DomainSearchPage.tsx +++ b/assets/pages/search/DomainSearchPage.tsx @@ -1,12 +1,12 @@ -import React, {useEffect, useState} from "react"; -import {Empty, Flex, FormProps, message, Skeleton} from "antd"; -import {Domain, getDomain} from "../../utils/api"; -import {AxiosError} from "axios" +import React, {useEffect, useState} from 'react' +import {Empty, Flex, FormProps, message, Skeleton} from 'antd' +import {Domain, getDomain} from '../../utils/api' +import {AxiosError} from 'axios' import {t} from 'ttag' -import {DomainSearchBar, FieldType} from "../../components/search/DomainSearchBar"; -import {DomainResult} from "../../components/search/DomainResult"; -import {showErrorAPI} from "../../utils/functions/showErrorAPI"; -import {useNavigate, useParams} from "react-router-dom"; +import {DomainSearchBar, FieldType} from '../../components/search/DomainSearchBar' +import {DomainResult} from '../../components/search/DomainResult' +import {showErrorAPI} from '../../utils/functions/showErrorAPI' +import {useNavigate, useParams} from 'react-router-dom' export default function DomainSearchPage() { const {query} = useParams() @@ -36,17 +36,21 @@ export default function DomainSearchPage() { onFinish({ldhName: query}) }, []) - return - {contextHolder} - + return ( + + {contextHolder} + - - { - domain && - (!domain.deleted ? - : ) - } - - -} \ No newline at end of file + + { + (domain != null) && + (!domain.deleted + ? + : ) + } + + + ) +} diff --git a/assets/pages/search/EntitySearchPage.tsx b/assets/pages/search/EntitySearchPage.tsx index d7d1cae..56745c3 100644 --- a/assets/pages/search/EntitySearchPage.tsx +++ b/assets/pages/search/EntitySearchPage.tsx @@ -1,7 +1,9 @@ -import React from "react"; +import React from 'react' export default function EntitySearchPage() { - return

- Not implemented -

-} \ No newline at end of file + return ( +

+ Not implemented +

+ ) +} diff --git a/assets/pages/search/NameserverSearchPage.tsx b/assets/pages/search/NameserverSearchPage.tsx index 992ba64..fbf2d0e 100644 --- a/assets/pages/search/NameserverSearchPage.tsx +++ b/assets/pages/search/NameserverSearchPage.tsx @@ -1,7 +1,9 @@ -import React from "react"; +import React from 'react' export default function NameserverSearchPage() { - return

- Not implemented -

-} \ No newline at end of file + return ( +

+ Not implemented +

+ ) +} diff --git a/assets/pages/search/TldPage.tsx b/assets/pages/search/TldPage.tsx index 595742c..c5742fd 100644 --- a/assets/pages/search/TldPage.tsx +++ b/assets/pages/search/TldPage.tsx @@ -1,41 +1,53 @@ -import React, {useEffect, useState} from "react"; -import {Collapse, Divider, Table, Typography} from "antd"; -import {getTldList, Tld} from "../../utils/api"; +import React, {ReactElement, useEffect, useState} from 'react' +import {Collapse, Divider, Table, Typography} from 'antd' +import {getTldList, Tld} from '../../utils/api' import {t} from 'ttag' -import {regionNames} from "../../i18n"; -import useBreakpoint from "../../hooks/useBreakpoint"; -import {ColumnType} from "antd/es/table"; -import punycode from "punycode/punycode"; -import {getCountryCode} from "../../utils/functions/getCountryCode"; -import {tldToEmoji} from "../../utils/functions/tldToEmoji"; +import {regionNames} from '../../i18n' +import useBreakpoint from '../../hooks/useBreakpoint' +import {ColumnType} from 'antd/es/table' +import punycode from 'punycode/punycode' +import {getCountryCode} from '../../utils/functions/getCountryCode' +import {tldToEmoji} from '../../utils/functions/tldToEmoji' const {Text, Paragraph} = Typography type TldType = 'iTLD' | 'sTLD' | 'gTLD' | 'ccTLD' -type FiltersType = { type: TldType, contractTerminated?: boolean, specification13?: boolean } +interface FiltersType { + type: TldType, + contractTerminated?: boolean, + specification13?: boolean +} function TldTable(filters: FiltersType) { + interface TableRow { + key: string + TLD: ReactElement + Flag?: string + Country?: string + } + const sm = useBreakpoint('sm') - const [dataTable, setDataTable] = useState([]) + const [dataTable, setDataTable] = useState([]) const [total, setTotal] = useState(0) const fetchData = (params: FiltersType & { page: number, itemsPerPage: number }) => { getTldList(params).then((data) => { setTotal(data['hydra:totalItems']) setDataTable(data['hydra:member'].map((tld: Tld) => { - const rowData = { key: tld.tld, TLD: {punycode.toUnicode(tld.tld)} } - switch (filters.type) { + const type = filters.type + let countryName + + switch (type) { case 'ccTLD': - let countryName try { countryName = regionNames.of(getCountryCode(tld.tld)) - } catch (e) { + } catch { countryName = '-' } @@ -60,98 +72,104 @@ function TldTable(filters: FiltersType) { fetchData({...filters, page: 1, itemsPerPage: 30}) }, []) - let columns: ColumnType[] = [ + let columns: Array> = [ { title: t`TLD`, - dataIndex: "TLD" + dataIndex: 'TLD' } ] - if (filters.type === 'ccTLD') columns = [...columns, { - title: t`Flag`, - dataIndex: "Flag", - }, { - title: t`Country`, - dataIndex: "Country" - }] + if (filters.type === 'ccTLD') { + columns = [...columns, { + title: t`Flag`, + dataIndex: 'Flag' + }, { + title: t`Country`, + dataIndex: 'Country' + }] + } - if (filters.type === 'gTLD') columns = [...columns, { - title: t`Registry Operator`, - dataIndex: "Operator" - }] + if (filters.type === 'gTLD') { + columns = [...columns, { + title: t`Registry Operator`, + dataIndex: 'Operator' + }] + } + return ( +
{ + fetchData({...filters, page, itemsPerPage}) + } + }} - return
{ - fetchData({...filters, page, itemsPerPage}) - } - }} - - {...(sm ? {scroll: {y: 'max-content'}} : {scroll: {y: 240}})} - /> + {...(sm ? {scroll: {y: 'max-content'}} : {scroll: {y: 240}})} + /> + ) } - export default function TldPage() { const sm = useBreakpoint('sm') - return <> - - {t`This page presents all active TLDs in the root zone database.`} - - - {t`IANA provides the list of currently active TLDs, regardless of their type, and ICANN provides the list of gTLDs. + return ( + <> + + {t`This page presents all active TLDs in the root zone database.`} + + + {t`IANA provides the list of currently active TLDs, regardless of their type, and ICANN provides the list of gTLDs. In most cases, the two-letter ccTLD assigned to a country is made in accordance with the ISO 3166-1 standard. This data is updated every month. Three HTTP requests are needed for the complete update of TLDs in Domain Watchdog (two requests to IANA and one to ICANN). At the same time, the list of root RDAP servers is updated.`} - - - - {t`Top-level domains sponsored by specific organizations that set rules for registration and use, often related to particular interest groups or industries.`} - - - - }, - { - key: 'gTLD', - label: t`Generic Top-Level-Domains`, - children: <> - {t`Generic top-level domains open to everyone, not restricted by specific criteria, representing various themes or industries.`} - - - - }, - { - key: 'ngTLD', - label: t`Brand Generic Top-Level-Domains`, - children: <> - {t`Generic top-level domains associated with specific brands, allowing companies to use their own brand names as domains.`} - - - - }, - { - key: 'ccTLD', - label: t`Country-Code Top-Level-Domains`, - children: <> - {t`Top-level domains based on country codes, identifying websites according to their country of origin.`} - - - } - ]} - /> - -} \ No newline at end of file + + + + {t`Top-level domains sponsored by specific organizations that set rules for registration and use, often related to particular interest groups or industries.`} + + + + }, + { + key: 'gTLD', + label: t`Generic Top-Level-Domains`, + children: <> + {t`Generic top-level domains open to everyone, not restricted by specific criteria, representing various themes or industries.`} + + + + }, + { + key: 'ngTLD', + label: t`Brand Generic Top-Level-Domains`, + children: <> + {t`Generic top-level domains associated with specific brands, allowing companies to use their own brand names as domains.`} + + + + }, + { + key: 'ccTLD', + label: t`Country-Code Top-Level-Domains`, + children: <> + {t`Top-level domains based on country codes, identifying websites according to their country of origin.`} + + + } + ]} + /> + + ) +} diff --git a/assets/pages/tracking/ConnectorPage.tsx b/assets/pages/tracking/ConnectorPage.tsx index 56dff08..4bb135c 100644 --- a/assets/pages/tracking/ConnectorPage.tsx +++ b/assets/pages/tracking/ConnectorPage.tsx @@ -1,12 +1,12 @@ -import React, {useEffect, useState} from "react"; -import {Card, Flex, Form, message, Skeleton} from "antd"; -import {t} from "ttag"; -import {Connector, getConnectors, postConnector} from "../../utils/api/connectors"; -import {ConnectorForm} from "../../components/tracking/connector/ConnectorForm"; -import {AxiosError} from "axios"; -import {ConnectorElement, ConnectorsList} from "../../components/tracking/connector/ConnectorsList"; +import React, {useEffect, useState} from 'react' +import {Card, Flex, Form, message, Skeleton} from 'antd' +import {t} from 'ttag' +import {Connector, getConnectors, postConnector} from '../../utils/api/connectors' +import {ConnectorForm} from '../../components/tracking/connector/ConnectorForm' +import {AxiosError} from 'axios' +import {ConnectorElement, ConnectorsList} from '../../components/tracking/connector/ConnectorsList' -import {showErrorAPI} from "../../utils/functions/showErrorAPI"; +import {showErrorAPI} from '../../utils/functions/showErrorAPI' export default function ConnectorPage() { const [form] = Form.useForm() @@ -14,7 +14,7 @@ export default function ConnectorPage() { const [connectors, setConnectors] = useState() const onCreateConnector = (values: Connector) => { - postConnector(values).then((w) => { + postConnector(values).then(() => { form.resetFields() refreshConnectors() messageApi.success(t`Connector created !`) @@ -23,7 +23,7 @@ export default function ConnectorPage() { }) } - const refreshConnectors = () => getConnectors().then(c => { + const refreshConnectors = async () => await getConnectors().then(c => { setConnectors(c['hydra:member']) }).catch((e: AxiosError) => { setConnectors(undefined) @@ -34,18 +34,17 @@ export default function ConnectorPage() { refreshConnectors() }, []) + return ( + + + {contextHolder} + + - return - - {contextHolder} - - - - - - {connectors && connectors.length > 0 && - - } - - -} \ No newline at end of file + + {(connectors != null) && connectors.length > 0 && + } + + + ) +} diff --git a/assets/pages/tracking/TrackedDomainPage.tsx b/assets/pages/tracking/TrackedDomainPage.tsx index 3209c23..9fe060f 100644 --- a/assets/pages/tracking/TrackedDomainPage.tsx +++ b/assets/pages/tracking/TrackedDomainPage.tsx @@ -1,6 +1,6 @@ -import {TrackedDomainTable} from "../../components/tracking/watchlist/TrackedDomainTable"; -import React from "react"; +import {TrackedDomainTable} from '../../components/tracking/watchlist/TrackedDomainTable' +import React from 'react' export default function TrackedDomainPage() { return -} \ No newline at end of file +} diff --git a/assets/pages/tracking/WatchlistPage.tsx b/assets/pages/tracking/WatchlistPage.tsx index b564527..84871cb 100644 --- a/assets/pages/tracking/WatchlistPage.tsx +++ b/assets/pages/tracking/WatchlistPage.tsx @@ -1,34 +1,19 @@ -import React, {useEffect, useState} from "react"; -import {Card, Divider, Flex, Form, message} from "antd"; -import {EventAction, getWatchlists, postWatchlist, putWatchlist} from "../../utils/api"; -import {AxiosError} from "axios"; +import React, {useEffect, useState} from 'react' +import {Card, Divider, Flex, Form, message} from 'antd' +import {getWatchlists, postWatchlist, putWatchlist, Watchlist} from '../../utils/api' +import {AxiosError} from 'axios' import {t} from 'ttag' -import {WatchlistForm} from "../../components/tracking/watchlist/WatchlistForm"; -import {WatchlistsList} from "../../components/tracking/watchlist/WatchlistsList"; -import {Connector, getConnectors} from "../../utils/api/connectors"; +import {WatchlistForm} from '../../components/tracking/watchlist/WatchlistForm' +import {WatchlistsList} from '../../components/tracking/watchlist/WatchlistsList' +import {Connector, getConnectors} from '../../utils/api/connectors' -import {showErrorAPI} from "../../utils/functions/showErrorAPI"; +import {showErrorAPI} from '../../utils/functions/showErrorAPI' - -export type Watchlist = { +interface FormValuesType { name?: string - token: string, - domains: { ldhName: string, deleted: boolean, status: string[] }[], - triggers?: { event: EventAction, action: string }[], - dsn?: string[] - connector?: { - id: string - provider: string - createdAt: string - } - createdAt: string -} - -type FormValuesType = { - name?: string - domains: string[], + domains: string[] triggers: string[] - connector?: string, + connector?: string dsn?: string[] } @@ -52,14 +37,13 @@ const getRequestDataFromForm = (values: FormValuesType) => { } export default function WatchlistPage() { - const [form] = Form.useForm() const [messageApi, contextHolder] = message.useMessage() const [watchlists, setWatchlists] = useState() - const [connectors, setConnectors] = useState<(Connector & { id: string })[]>() + const [connectors, setConnectors] = useState>() const onCreateWatchlist = (values: FormValuesType) => { - postWatchlist(getRequestDataFromForm(values)).then((w) => { + postWatchlist(getRequestDataFromForm(values)).then(() => { form.resetFields() refreshWatchlists() messageApi.success(t`Watchlist created !`) @@ -68,18 +52,18 @@ export default function WatchlistPage() { }) } - const onUpdateWatchlist = async (values: FormValuesType & { token: string }) => putWatchlist({ + const onUpdateWatchlist = async (values: FormValuesType & { token: string }) => await putWatchlist({ token: values.token, ...getRequestDataFromForm(values) } - ).then((w) => { + ).then(() => { refreshWatchlists() messageApi.success(t`Watchlist updated !`) }).catch((e: AxiosError) => { throw showErrorAPI(e, messageApi) }) - const refreshWatchlists = () => getWatchlists().then(w => { + const refreshWatchlists = async () => await getWatchlists().then(w => { setWatchlists(w['hydra:member']) }).catch((e: AxiosError) => { setWatchlists(undefined) @@ -95,18 +79,20 @@ export default function WatchlistPage() { }) }, []) - return - {contextHolder} - - {connectors && - - } - - - {connectors && watchlists && watchlists.length > 0 && - } - -} \ No newline at end of file + return ( + + {contextHolder} + + {(connectors != null) && + } + + + {(connectors != null) && (watchlists != null) && watchlists.length > 0 && + } + + ) +} diff --git a/assets/utils/api/connectors.ts b/assets/utils/api/connectors.ts index 80bc73b..47dbe4e 100644 --- a/assets/utils/api/connectors.ts +++ b/assets/utils/api/connectors.ts @@ -1,4 +1,5 @@ -import {request} from "./index"; +import {request} from './index' +import {ConnectorElement} from '../../components/tracking/connector/ConnectorsList' export enum ConnectorProvider { OVH = 'ovh', @@ -7,13 +8,18 @@ export enum ConnectorProvider { NAMECHEAP = 'namecheap' } -export type Connector = { +export interface Connector { provider: ConnectorProvider authData: object } -export async function getConnectors() { - const response = await request({ +interface ConnectorResponse { + 'hydra:totalItems': number + 'hydra:member': ConnectorElement[] +} + +export async function getConnectors(): Promise { + const response = await request({ url: 'connectors' }) return response.data @@ -25,7 +31,7 @@ export async function postConnector(connector: Connector) { url: 'connectors', data: connector, headers: { - "Content-Type": 'application/json' + 'Content-Type': 'application/json' } }) return response.data diff --git a/assets/utils/api/domain.ts b/assets/utils/api/domain.ts index 83fdee7..655cd92 100644 --- a/assets/utils/api/domain.ts +++ b/assets/utils/api/domain.ts @@ -1,5 +1,4 @@ -import {Domain, request} from "."; - +import {Domain, request} from '.' export async function getDomain(ldhName: string): Promise { const response = await request({ diff --git a/assets/utils/api/index.ts b/assets/utils/api/index.ts index 34127a2..1fa4698 100644 --- a/assets/utils/api/index.ts +++ b/assets/utils/api/index.ts @@ -1,5 +1,4 @@ -import axios, {AxiosRequestConfig, AxiosResponse} from "axios"; - +import axios, {AxiosRequestConfig, AxiosResponse} from 'axios' export type EventAction = 'registration' @@ -26,7 +25,12 @@ export interface Event { export interface Entity { handle: string - jCard: any + jCard: ['vcard', Array<[ + string, + { [key: string]: string | string[] }, + string, + string | string[], + ]>] | [] } export interface Nameserver { @@ -50,12 +54,12 @@ export interface Domain { handle: string status: string[] events: Event[] - entities: { + entities: Array<{ entity: Entity events: Event[] roles: string[] deleted: boolean - }[] + }> nameservers: Nameserver[] tld: Tld deleted: boolean @@ -70,20 +74,24 @@ export interface User { export interface WatchlistRequest { name?: string - domains: string[], - triggers: { event: EventAction, action: TriggerAction }[], + domains: string[] + triggers: Array<{ event: EventAction, action: TriggerAction }> connector?: string dsn?: string[] } export interface Watchlist { - token: string name?: string - domains: Domain[], - triggers: { event: EventAction, action: TriggerAction }[], - connector?: string - createdAt: string + token: string + domains: Domain[] + triggers?: Array<{ event: EventAction, action: string }> dsn?: string[] + connector?: { + id: string + provider: string + createdAt: string + } + createdAt: string } export interface InstanceConfig { @@ -97,28 +105,30 @@ export interface Statistics { alertSent: number domainPurchased: number domainPurchaseFailed: number - domainCount: {tld: string, domain: number}[] + domainCount: Array<{ tld: string, domain: number }> domainCountTotal: number domainTracked: number } -export async function request, D = any>(config: AxiosRequestConfig): Promise { +export interface TrackedDomains { + 'hydra:totalItems': number + 'hydra:member': Domain[] +} + +export async function request, D = object>(config: AxiosRequestConfig): Promise { const axiosConfig: AxiosRequestConfig = { ...config, baseURL: '/api', withCredentials: true, headers: { Accept: 'application/ld+json', - ...config.headers, + ...config.headers } } return await axios.request(axiosConfig) } - export * from './domain' export * from './tld' export * from './user' export * from './watchlist' - - diff --git a/assets/utils/api/tld.ts b/assets/utils/api/tld.ts index 3f2a698..e0ec886 100644 --- a/assets/utils/api/tld.ts +++ b/assets/utils/api/tld.ts @@ -1,15 +1,13 @@ -import {request} from "./index"; +import {request, Tld} from './index' -interface Tld { - tld: string - contractTerminated: boolean - registryOperator: string - specification13: boolean +interface TldList { + 'hydra:totalItems': number + 'hydra:member': Tld[] } -export async function getTldList(params: object): Promise { - return (await request({ +export async function getTldList(params: object): Promise { + return (await request({ url: 'tld', - params, + params })).data -} \ No newline at end of file +} diff --git a/assets/utils/api/user.ts b/assets/utils/api/user.ts index a42fe87..376cf61 100644 --- a/assets/utils/api/user.ts +++ b/assets/utils/api/user.ts @@ -1,5 +1,4 @@ -import {InstanceConfig, request, Statistics, User} from "./index"; - +import {InstanceConfig, request, Statistics, User} from './index' export async function login(email: string, password: string): Promise { const response = await request({ @@ -19,7 +18,6 @@ export async function register(email: string, password: string): Promise { const response = await request({ url: 'me' @@ -39,4 +37,4 @@ export async function getStatistics(): Promise { url: 'stats' }) return response.data -} \ No newline at end of file +} diff --git a/assets/utils/api/watchlist.ts b/assets/utils/api/watchlist.ts index 4a397ba..53af528 100644 --- a/assets/utils/api/watchlist.ts +++ b/assets/utils/api/watchlist.ts @@ -1,7 +1,12 @@ -import {Domain, request, Watchlist, WatchlistRequest} from "./index"; +import {request, TrackedDomains, Watchlist, WatchlistRequest} from './index' -export async function getWatchlists() { - const response = await request({ +interface WatchlistList { + 'hydra:totalItems': number + 'hydra:member': Watchlist[] +} + +export async function getWatchlists(): Promise { + const response = await request({ url: 'watchlists' }) return response.data @@ -20,7 +25,7 @@ export async function postWatchlist(watchlist: WatchlistRequest) { url: 'watchlists', data: watchlist, headers: { - "Content-Type": 'application/json' + 'Content-Type': 'application/json' } }) return response.data @@ -37,17 +42,16 @@ export async function putWatchlist(watchlist: Partial & { toke const response = await request({ method: 'PUT', url: 'watchlists/' + watchlist.token, - data: watchlist, + data: watchlist }) return response.data } -export async function getTrackedDomainList(params: { page: number, itemsPerPage: number }): Promise { - const response = await request({ +export async function getTrackedDomainList(params: { page: number, itemsPerPage: number }): Promise { + const response = await request({ method: 'GET', url: 'tracked', params }) return response.data } - diff --git a/assets/utils/functions/actionToColor.tsx b/assets/utils/functions/actionToColor.tsx index 6a6ad25..f8e4760 100644 --- a/assets/utils/functions/actionToColor.tsx +++ b/assets/utils/functions/actionToColor.tsx @@ -1,11 +1,19 @@ -import {EventAction} from "../api"; +import {EventAction} from '../api' -export const actionToColor = (a: EventAction) => a === 'registration' ? 'green' : - a === 'reregistration' ? 'cyan' : - a === 'expiration' ? 'red' : - a === 'deletion' ? 'magenta' : - a === 'transfer' ? 'orange' : - a === 'last changed' ? 'blue' : - a === 'registrar expiration' ? 'red' : - a === 'reinstantiation' ? 'purple' : - a === 'enum validation expiration' ? 'red' : 'default' \ No newline at end of file +export const actionToColor = (a: EventAction) => a === 'registration' + ? 'green' + : a === 'reregistration' + ? 'cyan' + : a === 'expiration' + ? 'red' + : a === 'deletion' + ? 'magenta' + : a === 'transfer' + ? 'orange' + : a === 'last changed' + ? 'blue' + : a === 'registrar expiration' + ? 'red' + : a === 'reinstantiation' + ? 'purple' + : a === 'enum validation expiration' ? 'red' : 'default' diff --git a/assets/utils/functions/actionToIcon.tsx b/assets/utils/functions/actionToIcon.tsx index 79d0629..be51762 100644 --- a/assets/utils/functions/actionToIcon.tsx +++ b/assets/utils/functions/actionToIcon.tsx @@ -1,4 +1,4 @@ -import {EventAction} from "../api"; +import {EventAction} from '../api' import { ClockCircleOutlined, DeleteOutlined, @@ -9,20 +9,31 @@ import { SignatureOutlined, SyncOutlined, UnlockOutlined -} from "@ant-design/icons"; -import React from "react"; +} from '@ant-design/icons' +import React from 'react' -export const actionToIcon = (a: EventAction) => a === 'registration' ? - : a === 'expiration' ? - : a === 'transfer' ? - : a === 'last changed' ? - : a === 'deletion' ? - : a === 'reregistration' ? - : a === 'locked' ? - : a === 'unlocked' ? - : a === 'registrar expiration' ? - : a === 'enum validation expiration' ? - : a === 'reinstantiation' ? - : - \ No newline at end of file +export const actionToIcon = (a: EventAction) => a === 'registration' + ? + : a === 'expiration' + ? + : a === 'transfer' + ? + : a === 'last changed' + ? + : a === 'deletion' + ? + : a === 'reregistration' + ? + : a === 'locked' + ? + : a === 'unlocked' + ? + : a === 'registrar expiration' + ? + : a === 'enum validation expiration' + ? + : a === 'reinstantiation' + ? + : diff --git a/assets/utils/functions/entityToName.tsx b/assets/utils/functions/entityToName.tsx index d5f8487..68249bd 100644 --- a/assets/utils/functions/entityToName.tsx +++ b/assets/utils/functions/entityToName.tsx @@ -1,5 +1,5 @@ -import {Entity} from "../api"; -import vCard from "vcf"; +import {Entity} from '../api' +import vCard from 'vcf' export const entityToName = (e: { entity: Entity }): string => { if (e.entity.jCard.length === 0) return e.entity.handle @@ -10,4 +10,4 @@ export const entityToName = (e: { entity: Entity }): string => { if (jCard.data.fn && !Array.isArray(jCard.data.fn) && jCard.data.fn.valueOf() !== '') name = jCard.data.fn.valueOf() return name -} \ No newline at end of file +} diff --git a/assets/utils/functions/eppStatusCodeToColor.tsx b/assets/utils/functions/eppStatusCodeToColor.tsx index 8ad7afd..66d83e4 100644 --- a/assets/utils/functions/eppStatusCodeToColor.tsx +++ b/assets/utils/functions/eppStatusCodeToColor.tsx @@ -1,5 +1,8 @@ export const eppStatusCodeToColor = (s: string) => - ['active', 'ok'].includes(s) ? 'green' : - ['pending delete', 'redemption period'].includes(s) ? 'red' : - s.startsWith('client') ? 'purple' : - s.startsWith('server') ? 'geekblue' : 'blue' \ No newline at end of file + ['active', 'ok'].includes(s) + ? 'green' + : ['pending delete', 'redemption period'].includes(s) + ? 'red' + : s.startsWith('client') + ? 'purple' + : s.startsWith('server') ? 'geekblue' : 'blue' diff --git a/assets/utils/functions/extractDetailsFromJCard.tsx b/assets/utils/functions/extractDetailsFromJCard.tsx index 82cd061..5349b47 100644 --- a/assets/utils/functions/extractDetailsFromJCard.tsx +++ b/assets/utils/functions/extractDetailsFromJCard.tsx @@ -1,9 +1,9 @@ -import vCard from "vcf"; -import {Entity} from "../api"; +import vCard from 'vcf' +import {Entity} from '../api' export const extractDetailsFromJCard = (e: { entity: Entity }): { fn?: string - organization?: string; + organization?: string } => { if (e.entity.jCard.length === 0) return {fn: e.entity.handle} const jCard = vCard.fromJSON(e.entity.jCard) @@ -11,4 +11,4 @@ export const extractDetailsFromJCard = (e: { entity: Entity }): { const organization = jCard.data.org && !Array.isArray(jCard.data.org) ? jCard.data.org.valueOf() : undefined return {fn, organization} -} \ No newline at end of file +} diff --git a/assets/utils/functions/getCountryCode.tsx b/assets/utils/functions/getCountryCode.tsx index ba8a482..e7c47a7 100644 --- a/assets/utils/functions/getCountryCode.tsx +++ b/assets/utils/functions/getCountryCode.tsx @@ -2,4 +2,4 @@ export const getCountryCode = (tld: string): string => { const exceptions = {uk: 'gb', su: 'ru', tp: 'tl'} if (tld in exceptions) return exceptions[tld as keyof typeof exceptions] return tld.toUpperCase() -} \ No newline at end of file +} diff --git a/assets/utils/functions/rdapTranslation.ts b/assets/utils/functions/rdapTranslation.ts index 9ca4193..77e7229 100644 --- a/assets/utils/functions/rdapTranslation.ts +++ b/assets/utils/functions/rdapTranslation.ts @@ -1,4 +1,4 @@ -import {t} from "ttag"; +import {t} from 'ttag' /** * @see https://www.iana.org/assignments/rdap-json-values/rdap-json-values.xhtml @@ -17,7 +17,6 @@ export const rdapRoleTranslation = () => ({ noc: t`Noc` }) - /** * @see https://www.iana.org/assignments/rdap-json-values/rdap-json-values.xhtml */ @@ -35,7 +34,6 @@ export const rdapRoleDetailTranslation = () => ({ noc: t`The entity object instance handles communications related to a network operations center (NOC).` }) - /** * @see https://www.iana.org/assignments/rdap-json-values/rdap-json-values.xhtml */ @@ -75,20 +73,20 @@ export const rdapEventDetailTranslation = () => ({ * @see https://www.icann.org/resources/pages/epp-status-codes-2014-06-16-en */ export const rdapStatusCodeDetailTranslation = () => ({ - 'validated': t`Signifies that the data of the object instance has been found to be accurate.`, + validated: t`Signifies that the data of the object instance has been found to be accurate.`, 'renew prohibited': t`Renewal or reregistration of the object instance is forbidden.`, 'update prohibited': t`Updates to the object instance are forbidden.`, 'transfer prohibited': t`Transfers of the registration from one registrar to another are forbidden.`, 'delete prohibited': t`Deletion of the registration of the object instance is forbidden.`, - 'proxy': t`The registration of the object instance has been performed by a third party.`, - 'private': t`The information of the object instance is not designated for public consumption.`, - 'removed': t`Some of the information of the object instance has not been made available and has been removed.`, - 'obscured': t`Some of the information of the object instance has been altered for the purposes of not readily revealing the actual information of the object instance.`, - 'associated': t`The object instance is associated with other object instances in the registry.`, - 'locked': t`Changes to the object instance cannot be made, including the association of other object instances.`, + proxy: t`The registration of the object instance has been performed by a third party.`, + private: t`The information of the object instance is not designated for public consumption.`, + removed: t`Some of the information of the object instance has not been made available and has been removed.`, + obscured: t`Some of the information of the object instance has been altered for the purposes of not readily revealing the actual information of the object instance.`, + associated: t`The object instance is associated with other object instances in the registry.`, + locked: t`Changes to the object instance cannot be made, including the association of other object instances.`, - 'active': t`This is the standard status for a domain, meaning it has no pending operations or prohibitions.`, - 'inactive': t`This status code indicates that delegation information (name servers) has not been associated with your domain. Your domain is not activated in the DNS and will not resolve.`, + active: t`This is the standard status for a domain, meaning it has no pending operations or prohibitions.`, + inactive: t`This status code indicates that delegation information (name servers) has not been associated with your domain. Your domain is not activated in the DNS and will not resolve.`, 'pending create': t`This status code indicates that a request to create your domain has been received and is being processed.`, 'pending renew': t`This status code indicates that a request to renew your domain has been received and is being processed.`, 'pending transfer': t`This status code indicates that a request to transfer your domain to a new registrar has been received and is being processed.`, @@ -96,7 +94,7 @@ export const rdapStatusCodeDetailTranslation = () => ({ 'pending delete': t`This status code may be mixed with redemptionPeriod or pendingRestore. In such case, depending on the status (i.e. redemptionPeriod or pendingRestore) set in the domain name, the corresponding description presented above applies. If this status is not combined with the redemptionPeriod or pendingRestore status, the pendingDelete status code indicates that your domain has been in redemptionPeriod status for 30 days and you have not restored it within that 30-day period. Your domain will remain in this status for several days, after which time your domain will be purged and dropped from the registry database. Once deletion occurs, the domain is available for re-registration in accordance with the registry's policies.`, 'add period': t`This grace period is provided after the initial registration of a domain name. If the registrar deletes the domain name during this period, the registry may provide credit to the registrar for the cost of the registration.`, 'auto renew period': t`This grace period is provided after a domain name registration period expires and is extended (renewed) automatically by the registry. If the registrar deletes the domain name during this period, the registry provides a credit to the registrar for the cost of the renewal.`, - 'ok': t`This is the standard status for a domain, meaning it has no pending operations or prohibitions.`, + ok: t`This is the standard status for a domain, meaning it has no pending operations or prohibitions.`, 'client delete prohibited': t`This status code tells your domain's registry to reject requests to delete the domain.`, 'client hold': t`This status code tells your domain's registry to not activate your domain in the DNS and as a consequence, it will not resolve. It is an uncommon status that is usually enacted during legal disputes, non-payment, or when your domain is subject to deletion.`, 'client renew prohibited': t`This status code tells your domain's registry to reject requests to renew your domain. It is an uncommon status that is usually enacted during legal disputes or when your domain is subject to deletion.`, @@ -112,6 +110,6 @@ export const rdapStatusCodeDetailTranslation = () => ({ 'server hold': t`This status code is set by your domain's Registry Operator. Your domain is not activated in the DNS.`, 'transfer period': t`This grace period is provided after the successful transfer of a domain name from one registrar to another. If the new registrar deletes the domain name during this period, the registry provides a credit to the registrar for the cost of the transfer.`, - 'administrative': t`The object instance has been allocated administratively (i.e., not for use by the recipient in their own right in operational networks).`, - 'reserved': t`The object instance has been allocated to an IANA special-purpose address registry.`, + administrative: t`The object instance has been allocated administratively (i.e., not for use by the recipient in their own right in operational networks).`, + reserved: t`The object instance has been allocated to an IANA special-purpose address registry.` }) diff --git a/assets/utils/functions/roleToAvatar.tsx b/assets/utils/functions/roleToAvatar.tsx index 2e685cb..b646245 100644 --- a/assets/utils/functions/roleToAvatar.tsx +++ b/assets/utils/functions/roleToAvatar.tsx @@ -1,4 +1,4 @@ -import {Avatar} from "antd"; +import {Avatar} from 'antd' import { BankOutlined, DollarOutlined, @@ -6,20 +6,22 @@ import { SignatureOutlined, ToolOutlined, UserOutlined -} from "@ant-design/icons"; -import React from "react"; +} from '@ant-design/icons' +import React from 'react' -import {rolesToColor} from "./rolesToColor"; +import {rolesToColor} from './rolesToColor' -export const roleToAvatar = (e: { roles: string[] }) => : - e.roles.includes('registrar') ? - : - e.roles.includes('administrative') ? - : - e.roles.includes('technical') ? - : - e.roles.includes('billing') ? - : - }/> \ No newline at end of file +export const roleToAvatar = (e: { roles: string[] }) => + : e.roles.includes('registrar') + ? + : e.roles.includes('administrative') + ? + : e.roles.includes('technical') + ? + : e.roles.includes('billing') + ? + : } +/> diff --git a/assets/utils/functions/rolesToColor.tsx b/assets/utils/functions/rolesToColor.tsx index ea0f2d7..c57a1d9 100644 --- a/assets/utils/functions/rolesToColor.tsx +++ b/assets/utils/functions/rolesToColor.tsx @@ -1,6 +1,11 @@ -export const rolesToColor = (roles: string[]) => roles.includes('registrant') ? 'green' : - roles.includes('registrar') ? 'purple' : - roles.includes('administrative') ? 'blue' : - roles.includes('technical') ? 'orange' : - roles.includes('sponsor') ? 'magenta' : - roles.includes('billing') ? 'cyan' : 'default' \ No newline at end of file +export const rolesToColor = (roles: string[]) => roles.includes('registrant') + ? 'green' + : roles.includes('registrar') + ? 'purple' + : roles.includes('administrative') + ? 'blue' + : roles.includes('technical') + ? 'orange' + : roles.includes('sponsor') + ? 'magenta' + : roles.includes('billing') ? 'cyan' : 'default' diff --git a/assets/utils/functions/showErrorAPI.tsx b/assets/utils/functions/showErrorAPI.tsx index ec28f01..73b32e3 100644 --- a/assets/utils/functions/showErrorAPI.tsx +++ b/assets/utils/functions/showErrorAPI.tsx @@ -1,9 +1,8 @@ -import {AxiosError, AxiosResponse} from "axios"; -import {MessageInstance, MessageType} from "antd/lib/message/interface"; -import {t} from "ttag"; +import {AxiosError, AxiosResponse} from 'axios' +import {MessageInstance, MessageType} from 'antd/lib/message/interface' +import {t} from 'ttag' export function showErrorAPI(e: AxiosError, messageApi: MessageInstance): MessageType | undefined { - const response = e.response as AxiosResponse const data = response.data @@ -24,4 +23,4 @@ export function showErrorAPI(e: AxiosError, messageApi: MessageInstance): Messag } return messageApi.error(detail !== '' ? detail : t`An error occurred`) -} \ No newline at end of file +} diff --git a/assets/utils/functions/sortDomainEntities.tsx b/assets/utils/functions/sortDomainEntities.tsx index a44f6e1..facb35e 100644 --- a/assets/utils/functions/sortDomainEntities.tsx +++ b/assets/utils/functions/sortDomainEntities.tsx @@ -1,11 +1,14 @@ -import {Domain} from "../api"; +import {Domain} from '../api' export const sortDomainEntities = (domain: Domain) => domain.entities .filter(e => !e.deleted) .sort((e1, e2) => { - const p = (r: string[]) => r.includes('registrant') ? 5 : - r.includes('administrative') ? 4 : - r.includes('billing') ? 3 : - r.includes('registrar') ? 2 : 1 + const p = (r: string[]) => r.includes('registrant') + ? 5 + : r.includes('administrative') + ? 4 + : r.includes('billing') + ? 3 + : r.includes('registrar') ? 2 : 1 return p(e2.roles) - p(e1.roles) - }) \ No newline at end of file + }) diff --git a/assets/utils/functions/tldToEmoji.tsx b/assets/utils/functions/tldToEmoji.tsx index 2640aac..f61bce5 100644 --- a/assets/utils/functions/tldToEmoji.tsx +++ b/assets/utils/functions/tldToEmoji.tsx @@ -1,4 +1,4 @@ -import {getCountryCode} from "./getCountryCode"; +import {getCountryCode} from './getCountryCode' export const tldToEmoji = (tld: string) => { if (tld.startsWith('xn--')) return '-' @@ -9,4 +9,4 @@ export const tldToEmoji = (tld: string) => { .split('') .map((char) => 127397 + char.charCodeAt(0)) ) -} \ No newline at end of file +} diff --git a/assets/utils/providers/index.tsx b/assets/utils/providers/index.tsx index 80d3264..5739b43 100644 --- a/assets/utils/providers/index.tsx +++ b/assets/utils/providers/index.tsx @@ -1,31 +1,40 @@ -import {ConnectorProvider} from "../api/connectors"; -import {Typography} from "antd"; -import {t} from "ttag"; -import React from "react"; +import {ConnectorProvider} from '../api/connectors' +import {Typography} from 'antd' +import {t} from 'ttag' +import React from 'react' export const helpGetTokenLink = (provider?: string) => { switch (provider) { case ConnectorProvider.OVH: - return - {t`Retrieve a set of tokens from your customer account on the Provider's website`} - + return ( + + {t`Retrieve a set of tokens from your customer account on the Provider's website`} + + ) case ConnectorProvider.GANDI: - return - {t`Retrieve a Personal Access Token from your customer account on the Provider's website`} - + return ( + + {t`Retrieve a Personal Access Token from your customer account on the Provider's website`} + + ) case ConnectorProvider.NAMECHEAP: - return - {t`Retreive an API key and whitelist this instance's IP address on Namecheap's website`} - + return ( + + {t`Retreive an API key and whitelist this instance's IP address on Namecheap's website`} + + ) case ConnectorProvider.AUTODNS: - return - {t`Because of some limitations in API of AutoDNS, we suggest to create an dedicated user for API with limited rights`} - + return ( + + {t`Because of some limitations in API of AutoDNS, we suggest to create an dedicated user for API with limited rights`} + + ) default: return <> - } } @@ -42,4 +51,4 @@ export const tosHyperlink = (provider?: string) => { default: return '' } -} \ No newline at end of file +} diff --git a/assets/utils/providers/ovh.tsx b/assets/utils/providers/ovh.tsx index c1cdc59..bb4b0d0 100644 --- a/assets/utils/providers/ovh.tsx +++ b/assets/utils/providers/ovh.tsx @@ -1,5 +1,5 @@ -import {t} from "ttag"; -import {regionNames} from "../../i18n"; +import {t} from 'ttag' +import {regionNames} from '../../i18n' export const ovhFields = () => ({ appKey: t`Application key`, @@ -24,4 +24,4 @@ export const ovhPricingMode = () => [ value: 'create-premium', label: t`The domain is free but can be premium. Its price varies from one domain to another` } -] \ No newline at end of file +] diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..54af736 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,29 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; +import pluginReact from "eslint-plugin-react"; + + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + { + files: ["**/*.{ts,tsx}"], + languageOptions: {globals: globals.browser}, + rules: { + semi: ["error", "never"] + }, + }, + { + ignores: ["public", "vendor", "webpack.config.js"] + }, + { + settings: { + react: { + version: "detect" + } + } + }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + pluginReact.configs.flat.recommended, +]; \ No newline at end of file diff --git a/package.json b/package.json index 26c0d49..8d2d064 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@babel/core": "^7.17.0", "@babel/preset-env": "^7.16.0", "@babel/preset-react": "^7.24.7", + "@eslint/js": "^9.17.0", "@fontsource/noto-color-emoji": "^5.0.27", "@hotwired/stimulus": "^3.0.0", "@hotwired/turbo": "^7.1.1 || ^8.0", @@ -37,6 +38,9 @@ "axios": "^1.7.2", "core-js": "^3.23.0", "dagre": "^0.8.5", + "eslint": "^9.17.0", + "eslint-plugin-react": "^7.37.3", + "globals": "^15.14.0", "html-loader": "^5.1.0", "html-to-image": "^1.11.11", "jsonld": "^8.3.2", @@ -51,6 +55,7 @@ "ttag": "^1.8.7", "ttag-cli": "^1.10.12", "typescript": "^5.5.3", + "typescript-eslint": "^8.19.0", "vcf": "^2.1.2", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", diff --git a/yarn.lock b/yarn.lock index 597413d..ad78b16 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1494,6 +1494,66 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.19.0": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" + integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== + dependencies: + "@eslint/object-schema" "^2.1.5" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.9.0": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.9.1.tgz#31763847308ef6b7084a4505573ac9402c51f9d1" + integrity sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" + integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.17.0", "@eslint/js@^9.17.0": + version "9.17.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.17.0.tgz#1523e586791f80376a6f8398a3964455ecc651ec" + integrity sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w== + +"@eslint/object-schema@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" + integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== + +"@eslint/plugin-kit@^0.2.3": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz#2b78e7bb3755784bb13faa8932a1d994d6537792" + integrity sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg== + dependencies: + levn "^0.4.1" + "@fastify/busboy@^2.0.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" @@ -1519,6 +1579,34 @@ resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-8.0.5.tgz#abae6dad018a891e4286e87fa0959217e3866d5a" integrity sha512-TdZDA7fxVQ2ZycygvpnzjGPmFq4sO/E2QVg+2em/sJ3YTSsIWVEis8HmWlumz+c9DjWcUkcCuB+muF08TInpAQ== +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" + integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -1583,6 +1671,27 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@nuxt/friendly-errors-webpack-plugin@^2.5.1": version "2.6.0" resolved "https://registry.yarnpkg.com/@nuxt/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-2.6.0.tgz#bd0cf6cd73b6e1d3e7c7f1c0de43333e69cc660c" @@ -1832,6 +1941,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.19.5" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" @@ -1898,7 +2012,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2046,6 +2160,87 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.0.tgz#2b1e1b791e21d5fc27ddc93884db066444f597b5" + integrity sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.19.0" + "@typescript-eslint/type-utils" "8.19.0" + "@typescript-eslint/utils" "8.19.0" + "@typescript-eslint/visitor-keys" "8.19.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.19.0.tgz#f1512e6e5c491b03aabb2718b95becde22b15292" + integrity sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw== + dependencies: + "@typescript-eslint/scope-manager" "8.19.0" + "@typescript-eslint/types" "8.19.0" + "@typescript-eslint/typescript-estree" "8.19.0" + "@typescript-eslint/visitor-keys" "8.19.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz#28fa413a334f70e8b506a968531e0a7c9c3076dc" + integrity sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA== + dependencies: + "@typescript-eslint/types" "8.19.0" + "@typescript-eslint/visitor-keys" "8.19.0" + +"@typescript-eslint/type-utils@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.19.0.tgz#41abd7d2e4cf93b6854b1fe6cbf416fab5abf89f" + integrity sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg== + dependencies: + "@typescript-eslint/typescript-estree" "8.19.0" + "@typescript-eslint/utils" "8.19.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.19.0.tgz#a190a25c5484a42b81eaad06989579fdeb478cbb" + integrity sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA== + +"@typescript-eslint/typescript-estree@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz#6b4f48f98ffad6597379951b115710f4d68c9ccb" + integrity sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw== + dependencies: + "@typescript-eslint/types" "8.19.0" + "@typescript-eslint/visitor-keys" "8.19.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.19.0.tgz#33824310e1fccc17f27fbd1030fd8bbd9a674684" + integrity sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.19.0" + "@typescript-eslint/types" "8.19.0" + "@typescript-eslint/typescript-estree" "8.19.0" + +"@typescript-eslint/visitor-keys@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz#dc313f735e64c4979c9073f51ffcefb6d9be5c77" + integrity sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w== + dependencies: + "@typescript-eslint/types" "8.19.0" + eslint-visitor-keys "^4.2.0" + "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" @@ -2236,11 +2431,21 @@ acorn-import-attributes@^1.9.5: resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn@^8.0.5, acorn@^8.7.1, acorn@^8.8.2: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + adjust-sourcemap-loader@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" @@ -2278,7 +2483,7 @@ ajv@6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.12.5: +ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2394,11 +2599,36 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + array-tree-filter@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" @@ -2416,6 +2646,62 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + assets-webpack-plugin@7.0.*: version "7.0.0" resolved "https://registry.yarnpkg.com/assets-webpack-plugin/-/assets-webpack-plugin-7.0.0.tgz#c61ed7466f35ff7a4d90d7070948736f471b8804" @@ -2430,6 +2716,13 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + axios@*, axios@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" @@ -2576,6 +2869,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -2624,6 +2924,14 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -2635,6 +2943,24 @@ call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -2994,6 +3320,15 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + css-declaration-sorter@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" @@ -3214,6 +3549,33 @@ data-uri-to-buffer@^4.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + dayjs@^1.11.11: version "1.11.12" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.12.tgz#5245226cc7f40a15bf52e0b99fd2a04669ccac1d" @@ -3240,6 +3602,13 @@ debug@^4.3.2: dependencies: ms "2.1.2" +debug@^4.3.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3255,6 +3624,11 @@ deep-equal@~1.0.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -3262,7 +3636,7 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" -define-data-property@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -3276,6 +3650,15 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -3326,6 +3709,13 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -3396,6 +3786,15 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3465,6 +3864,61 @@ error-stack-parser@^2.1.4: dependencies: stackframe "^1.3.4" +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6: + version "1.23.8" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.8.tgz#99754723118355d82fcef9ce4c90ccbcd5d2a285" + integrity sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.6" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-regex "^1.2.1" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.0" + math-intrinsics "^1.1.0" + object-inspect "^1.13.3" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.0" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.18" + es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -3472,16 +3926,75 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-iterator-helpers@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" + integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.6" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.4" + safe-array-concat "^1.1.3" + es-module-lexer@^1.2.1: version "1.5.4" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -3502,6 +4015,30 @@ 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-plugin-react@^7.37.3: + version "7.37.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz#567549e9251533975c4ea9706f986c3a64832031" + integrity sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.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" @@ -3510,6 +4047,80 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^9.17.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.17.0.tgz#faa1facb5dd042172fdc520106984b5c2421bb0c" + integrity sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.0" + "@eslint/core" "^0.9.0" + "@eslint/eslintrc" "^3.2.0" + "@eslint/js" "9.17.0" + "@eslint/plugin-kit" "^0.2.3" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.1" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.2.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -3522,7 +4133,7 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -3614,11 +4225,27 @@ 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-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + 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: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fast-levenshtein@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz#37b899ae47e1090e40e3fd2318e4d5f0142ca912" @@ -3636,6 +4263,13 @@ fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.7: resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== +fastq@^1.6.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" + integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== + dependencies: + reusify "^1.0.4" + faye-websocket@^0.11.3: version "0.11.4" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" @@ -3651,6 +4285,13 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -3694,6 +4335,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-up@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" @@ -3702,11 +4351,24 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +flatted@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + foldline@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/foldline/-/foldline-1.1.0.tgz#95017b3fc2cff156c167373897e76ceb32ae0964" @@ -3717,6 +4379,13 @@ follow-redirects@^1.0.0, follow-redirects@^1.15.6: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + foreachasync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" @@ -3773,6 +4442,23 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -3794,6 +4480,22 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" + integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== + dependencies: + call-bind-apply-helpers "^1.0.1" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + function-bind "^1.1.2" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.0.0" + get-port@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" @@ -3804,6 +4506,15 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + gettext-parser@6.0.0, gettext-parser@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gettext-parser/-/gettext-parser-6.0.0.tgz#201e61d92c1cc7edf8f6ee3a7e3d6ab1e061b44c" @@ -3814,13 +4525,20 @@ gettext-parser@6.0.0, gettext-parser@^6.0.0: readable-stream "^4.1.0" safe-buffer "^5.2.1" -glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" @@ -3843,6 +4561,24 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.14.0: + version "15.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.14.0.tgz#b8fd3a8941ff3b4d38f3319d433b61bbb482e73f" + integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -3861,11 +4597,21 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + graphlib@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" @@ -3890,6 +4636,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3900,7 +4651,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.2: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== @@ -3912,19 +4663,31 @@ has-proto@^1.0.1: resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" -hasown@^2.0.0, hasown@^2.0.2: +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -4096,7 +4859,12 @@ ignore@^5.1.8: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -import-fresh@^3.1.0: +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.1.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== @@ -4112,6 +4880,11 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + inflation@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.1.0.tgz#9214db11a47e6f756d111c4f9df96971c60f886c" @@ -4135,6 +4908,15 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -4150,11 +4932,34 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -4162,6 +4967,19 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.1.tgz#c20d0c654be05da4fbc23c562635c019e93daf89" + integrity sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-callable@^1.1.3, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-core-module@^2.13.0: version "2.15.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" @@ -4169,6 +4987,23 @@ is-core-module@^2.13.0: dependencies: hasown "^2.0.2" +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -4179,25 +5014,45 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-generator-function@^1.0.7: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" -is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4234,11 +5089,77 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef" + integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q== + dependencies: + call-bound "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -4251,6 +5172,11 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -4266,6 +5192,18 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +iterator.prototype@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.4.tgz#4ae6cf98b97fdc717b7e159d79dc25f8fc9482f1" + integrity sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + reflect.getprototypeof "^1.0.8" + set-function-name "^2.0.2" + jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" @@ -4302,6 +5240,13 @@ jest-worker@^29.4.3: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4312,6 +5257,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -4327,6 +5277,11 @@ json-schema-traverse@^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" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json2mq@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" @@ -4349,6 +5304,16 @@ jsonld@^8.3.2: lru-cache "^6.0.0" rdf-canonize "^3.4.0" +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + keygrip@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" @@ -4356,6 +5321,13 @@ keygrip@~1.1.0: dependencies: tsscmp "1.0.6" +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -4444,6 +5416,14 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.8.1" +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" + lilconfig@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" @@ -4483,6 +5463,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + locate-path@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" @@ -4505,6 +5492,11 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== +lodash.merge@^4.6.2: + 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.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -4565,6 +5557,11 @@ matchmediaquery@^0.4.2: dependencies: css-mediaquery "^0.1.2" +math-intrinsics@^1.0.0, math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + mdn-data@2.0.28: version "2.0.28" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" @@ -4597,6 +5594,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, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -4610,6 +5612,14 @@ micromatch@^4.0.0, micromatch@^4.0.2: braces "^3.0.3" picomatch "^2.3.1" +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -4655,13 +5665,20 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.1.1: +minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -4689,7 +5706,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -4707,6 +5724,11 @@ nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -4797,6 +5819,57 @@ object-inspect@^1.13.1: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -4856,6 +5929,18 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + 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.5" + ora@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ora/-/ora-1.3.0.tgz#80078dd2b92a934af66a3ad72a5b910694ede51a" @@ -4871,6 +5956,15 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +own-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^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" @@ -4878,6 +5972,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-limit@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" @@ -4899,6 +6000,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-locate@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" @@ -5082,6 +6190,11 @@ plural-forms@^0.5.3: resolved "https://registry.yarnpkg.com/plural-forms/-/plural-forms-0.5.5.tgz#d15ca5597aff37373c97edc039ba11659461120e" integrity sha512-rJw4xp22izsfJOVqta5Hyvep2lR3xPkFUtj7dyQtpf/FbxUiX7PQCajTn2EHDRylizH5N/Uqqodfdu22I0ju+g== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-calc@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" @@ -5328,6 +6441,11 @@ postcss@^8.2.14, postcss@^8.4.24, postcss@^8.4.33: picocolors "^1.0.1" source-map-js "^1.2.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== + pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -5346,7 +6464,7 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -prop-types@^15.6.1: +prop-types@^15.6.1, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -5392,6 +6510,11 @@ qs@^6.4.0: dependencies: side-channel "^1.0.6" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -5874,6 +6997,20 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.8, reflect.getprototypeof@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz#c905f3386008de95a62315f3ea8630404be19e2f" + integrity sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + dunder-proto "^1.0.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + which-builtin-type "^1.2.1" + regenerate-unicode-properties@^10.1.0: version "10.1.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" @@ -5908,6 +7045,16 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== +regexp.prototype.flags@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.2" + regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" @@ -6005,6 +7152,15 @@ resolve@^1.12.0, resolve@^1.14.2, resolve@^1.9.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -6018,6 +7174,11 @@ retry@^0.13.1: resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== +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== + rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -6032,6 +7193,24 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -6042,6 +7221,23 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@^5.2.1, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -6098,7 +7294,7 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.5.4: +semver@^7.3.2, semver@^7.3.4, semver@^7.5.4, semver@^7.6.0: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -6164,7 +7360,7 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.1: +set-function-length@^1.2.1, set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -6176,6 +7372,16 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -6237,6 +7443,35 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -6247,6 +7482,17 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -6341,6 +7587,65 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6374,6 +7679,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +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== + style-loader@^3.3.0: version "3.3.4" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" @@ -6523,6 +7833,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-api-utils@^1.3.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== + ts-loader@^9.5.1: version "9.5.1" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89" @@ -6595,6 +7910,13 @@ ttag@^1.8.7: dedent "1.5.1" plural-forms "^0.5.3" +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-is@^1.6.14, type-is@^1.6.16, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -6603,11 +7925,75 @@ type-is@^1.6.14, type-is@^1.6.16, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typescript-eslint@^8.19.0: + version "8.19.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.19.0.tgz#e4ff06b19f2f9807a2c26147a0199a109944d9e0" + integrity sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ== + dependencies: + "@typescript-eslint/eslint-plugin" "8.19.0" + "@typescript-eslint/parser" "8.19.0" + "@typescript-eslint/utils" "8.19.0" + typescript@^5.5.3: version "5.5.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -6879,11 +8265,63 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== +which-typed-array@^1.1.16, which-typed-array@^1.1.18: + version "1.1.18" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad" + integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" + for-each "^0.3.3" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -6903,6 +8341,11 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -6982,6 +8425,11 @@ ylru@^1.2.0: resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.4.0.tgz#0cf0aa57e9c24f8a2cbde0cc1ca2c9592ac4e0f6" integrity sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA== +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + yocto-queue@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110"