From 90967d437fa9bfc0a8f7a3dbae02205d12bd3240 Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Mon, 29 May 2023 20:14:42 +0100 Subject: [PATCH 001/191] feat: add beta flag for Onboarding Wizard and EmptyState to begin onboarding --- dashboard/components/layout/Layout.tsx | 40 +++++++++++++++---- .../layout/context/GlobalAppContext.tsx | 6 ++- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/dashboard/components/layout/Layout.tsx b/dashboard/components/layout/Layout.tsx index f85a7f67e..4262b744f 100644 --- a/dashboard/components/layout/Layout.tsx +++ b/dashboard/components/layout/Layout.tsx @@ -37,6 +37,10 @@ function Layout({ children }: LayoutProps) { } }, [telemetry]); + const betaFlagOnboardingWizard = true; // To test the onboarding wizard feature, set this beta-flag to true + const isOnboarding = + betaFlagOnboardingWizard && router.pathname.startsWith('/onboarding'); + return (
- {canRender && children} + {(canRender || isOnboarding) && children} + + {hasNoAccounts && betaFlagOnboardingWizard && !isOnboarding && ( + { + router.push('/onboarding'); + }} + actionLabel="Begin Onboarding" + secondaryAction={() => { + router.push( + 'https://github.com/tailwarden/komiser/issues/new/choose' + ); + }} + secondaryActionLabel="Report an issue" + mascotPose="greetings" + /> + )} - {hasNoAccounts && ( + {/* This block would be removed when onboarding Wizard is stable leaving the block above */} + {hasNoAccounts && !betaFlagOnboardingWizard && ( )} + {/* This block would be removed when onboarding Wizard is stable leaving the block above */} {error && ( void; + betaFlagOnboardingWizard: boolean; }; export const initialContext = { displayBanner: false, - dismissBanner: () => {}, + dismissBanner: () => { }, loading: false, data: undefined, error: false, hasNoAccounts: false, - fetch: () => {} + fetch: () => { }, + betaFlagOnboardingWizard: false }; const GlobalAppContext = createContext(initialContext); From da2333e367d304aec96931d56456e97b6fabb1a3 Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Mon, 29 May 2023 20:16:10 +0100 Subject: [PATCH 002/191] feat: add onboarding wizard page and layout --- .../OnboardingWizardLayout.tsx | 18 ++++++++++++++++ dashboard/pages/onboarding.tsx | 21 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx create mode 100644 dashboard/pages/onboarding.tsx diff --git a/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx new file mode 100644 index 000000000..561cfec99 --- /dev/null +++ b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx @@ -0,0 +1,18 @@ +import { ReactNode } from 'react'; + +type OnboardingWizardLayoutProps = { + children: ReactNode; +}; + +function OnboardingWizardLayout({ children }: OnboardingWizardLayoutProps) { + return ( +
+

+ Onboarding Wizard +

+ {children} +
+ ); +} + +export default OnboardingWizardLayout; diff --git a/dashboard/pages/onboarding.tsx b/dashboard/pages/onboarding.tsx new file mode 100644 index 000000000..4b4062620 --- /dev/null +++ b/dashboard/pages/onboarding.tsx @@ -0,0 +1,21 @@ +import Head from 'next/head'; + +import OnboardingWizardLayout from '../components/onboarding-wizard/OnboardingWizardLayout'; +import DashboardTopStats from '../components/dashboard/components/top-stats/DashboardTopStats'; +import DashboardCostExplorer from '../components/dashboard/components/cost-explorer/DashboardCostExplorer'; + +export default function Onboarding() { + return ( +
+ + Onboarding - Komiser + + + + + + + +
+ ); +} From 3b77c897d96ff0a2b8e29edc4fde813b69a5fb6d Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Mon, 29 May 2023 20:18:02 +0100 Subject: [PATCH 003/191] style: linter auto fixes --- dashboard/components/layout/Layout.tsx | 9 +++++---- dashboard/components/layout/context/GlobalAppContext.tsx | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/dashboard/components/layout/Layout.tsx b/dashboard/components/layout/Layout.tsx index 4262b744f..129ff6c57 100644 --- a/dashboard/components/layout/Layout.tsx +++ b/dashboard/components/layout/Layout.tsx @@ -57,10 +57,11 @@ function Layout({ children }: LayoutProps) {
{(canRender || isOnboarding) && children} diff --git a/dashboard/components/layout/context/GlobalAppContext.tsx b/dashboard/components/layout/context/GlobalAppContext.tsx index 8d18d7cad..c5c249519 100644 --- a/dashboard/components/layout/context/GlobalAppContext.tsx +++ b/dashboard/components/layout/context/GlobalAppContext.tsx @@ -20,12 +20,12 @@ export type GlobalAppContextProps = { export const initialContext = { displayBanner: false, - dismissBanner: () => { }, + dismissBanner: () => {}, loading: false, data: undefined, error: false, hasNoAccounts: false, - fetch: () => { }, + fetch: () => {}, betaFlagOnboardingWizard: false }; From ee7af229e8deb686171c6352c070768f3a108c9e Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Thu, 25 May 2023 23:13:42 +0530 Subject: [PATCH 004/191] feat: slack webhooks in frontend now as per new backend --- .../view/alerts/hooks/useSlackAlerts.tsx | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 dashboard/components/inventory/components/view/alerts/hooks/useSlackAlerts.tsx diff --git a/dashboard/components/inventory/components/view/alerts/hooks/useSlackAlerts.tsx b/dashboard/components/inventory/components/view/alerts/hooks/useSlackAlerts.tsx new file mode 100644 index 000000000..566bf4836 --- /dev/null +++ b/dashboard/components/inventory/components/view/alerts/hooks/useSlackAlerts.tsx @@ -0,0 +1,115 @@ +import { useEffect, useState } from 'react'; +import settingsService from '../../../../../../services/settingsService'; + +type useSlackAlertsProps = { + viewId: number; +}; + +export type SlackAlert = { + id: number; + name: string; + viewId: string; + type: 'BUDGET' | 'USAGE'; + budget?: number | string; + usage?: number | string; + IsSlack?: boolean; + endpoint?: string; + secret?: string; +}; + +function useSlackAlerts({ viewId }: useSlackAlertsProps) { + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + const [hasSlack, setHasSlack] = useState(false); + const [slackAlerts, setSlackAlerts] = useState(); + const [editSlackAlert, setEditSlackAlert] = useState(false); + const [currentSlackAlert, setCurrentSlackAlert] = useState(); + + function fetchSlackStatus() { + if (!loading) { + setLoading(true); + } + + if (error) { + setError(false); + } + + settingsService.getSlackIntegration().then(res => { + if (res === Error) { + setLoading(false); + setError(true); + } else { + setLoading(false); + setHasSlack(res.enabled); + } + }); + } + + function fetchViewAlerts() { + if (!loading) { + setLoading(true); + } + + if (error) { + setError(false); + } + + settingsService.getSlackAlertsFromAView(viewId).then(res => { + if (res === Error) { + setLoading(false); + setError(true); + } else { + setLoading(false); + setSlackAlerts(res); + } + }); + } + + function createOrEditSlackAlert(alertId?: number) { + if (alertId && slackAlerts) { + const foundSlackAlert = slackAlerts.find(alert => alert.id === alertId); + + if (foundSlackAlert) { + setCurrentSlackAlert(foundSlackAlert); + } + } + setEditSlackAlert(true); + } + + function closeSlackAlert(action?: 'hasChanges') { + setCurrentSlackAlert(undefined); + setEditSlackAlert(false); + + if (action === 'hasChanges') { + fetchViewAlerts(); + } + } + + useEffect(() => { + if (!hasSlack) { + fetchSlackStatus(); + } + + if (hasSlack && viewId) { + fetchViewAlerts(); + } + }, [hasSlack]); + + const hasNoSlackAlerts = + hasSlack && !editSlackAlert && slackAlerts && slackAlerts.length === 0; + + return { + loading, + error, + hasSlack, + slackAlerts, + hasNoSlackAlerts, + editSlackAlert, + currentSlackAlert, + createOrEditSlackAlert, + closeSlackAlert, + fetchViewAlerts + }; +} + +export default useSlackAlerts; From 9997841398b77d40d62129c347839e634cc8132a Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Tue, 13 Jun 2023 20:05:06 +0100 Subject: [PATCH 005/191] feat(onboarding-wizard): adding choose a cloud page --- dashboard/components/layout/Layout.tsx | 133 +++++++++--------- .../OnboardingWizardLayout.tsx | 39 ++++- .../onboarding-wizard/PageHeaders.tsx | 18 +++ .../onboarding-wizard/ProgressBar.tsx | 9 ++ dashboard/components/select/Select.tsx | 2 +- dashboard/pages/index.tsx | 7 +- dashboard/pages/onboarding.tsx | 118 +++++++++++++++- .../assets/img/others/onboarding-padlock.png | Bin 0 -> 73951 bytes 8 files changed, 249 insertions(+), 77 deletions(-) create mode 100644 dashboard/components/onboarding-wizard/PageHeaders.tsx create mode 100644 dashboard/components/onboarding-wizard/ProgressBar.tsx create mode 100644 dashboard/public/assets/img/others/onboarding-padlock.png diff --git a/dashboard/components/layout/Layout.tsx b/dashboard/components/layout/Layout.tsx index 129ff6c57..4ebc501aa 100644 --- a/dashboard/components/layout/Layout.tsx +++ b/dashboard/components/layout/Layout.tsx @@ -54,73 +54,78 @@ function Layout({ children }: LayoutProps) { betaFlagOnboardingWizard }} > - - -
- {(canRender || isOnboarding) && children} + {isOnboarding && <>{children}} - {hasNoAccounts && betaFlagOnboardingWizard && !isOnboarding && ( - { - router.push('/onboarding'); - }} - actionLabel="Begin Onboarding" - secondaryAction={() => { - router.push( - 'https://github.com/tailwarden/komiser/issues/new/choose' - ); - }} - secondaryActionLabel="Report an issue" - mascotPose="greetings" - /> - )} + {!isOnboarding && ( + <> + + +
+ {canRender && children} - {/* This block would be removed when onboarding Wizard is stable leaving the block above */} - {hasNoAccounts && !betaFlagOnboardingWizard && ( - { - router.push( - 'https://docs.komiser.io/docs/introduction/getting-started?utm_source=komiser&utm_medium=referral&utm_campaign=static' - ); - }} - actionLabel="Guide to connect account" - secondaryAction={() => { - router.push( - 'https://github.com/tailwarden/komiser/issues/new/choose' - ); - }} - secondaryActionLabel="Report an issue" - mascotPose="thinking" - /> - )} - {/* This block would be removed when onboarding Wizard is stable leaving the block above */} + {hasNoAccounts && betaFlagOnboardingWizard && !isOnboarding && ( + { + router.push('/onboarding'); + }} + actionLabel="Begin Onboarding" + secondaryAction={() => { + router.push( + 'https://github.com/tailwarden/komiser/issues/new/choose' + ); + }} + secondaryActionLabel="Report an issue" + mascotPose="greetings" + /> + )} - {error && ( - router.reload()} - > - Refresh the page - - } - /> - )} -
+ {/* This block would be removed when onboarding Wizard is stable leaving the block above */} + {hasNoAccounts && !betaFlagOnboardingWizard && ( + { + router.push( + 'https://docs.komiser.io/docs/introduction/getting-started?utm_source=komiser&utm_medium=referral&utm_campaign=static' + ); + }} + actionLabel="Guide to connect account" + secondaryAction={() => { + router.push( + 'https://github.com/tailwarden/komiser/issues/new/choose' + ); + }} + secondaryActionLabel="Report an issue" + mascotPose="thinking" + /> + )} + {/* This block would be removed when onboarding Wizard is stable leaving the block above */} + + {error && ( + router.reload()} + > + Refresh the page + + } + /> + )} +
+ + )} ); } diff --git a/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx index 561cfec99..6efdc8df7 100644 --- a/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx +++ b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx @@ -1,18 +1,45 @@ import { ReactNode } from 'react'; -type OnboardingWizardLayoutProps = { +import OnboardingWizardHeader from './PageHeaders'; +import OnboardingWizardProgressBar from './ProgressBar'; + +function OnboardingWizardLayout({ children }: { children: ReactNode }) { + return ( +
+ {children} +
+ ); +} + +type LeftSideLayoutProps = { + title: string; children: ReactNode; + progressBarWidth: string; }; -function OnboardingWizardLayout({ children }: OnboardingWizardLayoutProps) { +function LeftSideLayout({ + title, + children, + progressBarWidth +}: LeftSideLayoutProps) { + return ( +
+ +
+ + {children} +
+
+ ); +} + +function RightSideLayout({ children }: { children: ReactNode }) { return ( -
-

- Onboarding Wizard -

+
{children}
); } export default OnboardingWizardLayout; +export { LeftSideLayout, RightSideLayout }; diff --git a/dashboard/components/onboarding-wizard/PageHeaders.tsx b/dashboard/components/onboarding-wizard/PageHeaders.tsx new file mode 100644 index 000000000..4c48dee84 --- /dev/null +++ b/dashboard/components/onboarding-wizard/PageHeaders.tsx @@ -0,0 +1,18 @@ +import Image from 'next/image'; + +function OnboardingWizardHeader({ title }: { title: string }) { + return ( + <> + Komiser Logo +
{title}
+ + ); +} + +export default OnboardingWizardHeader; diff --git a/dashboard/components/onboarding-wizard/ProgressBar.tsx b/dashboard/components/onboarding-wizard/ProgressBar.tsx new file mode 100644 index 000000000..4cd49a8b0 --- /dev/null +++ b/dashboard/components/onboarding-wizard/ProgressBar.tsx @@ -0,0 +1,9 @@ +function OnboardingWizardProgressBar({ width }: { width: string }) { + return ( +
+
+
+ ); +} + +export default OnboardingWizardProgressBar; diff --git a/dashboard/components/select/Select.tsx b/dashboard/components/select/Select.tsx index 50c5b74d3..b7484102e 100644 --- a/dashboard/components/select/Select.tsx +++ b/dashboard/components/select/Select.tsx @@ -54,7 +54,7 @@ function Select({ onClick={toggle} className="fixed inset-0 z-20 hidden animate-fade-in bg-transparent opacity-0 sm:block" >
-
+
{values.map((item, idx) => { const isActive = value === item; diff --git a/dashboard/pages/index.tsx b/dashboard/pages/index.tsx index da9981877..c4db781b3 100644 --- a/dashboard/pages/index.tsx +++ b/dashboard/pages/index.tsx @@ -3,9 +3,14 @@ import { useEffect } from 'react'; function Home() { const router = useRouter(); + const isBetaFlagOnboardingWizard = true; useEffect(() => { - router.push('/dashboard'); + if (isBetaFlagOnboardingWizard) { + router.push('/onboarding'); + } else { + router.push('/dashboard'); + } }, []); } diff --git a/dashboard/pages/onboarding.tsx b/dashboard/pages/onboarding.tsx index 4b4062620..fceaf0f01 100644 --- a/dashboard/pages/onboarding.tsx +++ b/dashboard/pages/onboarding.tsx @@ -1,10 +1,61 @@ +import { useState } from 'react'; import Head from 'next/head'; +import Image from 'next/image'; +import { useRouter } from 'next/navigation'; -import OnboardingWizardLayout from '../components/onboarding-wizard/OnboardingWizardLayout'; -import DashboardTopStats from '../components/dashboard/components/top-stats/DashboardTopStats'; -import DashboardCostExplorer from '../components/dashboard/components/cost-explorer/DashboardCostExplorer'; +import Select from '../components/select/Select'; +import Button from '../components/button/Button'; +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../components/onboarding-wizard/OnboardingWizardLayout'; + +const SelectCloud = { + 'Amazon Web Services': 'aws', + 'Microsoft Azure': 'azure', + 'Google Cloud Platform': 'gcp', + 'Oracle Cloud Infrastructure': 'oci', + Kubernetes: 'kubernetes', + 'Digital Ocean': 'digitalocean', + Civo: 'civo', + 'MongoDB Atlas': 'mongodbatlas', + 'Tencent Cloud': 'tencent', + Scaleway: 'scaleway', + 'OVH Cloud': 'ovh', + Linode: 'linode' +} as const; + +type Clouds = keyof typeof SelectCloud; +type CloudsValues = (typeof SelectCloud)[Clouds]; + +const cloudLogo: { [K in CloudsValues]: string } = { + aws: '/assets/img/providers/aws.png', + azure: '/assets/img/providers/azure.svg', + gcp: '/assets/img/providers/gcp.png', + oci: '/assets/img/providers/oci.png', + civo: '/assets/img/providers/civo.jpeg', + tencent: '/assets/img/providers/tencent.jpeg', + kubernetes: '/assets/img/providers/kubernetes.png', + digitalocean: '/assets/img/providers/digitalocean.png', + mongodbatlas: '/assets/img/providers/mongodbatlas.jpg', + scaleway: '/assets/img/providers/scaleway.png', + ovh: '/assets/img/providers/ovh.jpeg', + linode: '/assets/img/providers/linode.png' +}; export default function Onboarding() { + const router = useRouter(); + const [provider, setProvider] = useState('aws'); + + const handleNext = () => { + console.log('next clicked'); + }; + + const handleSuggest = () => + router.replace( + 'https://docs.komiser.io/docs/faqs#how-can-i-request-a-new-feature' + ); + return (
@@ -13,8 +64,65 @@ export default function Onboarding() { - - + +
+
+ Komiser is cloud agnostic, one platform across all major public + cloud
providers. +
+
Get started now by connecting your first account.
+
+
+ +
+
+ ); +} + +export default LabelledInput; diff --git a/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx index 6efdc8df7..5edb495b3 100644 --- a/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx +++ b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx @@ -23,7 +23,7 @@ function LeftSideLayout({ progressBarWidth }: LeftSideLayoutProps) { return ( -
+
diff --git a/dashboard/pages/onboarding/azure.tsx b/dashboard/pages/onboarding/azure.tsx new file mode 100644 index 000000000..6a8720466 --- /dev/null +++ b/dashboard/pages/onboarding/azure.tsx @@ -0,0 +1,88 @@ +import Head from 'next/head'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../components/onboarding-wizard/OnboardingWizardLayout'; +import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; +import CredentialsButton from '../../components/onboarding-wizard/CredentialsButton'; + +export default function AzureCredentials() { + const handleNext = () => { }; + + return ( +
+ + Setup Azure - Komiser + + + + + +
+
+ Microsoft Azure is Microsoft's public cloud computing + platform. It provides a broad range of cloud services, including + compute, analytics, storage and networking. Users can pick and + choose from these services to develop and scale new applications + or run existing applications in the public cloud. +
+
+ Read our guide on{' '} + + adding an Azure account to Komiser. + +
+
+ +
+ + +
+ + + + + +
+
+ + +
+ + +
+

Azure Video Here

+
+
+
+
+ ); +} diff --git a/dashboard/styles/globals.css b/dashboard/styles/globals.css index c5eaec72d..9a5a85d5b 100644 --- a/dashboard/styles/globals.css +++ b/dashboard/styles/globals.css @@ -24,3 +24,15 @@ background: #95a3a3; } } + +@variants responsive { + /* Chrome, Safari and Opera */ + .no-scrollbar::-webkit-scrollbar { + display: none; + } + + .no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + } +} From c06b8612ace1bd6846b15b32ddf5a6113d72fb2f Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 28 Jun 2023 06:47:40 +0100 Subject: [PATCH 008/191] feat(component): choose database assets and page --- .../OnboardingWizardLayout.tsx | 26 ++- .../pages/onboarding/choose-database.tsx | 177 ++++++++++++++++++ .../assets/img/database/db-arrow-vector.svg | 9 + .../public/assets/img/database/postgresql.svg | 9 + .../assets/img/database/selectdb-komiser.svg | 96 ++++++++++ .../public/assets/img/database/sqlite.svg | 9 + dashboard/styles/globals.css | 5 + 7 files changed, 327 insertions(+), 4 deletions(-) create mode 100644 dashboard/pages/onboarding/choose-database.tsx create mode 100644 dashboard/public/assets/img/database/db-arrow-vector.svg create mode 100644 dashboard/public/assets/img/database/postgresql.svg create mode 100644 dashboard/public/assets/img/database/selectdb-komiser.svg create mode 100644 dashboard/public/assets/img/database/sqlite.svg diff --git a/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx index 5edb495b3..1b2d9de58 100644 --- a/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx +++ b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx @@ -33,11 +33,29 @@ function LeftSideLayout({ ); } -function RightSideLayout({ children }: { children: ReactNode }) { +interface RightSideLayoutProps { + children: ReactNode; + isCustom?: boolean; + customClasses?: string; +} + +function RightSideLayout({ + isCustom, + children, + customClasses +}: RightSideLayoutProps) { return ( -
- {children} -
+ <> + {isCustom ? ( +
+ {children} +
+ ) : ( +
+ {children} +
+ )} + ); } diff --git a/dashboard/pages/onboarding/choose-database.tsx b/dashboard/pages/onboarding/choose-database.tsx new file mode 100644 index 000000000..5f0afc413 --- /dev/null +++ b/dashboard/pages/onboarding/choose-database.tsx @@ -0,0 +1,177 @@ +import { useState } from 'react'; +import Head from 'next/head'; +import Image from 'next/image'; +import { useRouter } from 'next/navigation'; + +import Button from '../../components/button/Button'; +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../components/onboarding-wizard/OnboardingWizardLayout'; + +type DB = 'postgres' | 'sqlite'; + +interface DatabaseItemProps { + value: DB; + selected: DB; + label?: string; + imageUrl: string; + handleClick: (db: DB) => void; +} + +function DatabaseLeftItem({ + imageUrl, + label, + value, + selected, + handleClick +}: DatabaseItemProps) { + const onClick = () => handleClick(value); + + return ( +
+ {`${label} +
{label}
+
+ ); +} + +function DatabaseRightItem({ + imageUrl, + value, + selected, + handleClick +}: DatabaseItemProps) { + const onClick = () => handleClick(value); + + return ( +
+ {`${value} +
+ ); +} + +export default function Onboarding() { + const router = useRouter(); + const [database, setDatabase] = useState('postgres'); + + const handleNext = () => { + router.push(`/database/`); + }; + + const handleClick = (db: DB) => setDatabase(db); + + return ( +
+ + Select Database - Komiser + + + + + +
+
+ Add a way to store and retain data through a database, so that it + remains accessible and preserved even after you end your session + on Komiser. +
+
+
+

Select a database type

+
+ + +
+
+
+ +
+
+ + +
+ Komiser Logo + +
+ Komiser Logo +
+ +
+ + +
+
+
+
+
+ ); +} diff --git a/dashboard/public/assets/img/database/db-arrow-vector.svg b/dashboard/public/assets/img/database/db-arrow-vector.svg new file mode 100644 index 000000000..3e1ec6696 --- /dev/null +++ b/dashboard/public/assets/img/database/db-arrow-vector.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dashboard/public/assets/img/database/postgresql.svg b/dashboard/public/assets/img/database/postgresql.svg new file mode 100644 index 000000000..48630cfd6 --- /dev/null +++ b/dashboard/public/assets/img/database/postgresql.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dashboard/public/assets/img/database/selectdb-komiser.svg b/dashboard/public/assets/img/database/selectdb-komiser.svg new file mode 100644 index 000000000..474bae6ae --- /dev/null +++ b/dashboard/public/assets/img/database/selectdb-komiser.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dashboard/public/assets/img/database/sqlite.svg b/dashboard/public/assets/img/database/sqlite.svg new file mode 100644 index 000000000..3c074907d --- /dev/null +++ b/dashboard/public/assets/img/database/sqlite.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dashboard/styles/globals.css b/dashboard/styles/globals.css index 9a5a85d5b..59fb937e3 100644 --- a/dashboard/styles/globals.css +++ b/dashboard/styles/globals.css @@ -36,3 +36,8 @@ scrollbar-width: none; /* Firefox */ } } + +.rotate-onboarding-arrow { + /* flip horizontally */ + transform: rotateY(180deg); +} From 626d720644d74ce6bec32e035b12a1ba5ff0799e Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 28 Jun 2023 06:54:04 +0100 Subject: [PATCH 009/191] feat(component): custom inputs for onboarding-wizard --- dashboard/components/layout/Layout.tsx | 9 +- .../onboarding-wizard/LabelledInput.tsx | 34 ++++++-- .../onboarding-wizard/SelectInput.tsx | 82 +++++++++++++++++++ 3 files changed, 115 insertions(+), 10 deletions(-) create mode 100644 dashboard/components/onboarding-wizard/SelectInput.tsx diff --git a/dashboard/components/layout/Layout.tsx b/dashboard/components/layout/Layout.tsx index 4ebc501aa..f4c76e9d4 100644 --- a/dashboard/components/layout/Layout.tsx +++ b/dashboard/components/layout/Layout.tsx @@ -61,10 +61,11 @@ function Layout({ children }: LayoutProps) {
{canRender && children} diff --git a/dashboard/components/onboarding-wizard/LabelledInput.tsx b/dashboard/components/onboarding-wizard/LabelledInput.tsx index 4c0b0e06f..336b25286 100644 --- a/dashboard/components/onboarding-wizard/LabelledInput.tsx +++ b/dashboard/components/onboarding-wizard/LabelledInput.tsx @@ -1,17 +1,29 @@ +import { ReactNode } from 'react'; + interface LabelledInputProps { + id: string; + value?: any; + type: string; label: string; + icon?: ReactNode; subLabel?: string; - placeholder: string; + disabled?: boolean; + placeholder?: string; } function LabelledInput({ + id, + icon, + type, label, + value, subLabel, - placeholder = '' + placeholder, + disabled = false }: LabelledInputProps) { return (
-
diff --git a/dashboard/components/onboarding-wizard/SelectInput.tsx b/dashboard/components/onboarding-wizard/SelectInput.tsx new file mode 100644 index 000000000..de872a148 --- /dev/null +++ b/dashboard/components/onboarding-wizard/SelectInput.tsx @@ -0,0 +1,82 @@ +import { useState } from 'react'; +import classNames from 'classnames'; +import ChevronDownIcon from '../icons/ChevronDownIcon'; + +export type SelectInputProps = { + label: string; + value: string; + values: string[]; + displayValues: string[]; + handleChange: (value: string) => void; +}; + +function SelectInput({ + label, + value, + values, + displayValues, + handleChange +}: SelectInputProps) { + const [isOpen, setIsOpen] = useState(false); + const index = values.findIndex(currentValue => currentValue === value); + + function toggle() { + setIsOpen(!isOpen); + } + + return ( +
+
+ +
+ + + {isOpen && ( + <> +
+
+
+ {values.map((item, idx) => { + const isActive = value === item; + return ( + + ); + })} +
+
+ + )} +
+ ); +} + +export default SelectInput; From 94662ab371e03846e744b3c58e4b2d9a857971a8 Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 28 Jun 2023 12:45:33 +0100 Subject: [PATCH 010/191] feat(component): cloud providers setup --- dashboard/pages/onboarding/aws.tsx | 170 ++++++++++++++++++++ dashboard/pages/onboarding/azure.tsx | 56 ++++++- dashboard/pages/onboarding/civo.tsx | 114 +++++++++++++ dashboard/pages/onboarding/digitalocean.tsx | 114 +++++++++++++ dashboard/pages/onboarding/kubernetes.tsx | 157 ++++++++++++++++++ 5 files changed, 608 insertions(+), 3 deletions(-) create mode 100644 dashboard/pages/onboarding/aws.tsx create mode 100644 dashboard/pages/onboarding/civo.tsx create mode 100644 dashboard/pages/onboarding/digitalocean.tsx create mode 100644 dashboard/pages/onboarding/kubernetes.tsx diff --git a/dashboard/pages/onboarding/aws.tsx b/dashboard/pages/onboarding/aws.tsx new file mode 100644 index 000000000..fc928e0ba --- /dev/null +++ b/dashboard/pages/onboarding/aws.tsx @@ -0,0 +1,170 @@ +import { useState } from 'react'; +import Head from 'next/head'; +import { useRouter } from 'next/router'; + +import Button from '../../components/button/Button'; +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../components/onboarding-wizard/OnboardingWizardLayout'; +import SelectInput from '../../components/onboarding-wizard/SelectInput'; +import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; + +export default function AWSCredentials() { + const router = useRouter(); + const [provider, setProvider] = useState('aws'); + + const handleNext = () => { + router.push(`/onboarding/${provider}`); + }; + + const handleSuggest = () => + router.replace( + 'https://docs.komiser.io/docs/faqs#how-can-i-request-a-new-feature' + ); + + return ( +
+ + Setup AWS - Komiser + + + + + +
+
+ AWS is a cloud computing platform that provides infrastructure + services, application services, and developer tools provided by + Amazon. +
+
+ Read our guide on{' '} + + adding an AWS account to Komiser. + +
+
+
+ +
+
+ +
+
+ + + + + + +
+ + +
+
+ + setProvider(value)} + label="Cloud provider" + value={provider} + values={['1']} + /> + + +
+
+
+ + +
+
+ + +
+

AWS Video Here

+
+
+
+
+ ); +} diff --git a/dashboard/pages/onboarding/azure.tsx b/dashboard/pages/onboarding/azure.tsx index 6a8720466..092651da5 100644 --- a/dashboard/pages/onboarding/azure.tsx +++ b/dashboard/pages/onboarding/azure.tsx @@ -8,7 +8,7 @@ import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; import CredentialsButton from '../../components/onboarding-wizard/CredentialsButton'; export default function AzureCredentials() { - const handleNext = () => { }; + const handleNext = () => {}; return (
@@ -34,7 +34,7 @@ export default function AzureCredentials() { Read our guide on{' '} @@ -45,28 +45,78 @@ export default function AzureCredentials() {
- + + + + + } + /> + {}; + + return ( + + ); +} diff --git a/dashboard/pages/onboarding/digitalocean.tsx b/dashboard/pages/onboarding/digitalocean.tsx new file mode 100644 index 000000000..d418b816e --- /dev/null +++ b/dashboard/pages/onboarding/digitalocean.tsx @@ -0,0 +1,114 @@ +import Head from 'next/head'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../components/onboarding-wizard/OnboardingWizardLayout'; +import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; +import CredentialsButton from '../../components/onboarding-wizard/CredentialsButton'; + +export default function AzureCredentials() { + const handleNext = () => {}; + + return ( +
+ + Setup DigitalOcean - Komiser + + + + + +
+
+ DigitalOcean is a cloud hosting provider that offers cloud + computing services and Infrastructure as a Service (IaaS). +
+ +
+ +
+ + +
+ + + + + + } + /> + +
+
+ + +
+ + +
+

DigitalOcean Video Here

+
+
+
+
+ ); +} diff --git a/dashboard/pages/onboarding/kubernetes.tsx b/dashboard/pages/onboarding/kubernetes.tsx new file mode 100644 index 000000000..1e36b5bb2 --- /dev/null +++ b/dashboard/pages/onboarding/kubernetes.tsx @@ -0,0 +1,157 @@ +import { useState } from 'react'; +import Head from 'next/head'; +import { useRouter } from 'next/router'; + +import Button from '../../components/button/Button'; +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../components/onboarding-wizard/OnboardingWizardLayout'; +import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; + +export default function AWSCredentials() { + const router = useRouter(); + const [provider, setProvider] = useState('aws'); + + const handleNext = () => { + router.push(`/onboarding/${provider}`); + }; + + const handleSuggest = () => + router.replace( + 'https://docs.komiser.io/docs/faqs#how-can-i-request-a-new-feature' + ); + + return ( +
+ + Setup Kubernetes - Komiser + + + + + +
+
+ Kubernetes, also known as K8s, is an open-source system for + automating deployment, scaling, and management of containerized + applications. +
+ +
+
+ +
+
+ +
+
+ + + + + + +
+ + + +
+
+
+ +
+
+
+
+ + +
+
+ + +
+

Kubernetes Video Here

+
+
+
+
+ ); +} From 8bad3407039cca07405e3a996f4a170402dbe33c Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 28 Jun 2023 12:56:07 +0100 Subject: [PATCH 011/191] feat(component): choose database completed --- dashboard/pages/onboarding/choose-database.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dashboard/pages/onboarding/choose-database.tsx b/dashboard/pages/onboarding/choose-database.tsx index 5f0afc413..864110555 100644 --- a/dashboard/pages/onboarding/choose-database.tsx +++ b/dashboard/pages/onboarding/choose-database.tsx @@ -64,7 +64,8 @@ function DatabaseRightItem({ {`${value} @@ -76,9 +77,7 @@ export default function Onboarding() { const router = useRouter(); const [database, setDatabase] = useState('postgres'); - const handleNext = () => { - router.push(`/database/`); - }; + const handleNext = () => router.push(`/onboarding/database/${database}`); const handleClick = (db: DB) => setDatabase(db); From d7a1927165151d6e8c3a632715d8cc111c40ce33 Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 28 Jun 2023 13:57:36 +0100 Subject: [PATCH 012/191] feat(component): complete onboarding page --- dashboard/pages/onboarding/complete.tsx | 66 ++++++++++++++++++ .../assets/img/others/empty-dashboard.png | Bin 0 -> 38855 bytes 2 files changed, 66 insertions(+) create mode 100644 dashboard/pages/onboarding/complete.tsx create mode 100644 dashboard/public/assets/img/others/empty-dashboard.png diff --git a/dashboard/pages/onboarding/complete.tsx b/dashboard/pages/onboarding/complete.tsx new file mode 100644 index 000000000..3f7f3355c --- /dev/null +++ b/dashboard/pages/onboarding/complete.tsx @@ -0,0 +1,66 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import { useRouter } from 'next/navigation'; + +import Button from '../../components/button/Button'; +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../components/onboarding-wizard/OnboardingWizardLayout'; + +export default function OnboardingComplete() { + const router = useRouter(); + + return ( +
+ + Onboarding Complete - Komiser + + + + + +
+ Rocket +

+ Your data is being synced +

+
+ Processing time for your data varies based on its complexity. You + can start using Komiser with the available data. +
+ +
+
+ + +
+ Dashboard +
+
+
+
+ ); +} diff --git a/dashboard/public/assets/img/others/empty-dashboard.png b/dashboard/public/assets/img/others/empty-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..ad468bf6fde5461935447a31fe2a37566389b0ed GIT binary patch literal 38855 zcmYIPcQ~8x*YBW;8ZAm>qpqy<-$b?bT9L?OoI!sa>sAqqf+aR1vj{sx9^kLhTtl zBEuW~{;uo&BbO_=pXc1?xt}vW=W~u|9W7M~vWH~Xu3e*0d+}WF+O->WgwN~Sw+O#5 z2lqG-{*bKnD^3I@K{_gYCmS{wTzFbhS{^qkQ;f0gYAPj8V%+w}9^ikYz{#X8fFM0F3QG4z-^ z1L3}Y0$(itrVYkeakyu7yT7}~;m#O?=*oF!{{8ih8RjQq*KgeU@Fbk*Mq$oyQr##w2Hv|lt|FqUjI9*?&- z>=aEm445?A=kzye4zo8 z8F##JEDpab4fJwZKyDq^?)VOiZhE^&K`r8)=G9YcDx_%Y<7=vx8~I@aUHyN!w!{>Z#9cMm1Zgl;NO>od+i3# zBZ}jzrbWFPc5((-rn?tPG%kF$oJO{MT$>9UMjZlL_ft;J76Jy%H?-RK>HvX&RjChi z=1rPe=$vL3)Ldahww$*QXba)h1Q?snhu4m5waf>6pO&52da!;B+d$y<&2P$G)}pZu zI0>y--jk5Gi(BJA>gtktrGv3Qvt$FHE>Yg*HLp%4n%w;tYpis5%(DfREvOH~vt;Exq(-(x%O$HVa$k1ZrS(K=;S4O7dLo-{E)WzC_ul*vx8*dk zWxhms!uD~3+@6ig{$SfRbh~=#h+cnRQa*9CRZmO)T!&=6vz1ME0R9*(u(JURP_D%% zX562iYMGpz^mTXFb#t<`WQ7ix@bJxkqsF=pRYJV0fmT7-)=NCbW*-Xwn|KlU#e`~S zN&Fm##Rj&twe4F1URh)p&fp9yCT;mskENNz%#c&2HmB9iiR4xdPlo+y7fy%p3owbr z=E<6&boAEBi@515;dMBIZJHGG`&4klW^^YFvAHKTO}EnoR`7_OX!A;Ius7lMrOYXzP0L$rbT$qi_YOWOnNu`zkvQiK7Zn84yR|PQ2?Ukl7W4WDGin*|s()Lh0FHO|^@penZR+gZHw&h(VsJ3K~j z9RKr*%M?3EfzI`+-v#P_edqcu-Eh5rZn~nqe^%mmyaZ$q!!H5~1}!{CrQL#kat)67 z-?T6QX4(uzO~-+AD9?_DnB!VVq3*=HD}@)N##s_S9~Z&^#l zOH)6%PY#w2IfXTYrJeN$Tc9h(1K)!s>v7i1!>YJp=4M$A_c*G76S={f&jEvFJ72Q` zwtt?;4Ylog?~1;tMpQNU(@&gw#A8}KozKn}j@?mf`1*li={@`S1^gdbl3{VyB3!~c90LC8t!!>Lh z4rewEqgy$e!|>T^Geqk?l<%~@ZqFfZvUM>#PGGjW6|~yln(YdFlNv~Ue&!P;Eu#&U z<)zQUEVP;j;?dZvqjYNkV|&SH)!F`L8zMG<2iGrm9Ek+!BZJp6?0iYoEslhuDADm% zRef!;;+u%QA&V){bT$)g1=Exv3>27EXIspKHB9LqpWP?p>nMB^cPN<&;~;6=$9h8& z{eMh4W;q)V=@+CxaWg?|?S?xO6Ji2oF2mCBT8u01ZJP@-)K87cYKYP52f!2i3N@A^ z>%MnnLj|`GKb~4R)q{K04Ai&^?AAJG8-sM6a= zaUNjK42aD>)^NKl4=S!+3EXBtWq3L|Ibr|sHeh}=?s$3+^GLRx_(>2#-`=8~cPkXv zxVQEO=wpTo+-v+?J80f~62!TMP^;i`7nrkq+u9|ye>iKUj%eQZg7*AfOYg}*sq(@I|NsFd3Yhf@D zpqFVkqC8vmH2(=a+o`X-FyopXX={|6ML))A%8~TJs{KFG+}ZOtsa` zOs(c(kG|ky(J_enA>nq!3xO`Vv7V2ogHnA$o_8MB^IBB+J*Zz;O?!rr4E9+xoGyUb z)nL>u1ZoFm+fShGT4z6{%#1P3P|x3@VxT>-1NiEk#0LCuMz3ego7pyi;%o6jwJfDG z4Q6v@eY-iJb=+mcycUYfXn$mT+2@^wDIGseI%%7*j)&|uWd=D*^jO0tb20-Uh4JH1 znBnxOWRBJb6jnLD^>E3Jsiz#8soUcOsg-cq-bb{q@B1}x%y=_yS!q~2+IZ-keE!eW zU>ld)8||9Rlvl+<=iXX&?Xk>|&p`OFHQ^soJ( zB_qbQW?>5^WF3w8KL1sbJrShYDK&%)8n<`Hup~vB!aL$mF5k(q!|x1wADH@pX5uh# z7IgKL?q$l}*~Ae`n9GFhV253$9jr?>Csgv2hldccdkx$j#u2n=Tpe+YQN&2?pTVnB zWZ$-$vq~bMo;rwH-POrX!TYF-OvG}=oYl+fuK}6^#*~Fi%*C~Q&E_4Fc^)3J)r<|Y zQ~@ztdug)udvIn%$``vSksi;ri@ubA{P{N6iAA%A7|m9yX@xALPFtb+ja93xXZu^( zh6sprEzV@A;oJ%NC}3vGB^fS0HWfMM0{m$_BwE+Axme(BrZ$|nKU?8AU7IQoG9DOM z@0_($Y_RB<_1kgW#zE)0g0!S%Aj5LX^Bdm?wg-~C48)sm?5A^$>b&BRQm1le>( z8pnr9+@AE#|20tI=XLC-f$5iQW>`vdciAq#o3RaXbNy}p#_P`d*yJQODBvbUj|rP` zVgh5P!td*Xc!Hod5UUcG8RXV|%BD9P#eNb^7V$i$4^NtwFRZgXm8C6=dUi|V8Yu!y z&wfEIAVG~g=G6w7>6-J9ebH_2*0B%pOS)Y(GhEBsWaa1AyNiII<|+I=lhGfV3qgor z-m8$+a7hV5W3?}jk+Xt&G@097yY9 z=yo}Y89cdFe%Hy+;a1fnj?4k|Ldr#cjVX63!TLd*({u+)$Lym?J^L8}H2LGE@NF(R zQvAB`v7XZ6jM_MS#o3y4j|+;m?6kURW>{**_7ifrZ62X2QNq9RHh!R*#_M&-xZ583 z=fIwncc!apM8KJE_FQSCO*zvzrg?i_GoS>OB4^=)*cbisP~Crc{kQq?2yeVpeM!@| zE$@yC(Z&o{REV6l*We7te%a>H+RyRB5?K9s%~F$%{>ILJ$vAY^0`UcByDQpU?=(Iy zErHOQ7HP$4?JUUY_%yYb~F55A)&^Rl*dB3G0gff8mZCFKVNAP2!0| z;&w|3k&It|dN^%JrB1Dc>q^Gp!#2KGH#CXIJlG#JaMKBtPcK_7V`j4i{wW~)BAnQs zJE7~*mblZ}kEq}D6dZAx|1_hg=AI+lTY_koeED!+s-@nD?n+vM`DTLNgqra>m08f8 zqL&HUGQ25;Zy*|!WmZ2jwcn1%XUuss5cNY92gnE)&#u<=WZpw*o{CD!myWb$*bQfm z7U>?b+ztPRpw$ogFk8|u7qsO*!uyXK;rrSNj8CcIbh}mqv5OREcaZ_GDBx8%y zE~B~}N*8?419~$IJbH12+iIA9e7R`{GQuxaxuqa<=b{1rE05SR`<@P5E-@h!K*u}n z{8#6n&YLJh_twQ_NE(74hQW3&Hk;-hsGVoQf2l54wO3bA^GSiA6;v=JaCcr(5>4LD zf;i1aa6v#rPOCs%Gl&C>?^Ru0&vaFv!o)VTDEFrXi=GfvM0H4?{QVPoM$=_bHEGRJ zW>Db*;)p1ISPXPO%%3QDVIllRX-tb1**D-yzV?R$Ed=_NMBmDiTrw}XNLpR59U%nz zt*(E4nN==fz;6fL60WZQwaTEyk!@;n0osYgE+W~$ZvOrHtJA^gRJJ=1kCg-tgl_>B ze|ceX)G56`f^aXuogwkn*t#)~n9l*zQ>#X7GQ@2HUz-{MjUUu<>fFH2-{?+R-Zc0? z!fBYhZ(QD&7_OH2!L3?tvD++XPL$&D`b={Aj==N>z6XlM*_XIf5SOmOGzxFrb|%_* z_N!$c{Uf#SYxk6A9TfjF81|<2G9wQN0AN-*Rt13P3Vufv;=MQv{EwFN2!Ui|V0Q!C zz^FSUc;&8SZrs*r4|7t1W9!~Q3M9y|9pKTpr%WVQUAK(HeQ8g?Vb)hKl&1UW_nWo7 zawYxN$8-1*A9mB8ZwDFZhyKZNaU1|1qhSN0+e}{iV3v<0%z-+Ty9fxvl7#-gfAtrq z_v1;b0E3UFYbTers^qkSNg|ni#2=9XM*zIjYdLf}=WEnbC`Wu%eE^rt%9Q**ZtM)p zx(8ih-(PtJ7}p2?9l%*^xi+W;a)0j5kCLJ5EtQN!g>7QFZT;v*K@v8k^{lnTyJbq3U$W6t? zYERvEF`{$?#=}8LUmSxNjjI;tq9*Upw*T}#cP?p~MNCg11!NAx@r-4Dnw~GcnNXNq z`Hul`0Jg1VC+O1jTl={(I?1QC!YjwoRQHLxTr=nyfW1mPaDBYb``bP)6ua(r8Nb>b zAhUnF+)=K1BT5YklSIOTEMH$ne5XvNyxfLqe=5+rC+64ZB9JH$yd_sw z5wx2L=g>}b30xUfU3&s(mwpX0YenS<_Ow>lDZ~e^Ji2%#V9_@3-}8hx)E@y13}!=9 zw1KvT!CxC2TdNS6J{xSOnTDqUAECcC;>&{+HZMAZERt0x+D?V)7pIwnIsJfnLkIBY z326XALkl2D)`or^a-Z|spUPh4Xi~7nvDqxt3v_|pI7RGGUTou?9E4mY{yMQP{SwWY z4-}#HnJ2I6(JeUqd1gYuuprcspT`PCRSIhNaFqj8$^!W*TY#!5S?c@i719KgVJk)d zaD$XYWR=J?o<0~*dNIt&?R~a8>+9zy89XAXsd}I>>Ic0TLsFZj*`|p9umde3l$uByy=D;Mwb3r6i@|Yt^MR%8QPGi zkW>T?*D&DOw)I;5{JiN6w^<^6Mb!ShnNOZhrOe)x>6$PYS1F^$ggDN@yg?7NEr|mno;QK%I7cY%L zMWP%4+Th~C-u8^ zTU?w`F7bo+CL{PFIdhdwphXjO*|bfY+U^VS|HJ%EJP@|C>a;CQ6t@A~X!O?!p~RaZ zLE!nr#ME-TQ@P1yqt(~2z~VrKptjesC+#P{Qcu0bCWLX*0Q`4eb5QG)^ItQZ^=ZuF zu{h`n@GJ}{p|hX&Sm#j3C@uUzT^0Q$gOe9RusuvRnu4)M*~UyAr-G3yk6i~w=jW}Y*`rr zD7^5M-=k@-2@`E;fA1{L6!c@&(~mDEa0^dTm=`QvB05&(vrUrnHpEG&MC792uZ@5s z`XL_GU^pQ?k}7SH@inR4|MlWY0WsgxUBm42A`N4rk?x&9zb>cRqw|PYq>gQYnz~>*#%n#;uhOrKY4pD*Vuj1?0HbrH;x7%b^zR52hZWx}r!ukX7`Ru@x z$d!c)=MxaK$sq6-F^LvPVX1U#+V|6Q?>bkkLv7!OT=Re9_%jr4ci{#bLH}AFj zCjbl_JE($ot$q}mzk&S3nbyl65uc*#)v3AUR?zm0A328I$OZqv(@X1!7eSC2hQ@;3MKd> zxZAYi*}#Nw?8aKOX3Tj_6&25Qd>8=z-QTr+>MYHAqK#k5#9)`|#vg2mlL3dnE){34 z&5RBPUT{ktW@Jlp8^^GxH1cz8J+p46y?D`!?R3|ow!O$9a-`08!RzSVDgKQvlU&Xv zy$sUtqH*C4y*NL&ru9>*3b_r-dM0ONnEERj(=h1#9}h7JaOvUj~SkvkVp0VH#$3^ z`yKTcLHpY}(>TnCTZ0?|R~C7%Dfjx}TCb(WA`ahl&*;$)L1cY-a%ag6o=$AuuDbs~ z6}*YpbnT(&_J;x~x&1U@^CH(?@XsxFbfcY&lDYf&d!fs&a-|SKM%AGw+@SW8a2S92{drIS$gb4+O7$-6P#LndIM+u0*fhG>1^Kx6K|5__bf zuJkb`{{h>%ykK8Rph8X_G|WrR&A=w?+A+z5zwf6}Ka+i(&b~|hK)X)%>G2vN3mF0# zwDt6SwbHZSEWdR{X8CW*<-1m9t|_VCMrV!vmQf~EZ<8d636{g4+1N(goJW+#sP4|K z%L07cfA9n=!2jBbd--5i^%}fs(QC897$jxy{#CQvy`ND^h5E8}X~~YbdunA6wJd&LX>D z`q1hR>iU3@J013q9Fu2mJ?uLQ@dOnGiQih2I;H#>*vK0-+5FfDhV^OrOLufmLq8$f zGL>bTJ0t-*+V?5*f{cfa*w*GrO|+UM^mFd%m}jf%I_TxTj<|(N*9K)sl??c^*oJ%z zvHJb1%%oz+i89vxHAV4T?oPk1hMVhmDlrN7-tHSsZ)bvW&SjP(1&gxOwmC&a{B^8# zRjSEin@CR2X;mPa^Z^?}Q0|_#F4Lu^`rD7ncvCm>`mMZ5k(-ky&FQ;eEF8Bf@oqt; zM*A19%p5+M4jB53U6{HC0oxyH6k10jgEY;Z==TG1Ss@p3m1BW*Q*h3Dj0R)VRFXK? zc+WJzwKvSdt+!jRGUDz}U-|DJ-Fi?#+FE7>I;X4@hZ8s73OiodrKW}jmL+pB$}lLF zl(^1hA=i$FRG#>(Tjab+)b#jE5-h)X+=kkMsT!){?iOv&A-W$NWo`d5$3==i^*%>j z#3B-q((a041L6~O;iRknMP!3zQIsaPWEiNqbNyZ!BP{QQ0DoUUU9!-5VuL|FJB4RX zYDQ{ZTtEHJUz&Mm-~jFK*A4ds1j*oTwvyI&`vHes^D_LW;1h!E45FHc6qBqfPkD7a7w!JC}u$Cv~hiinIqJ>DQ1!NK`+Iyb>u5S#Z=!*E9LtQ1)@A_l>XYJem<& zzfyU|Ss8xeWZ%PjvXMEdr!F%cgCT2FT@C6!Y)Rb2wkCx0#Y& z1GyV(G6z+91tQR&W2Q{7!|)0|A7Z!fSo)vg-m<9U+@MSO0au)kVZtJi*6|ewa%vc#au)Y`w+v@v@Q@V-~!T?H7^2i|qy3H+f4 zzdUop7h{t^2UP!<8Skc_@h?Sk`a(AyREKKq!qjURn1?rn-%l8@N584R*G2vegSq@m zpK6miAAkrt+Ccin2dbwlB*e3nRB!6LHK~~&<uY|$ z;Dv7!yyJ)tOsMd+?4nuyc*p$mvzv{k#}zI2p?eB1ukfs@?E3>zUCd2px(94V&ON$G zS4>`Qh+7rF4wjP=5fO2I@b!t5#v?}2u$Q#c1#esa8WL`%7Wx+cenO-kSocBKh@D!Y zlcuQ5enJU`;?)1g1Oi=S>}a@z$;AqjufAK;JYA13Dk}Qzrf8f?fRst@UebQt|KvOh zFSb_?{QEolH&&M`m5rCSkUBDyT3^CZ%&MR6>QuKVj|^BYl*nm|>O}>>1NGlHHHo<$ z9WgKXD+WH&{CkqFcqWS9^PP%!z@MG-sJnFa``I-csvOj>HW-UIlc6Ko5k=xUx?cU7rlxXHy7v>$Q+!s-u2cl$Q`=~NiV7;sStJ;(rFZ7xJj z&0Qy^NJ_hyIA*|T1g=H5+-EN>W4WRvbDyqLvFZGNCqifZ_Jrh$n7!5IhA9@IYsyV~ z3?A}N=K3drQ>wtWQa;1=++hC6J>#kAuf@{e{LL_iB9E?irXHg~e3Mgs!4=4DZ9}{a z_~GWNMHUhIChkT&areLV_(JuqqoW^F28=W97O)vXo?X&MhfmkaI8z5a4*x1Qe%Kl- z4mPebSZzfHSioCU3RsbtUnGSlRsG+6cWZi9l>q2ZF%RE_!7`~W2|HSIyl@0DN_+E~ zo0^Vy-V}0NcM_#40zOpNXQlbwei?tMi$ANd;B&)v0FtNMmnl3haVV;j=9Ec8N!&pD zycndAC<$~1yF}|me8x;1E-|PMJwcpDVqpz!S9X<@1O^s> zp6OX-0-dOO>~)4>e?3BQiZ8woTb#C&!@O=>R?|)dUh5Itb=O*?2^_-Fxf zYW5<8AB3I;@oBdm{;7yV*Mc!wErxqH*NXv{qkt4D9?d^h4U60YzKh4JFa*xEZ_VRq zenUnz7$+XA1b`uodq6m^={_V_mgmuB}?3_KN?ya86!B zyw$I!0MzbRfNtkhIuNVmw}QYmd*HEte$xSqPufd^qmCO7`?RN~LkYG#OEzNQJ4KYp zIS{MeU8o9bITM9^g#fYNnd=d`Qg{I7E8uGw0mruMXN1B81P06i7YW#j_{*O%nxte) zJL=RwkK?54-X8D}7}^~_`s9)83V&x|{@<_@Fl>xW%a6xEh}1Gt-y}iOD;AI58uypw zjbibH5g3(?ia1EW4c!P!ae}lO1>?auVRT+Q3bjgFFPqBwc{M8e`_aX8 zn-Oxu?h<)vDwH0BJwsyS%<%%CQ{&Sb@Oc|D37))k-06nCkM6l#1-~%E?b9z}ZArUy z_Rpu>QkwUhG~}*|e1Lu@%^faG_>OO?wz+?dAzBz6Sr2j)Y^{7!slc4++IXrElYu|g4e4qeJoPuprUkg z$G`CMvRvy}gFy0$7WI94NFjMPXt(_p8;@Jn?$@p$Wdepr(<8hy&&xe=JZuafaTwIV zmx-3oKZtRvMO+`3bak?ik5lenSL_Cq?wozU_h#|Pw4H6pR)3f$_IJ@h>M7FIX!>sF z4JixF3rl2CEnZ|zMOwa0MV3e(ZgF(C#0cO5m$Y4|XyvsX-r(E`;q z^tME9V}}?>$3bMVis(yy4az<3mlK%P=!U+ zbXRb&LArI0885pWvr!k3`K2u42_$f`qOdx=6mgEaGzZXp%oPDGeZ+==aj&ZmOQ#)8 zIMD)^d+mMt$sgT&_8OcnljylSxbASk=9LMdF7S5px6S~9pT~(T1b>IFr)CVX=qY&t zlSm()3J%(Kz8pUeGe#VaiT4p5*i1HpUXW639$4~!yd(+_iGqQrgNap>b>7E5TrQ}^ zakQU*nKL**Ez!FZ>cfPGlkG>+ZA$#E&b{KveXB(Re$g_8;UNK6l=p}#uv~h5LuNx# zZ>E+IB7iuKs_W-AYzZBKN5%xdI9iSmdMN<9sA}kM3&PZSuXGFee?3d-7U9d7x=2} zHPe$|@?+{aD!IqNqnp5yQA8NQogUD_R?80JnWWdbXkH`${YCU8d<6}l|S0-HHou`zv|Km4?`+@ zvDg*^$NHZ}R4cYcbJlxQR|bBfgfU>bK_o|4)U7P==2e15iu&W{BAveq&{yiS;s^r8 z_x3s=c0UPft8x8bHRbO>7^YmzwmeLhRv{7SvBDw%#`o23)5) zMIRg-)SS52hdNo3Mjw857ULkS-DYh)SPmKwUsD6wEMlHm+tL#2v>Z9eK3jE|+?|y3}DEp+f7M zNN%mydn?2`v`^A}?D3#=VZOQGknawJp)TN?3()=ho?WV7W{P_2FckbaacrX$$J+fj zMTV{@QDpn{n?QHC^~8y6{EhDLzb>_VBWHm%FWH?jv&2j<2{#-5!iIRqY7>IDKpEA> zLY^N1LIwQql9hf!Gt^PpU@^+fR~T2yMmnjnUEu) zXX|vV+Q|FwHQgNj7FtQ9I)uZ>nqmrcuHIaDLdZw$h+k!$-{ewvAgQf?=5<4gLnHrL z#U1&~;&-lIqTf`RN5S<4#bX8{T_aZip~s86X}16A(iz7 zbe<0t=iC|sQms*l$b@j2i`qZPWIvm<-^4lFTI6wkBTQvx}X43XUynbmW!JN_50pY6UE8~U{3`NHdaZ7)C&ins2`LXh8eg2jT7%n3yWNQ zS=1ESRHoB=Tim!MI#lcx&CUvn!mI22=DhXKyzh`d_s=GEc2ph7Y?p}j-NbBooS}Q8 z%r;Qmt7p0{kYe42pd=RrJrsAIXS%Z5mvnfz(nIXWt%I>*7LG+LC1tn0q%+E$d1>Wy zqa7-))$RqYh0M(7)+xCF>I@sr?cgvL>am%#TD2sX_9y2Fq11Zi?Q~y+cpRE49Frw? z_q>`z#CXcQyVU!w1MW2M1+>aU&YshZID^b93``V% zC$pD-ikw*DZ|Xw2hf#cCx8R4rqjjP3&fl|w;-CzMa8+kaO_WQ!=TkxrrSmdX&f@h~ zXF0%=0$WRU8p9aJI&Hqr^DZdZ?BSD519@=;@P5k5O?dFeNCw%t!KRyrhR1pD*QrE3 zwPMk{^-^bp1?Udd=;$9rxc&zKE+@;;>+?+h5z}CTCxBWUH z#5pw405w_RtTaSQU*EK9`b#A(*rmAuzVC66F_H1Y39r=e4$qzW$W*O+f}q&F+46ZuAQpEDBn5@FWR)6fpLV@po!BL*Y5ezu(7l|$}9GhHz*i@@d(1iNPX zX1v#Ny)M{FS9k7n%Z0RYgtbavlhqe{<)UB+;S@0^uopq7DAc zDiqCS{NM?Yk-ch<<5`x=8%sEhKWXL+FV>mowdHy4m?Pn?==6k={)@jtt5E^Vv**s; zO%gdWMN~2go|Z2JPWU)M0XK z_|^4n_wk$BPJ=pJ0{OEcvhlIAB!6tPnoP$H;u$SChab1|9@S3i)`h`K)1wMquG6Nz z4_>sjU;A!J?w91X5yOLzMM?^#s>So~`ZQGK&rA>m(cY$O9y_B6UVzS>5h~N7vV*G; zWs(X*$-v{GP?3c-kJlK3myf>FO{pFv?tW7YFnNk|kRZIKsbA!_V_^d~Pje~;4z|_< z1o`M9N|u?YV7S|LRnC}-Lo<#cLgD`^j&YPS!!>2h;S2s(tf2FTQoC_5o~uSptLydm zy@p6};tfmT`;5!umh2=9PWiQo>mXi2i*kk=+M5(JXeQl*sF_ou3cK-KK{l!qtcF z(<%-gJ)Pwob&uSZDN)Y0b8rfn&7w$l0nYB)!@E}V&$^)iD(@eAc~uA5cpJSLS9p|I zLGh5j`_iT^Bscss1zQmAHY{^9{wek!SSh4>KXH;!qG-&;ci-!TWDt-ytQ!)oPWCS&mGBiBeEYVF?f+~| zPK;ynAP(d%=F=3v!VZz~bli0SVzSRnavske*M8tBcL>N!QR+XQgGx=|*||Y(?u?%u zs|ej`sRHI7J#mppwB-mUv%!x%5UnaGeoS+Vx!@nmF%~ZdCQAb@>02s){t=CTn?v@4 z##z;)XhM4S`(B^XTX;M`q2j1<<7#Gqu@$xW=*>^OKX7j5HufcZuc&9VHT& zEiCKNi&!a_G8?;y7xfla6>MR%XEYS>U~h--dnKQtj71fkLDe&+oOO(%Ha~uKOh2Sx zO(G%cybzmV1i!1o238l&v?o}NcFVPO@$1bPb zrEtu+qDVB_Z*&y!pAd#%NW_G}mG;&;A9Bci{#arZ(t%{j|FL*1rMTtU zIY324g?o`nN{bL^kl=yBPPUyYF=Sgp3c0k^{QOVC6WnhJeDkO66D$`yXymX)jS_cL zU-wuae6VNi{`N8$asy1p%lS!!J49T~kK03mB`@PPYm!33kh&r1{a6>;@V}ngy}l#n z7$x1bOeY7nm;&2e5xS&A-Erg2yB56RFYhzd$PausJfEi#k~@duTQq|W`BUyy5eYep z<-dJbN86^_&B2=V;(M&!^a?@L4E5tfIynLw&JuDrPXosvlTd9(D6rG?d=>o9O)l=u zQH>bz_N8pbQ`oWHrzLQ*1Uz>y?;QbhlT&VdQSO64H0=9xx=Iw&<*iLZ@{7xg-4il$ zDaoLgrtIN&{z%B8R&EXUim)YB+2&~6~#0Xb!k|OzI^$@7yFwK zmB&k?E--ay0~TgEJ%MlTw+gu0&TcvMLs9`|n}%GPIq&wjnxs;~!QAIy)74d3gFSMhTOE#s+2udU>_UE=OSFIXieOuLHdB7Rk~NRi&Nys>x8R^xq^mX8T(;HiN=z? zBbiQOtsYfVCJu8VblVCFRUh5!>Hog7doZlrtMdT05j@{py3-vNedz4_<|@rha3 zCRLi;zPahKE1_gO4K#P+R!`;kYojl}OmJ!%Yr;nL+=1ioK=1X{#P9 zM}#vy!zo#i{V=T43E7ON;n4E+B)EuV>hV(E?9cTK_D*0ZXU4Y3g0FAr6d}kC-U{3& zeLyj%E6juoSv5X&o>DrESK|)Sx^nRarD?p*I@Mlj^n-)4-W8>?r)&PDg_P;)xhKyf zTiGYU(pn#N9|x)Q^8eZhMt#5Q@&TXaIv2?O(e#3`4^p18HJ~3dO}gzQl2+qkT&gip zO#!~I=uIYr5}lfyHG4?0$NT7L7HmST$1PT9@L5@w#*h1ez7LXHmImFV3QyL}oiWpy zAoaT$=*ZhkndbyLXheAFO!t=jdFMDPM@In81ywVdupQ*=%ZUu2%_yMqx*+p+re3Yi zkl((!V1GG`{uiy_BK#jhU*S}z?1Ye)co`-0Bce?h{sbH7uE)PGf3Du&V|7E7+nQq; zr_$T&pfN5BB+O^3WbAu1ifYqernNEB^=fuZ5A28Tz=$lYIr;=i24Cf7i=ub6`J^to z!jt_Q-wcCvf+S>s0*_ME2lQ+24b&NObyH-+tP9JX11jJAJZ8BFdri@&)kQd?8kk(V z`CI&m_H;B2$KUR5<5G7fYj4eweA4`??~Yhza>(s;5hzV;2;ztkMrCg2l?gr&m9;030HNwt_ema{wy1=hk6PRF zoD39oRQiR#d|2a*r0d$qNjPMQt}-z(ag?1rsQ9R@%%EPRcUZ0~^GuG8I-xV+*$ClM z2I`4zQ<^*f1yM2Wh*&(K`|y#wsNTMbEc#!u{Nb0bz7s1ouIA@YU*#vd+-gspl|j}K zR}V|T;RWog1RPGtf&JLL0w5VNS1Db7>D_4tovU_Cf}FjkvfjlTUH+80=buykZ z)~~61O3bD+apb41qr-cLkdcK5y)Yq)x4&P8yu-ZOQxbTeQbEgU8<$I`yY06zoUOD+ zbtz{f1*cKQzp1)EkvSxv5nOCkaSIaA&E%H&j0D;?GUG+ahsr@;whtA+0WsAWuW;-4 zEU!2*e#S1!U1@2(&R=DsM-1j$q3eD9pLe}P=+Id-szvUKaxJO(-4cqfyM(;PKL z)PM^)c}7^{Wpo?;mg>+{z{#4WB|GHg-tO@@7 zuI9GO^T0fVu|7zr$xu?L$(t*4B48InbI__M&d=!+UdK9CTbWu}Bp{*U{rICNr~FJy zge$I9l?f95d*DI_bW(a&HdAWw^iia_LG)ktSO86kR@jbTQxa+j#o)d=rk?jOE$v7l zljhkvMN)Q_;97~H$qE~8MAQ`yzkFKx*d$omfr)oTNi@yFaG6$Q6L!vE zf=uVT8P4{H>B4piy86t7+}__2_PAGH;SZ%f**5#+fo&{hNSWa6JVknap&LXaHzLeN z2a(3H)Eaqrqlf%U^`cffpS`m%a(agf!3nJpsJ)j07ZmZ_MVvuxg>p*ztm^tT+Ci=p zN&=rAiloI~ea6o|hzW&U6{F_q$tT(?8iI_FrU^tS`CUR2&r(@jA=+n=w7;P0DI*a%fc` zY-~bCMcjRFeSHFGqoDANwK;U}=MZy9`%-=(jD{qR+)a9!382~ zW*)pl%`VshyuoB;j$^71-&_=I+e&D4A*1msC>p&He)s#xtf~rp?EP>M^>_2PSan6u zz_xTD^=tj*T<>3s!exW&%G~OnQ)Cx6Fe6cj9nTblq#oW!m%Ea!W6*(17DJc!uG@~c8(&J;7H3k`$Mg|>hGqGgp1 z+fR-v%)VAL`u$a{=0chQS$a&H*vf9j-G|FsA02!Z_#oB1^ zQRD2S__2+6bDwOG!UD(gAC>o->@>b@05K=c6Wfjoq%W5SnCfe!Zo8_=o~yJ4EGta< zb9e82T=}V_)K@x(`gSHuE2fIknb^DTQ})+dSX*Ard)M0~if@#3*+u12JP>V)Wm14S zYWx|RwibUtpfl@{Jt&oFwrW1FQGfUrBh}(bLX$-+Y-iy%a4E9@@6P_6J@Ki6&*e?C7B-ESz#O= zIhwtx{VEZDyAQJdwOSfXUuIxJ*UcTc>_Y#@C|XNQaPAh*({OgZ$4*%05BsFTH+qPK zBSpW=2)i<)80NcbUelsz@hcEv{8J&-yXH@6EzE&Nx^hSAS8r|+XeN<$w9$)iP zdh>4TMW*rkx2kslk-8wd8}xJXnl_@Z_mb}mMcIoz-dmFD>Fwxzk;P|~G*6Mw)agH^ zoBk4LGS1JZ8NnaW=8M@|42uUY9#zPnMBU@v)_r1&?KvBXOJdNqO15U?d9=C{;q&=v79K<6d4n;>{h9LTE_T9jL{epuNEZWtn16wMc*^}b}Jy_ffoGx zL-{wy!D=hLbk0VLLnr<^DJwj; zr!tq$GKkoh?U2h#1Rn+x; zD*{r|-8pnONDVOLP(w*cNvD*AN_U6A5Yo)hEu|>k-65rPNGYJ;d%){@p8I}3@B8=6 zoZ07`z1LoA?e+Vvd{+#|Mu#7*2Fr3vBiw=U#g-Cf{R1NQddn16KV?g+!%(N9S}ckU zOYI@;VjUGvh=h52nbSK#lCo4%0?`v8Ql%<;pBp-22u@%2x>}X@xuSiMt2ILN|LZ*z zH{lr?rh&ReQ8O0oD*ad<>zIb6(0iIWG&UC>B~18j1rJxZZ%S@k{Ny%@(n$N>XE3gF zlk(JnFhSOY<&*V95c8x2ok-jiZ2{#P)r64uuUPjT$BcM7Ut&to6%q5N)|1BZ&WEU^ zQw%QX?TJ+Klls=NZqozAf}@5b!Cu~nvsbO1rb_`SA&kz8~_$UXsowAV$J$C44*^f(1#wNzVQonnDVr(Td)pVHOD-!T$}y)fP!_9Nq{nz z<5USTfb~Q~F5&RoK7`~rD;sBr+5r?1b{v}9+xsUU1}#54)VD0|#b=)nJLRn)Ol46MwYiMDcm-lnJ|uQ;kDK0vWH_q&ynk#OG;?AVZh7{3?GWYGeA#H-p=B6xG+St*P`)IGd~S4^K+xTpQ>2@Y)otQI&Fjm) zgm8D87@D{s+7@^sTh^DC<1TX&=6mP!@zo)f_+{n(gCrK6-ZneraL}hE2`9$ijPDAp z0-G4Ez#Ge|#j_Suq^L1D6J-}4cf1eqL3$$~UjoI0tiNl%i@O>+Rxxue^QCf~iXL4PSxXt!> z8A1(H?VmsU0m!X<&v&$4*-|4+<8Hbhpwkag|v^Ba^I;&l832}FqnAXf5 zPVe1v>Eg=*^#$6VDU)|Zwo*_mwxiF|659oO}rMWpN{jju*)oQ%InNnlw*`sMlPWSqiGs02FZuDd&aG}`Z$g2E1d0Gb!jWA|r z0HG#tXlen(o^~rCN$%SD&UTfd!Hs8aTk`6RE(hmbm9 zddq$5D6-au(-MCX%I?})$0vaUI+)IoFJimTg5BK}{zzYeuKG ztg1fCM{~+IjMWxac@6J1v-lmbHoU)OH7y^*!O9(U;TDsKjzGAX|5eP z@x$72MX0`9Oc1M#!H1m zCpfBWmpaz5$RcOS_&goqrIC!frKVA3)~x2$z5$)zP8r#lE2^}GA&QT!_Os^eUt;Gt zqs7K%jr`QzY?4jAcriiVL6j9V4Y%3@wZClh6!BIrVXPoZb?i2ea+rRpfl6`bZ-6OT+%OiFWR-7r&5U z6cUN~khfA758;Osm~6I-=Z;u**)?V| z78ln{@RAgM*$L&wX)Fb@sH!UVVvHgEu%1IxW zCwYxm=<9XhhmY7$w_nGnYrIfqm#EMPdyj5Wt`XHV8WQ&>@!_vSxa3ohs$3$uWHAQS za`~pYN57|TNgl<5q^z3kmX1MP3YFEWc6)HA?-IhXM8(czK2&1wDv(?7pSH@!F*(a? z%@!jo?~Gx&Vs=G`zPg5_-*t#f|d43zx>^5N1^U;mEh%ku|t=mRHAtH$wg zl8a<5-Wd9f#fR@*|8TT^RKH+*ZWM1XlCE%|K;ZPfa|a_98b63WL2UOVyxx?WH<@f< zhm`7OLem&~no2o$MLvv>aXl40 z&>h^63rp9)jcf9VSAP;IC(M*T<8~0JwO%~EJK!G4930~BG^>f)hd47J|BE@<37@a) z{lFshhDU_TM#2GMGwIVM!|1v~ z%b`=*KW+KEOvJAfj<;q@K)xF6G#E7nZ75RmEFt!tX3-w68DCFS253(qcoGV=^F{h9 zU$HNwB=a`Eu}wMe@7r|ZPc0JJg;PS@#wkf*f4jXS-Blfnh%7N5Hsd6z(!HVT?I`NY_x=k_aiyzssWi`M)V%^$6bl)4^L7;qX;39JT2=&u4y_K~eKU^)b=LprKU zXSAn)EyaA0ysvQ>2E59veMBQM6OHgjCNq$0w520lf}I8K=LD$5ZU{9Di9{ z)Z)eLnWJ}jYJJ1AL;)&XzV<$*aV}d@_!Q~6E{sJSns`{C_Ff*AWTsU;(+(l`dn2?W z=i3CsZK8N*BmeXSOb6NOebcO%2Zj|lxaer&1w+{yDc0=`=MUcTxto_!M2t76^m2

2$-k>c$9ILpwXoV~;Ag>m8Qx- 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 G+ Date: Wed, 28 Jun 2023 16:01:16 +0100 Subject: [PATCH 013/191] feat(component): adding postgres database --- .../onboarding-wizard/CredentialsButton.tsx | 12 ++- .../onboarding-wizard/DatabasePurplin.tsx | 32 ++++++++ .../pages/onboarding/database/postgres.tsx | 77 +++++++++++++++++++ 3 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 dashboard/components/onboarding-wizard/DatabasePurplin.tsx create mode 100644 dashboard/pages/onboarding/database/postgres.tsx diff --git a/dashboard/components/onboarding-wizard/CredentialsButton.tsx b/dashboard/components/onboarding-wizard/CredentialsButton.tsx index b67b43f07..e561a66eb 100644 --- a/dashboard/components/onboarding-wizard/CredentialsButton.tsx +++ b/dashboard/components/onboarding-wizard/CredentialsButton.tsx @@ -2,7 +2,15 @@ import { useRouter } from 'next/router'; import Button from '../button/Button'; -function CredentialsButton({ handleNext }: { handleNext?: (e?: any) => void }) { +interface CredentialsButtonProps { + nextLabel?: string; + handleNext?: (e?: any) => void; +} + +function CredentialsButton({ + handleNext, + nextLabel = 'Add a cloud account' +}: CredentialsButtonProps) { const router = useRouter(); return ( @@ -22,7 +30,7 @@ function CredentialsButton({ handleNext }: { handleNext?: (e?: any) => void }) { type="button" disabled={true} > - Add a cloud account + {nextLabel}

); diff --git a/dashboard/components/onboarding-wizard/DatabasePurplin.tsx b/dashboard/components/onboarding-wizard/DatabasePurplin.tsx new file mode 100644 index 000000000..55f6ade5f --- /dev/null +++ b/dashboard/components/onboarding-wizard/DatabasePurplin.tsx @@ -0,0 +1,32 @@ +import Image from 'next/image'; + +interface DatabasePurplinProps { + database: string; +} + +function DatabasePurplin({ database }: DatabasePurplinProps) { + return ( +
+
+ {`${database} +
+ {`Purplin +
+ ); +} + +export default DatabasePurplin; diff --git a/dashboard/pages/onboarding/database/postgres.tsx b/dashboard/pages/onboarding/database/postgres.tsx new file mode 100644 index 000000000..9fd0e58cc --- /dev/null +++ b/dashboard/pages/onboarding/database/postgres.tsx @@ -0,0 +1,77 @@ +import Head from 'next/head'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import DatabasePurplin from '../../../components/onboarding-wizard/DatabasePurplin'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +export default function PostgreSQLCredentials() { + const handleNext = () => {}; + + return ( +
+ + Configure Postgres - Komiser + + + + + +
+
+ PostgreSQL is a powerful and feature-rich open-source RDBMS known + for its extensibility and robustness. It offers advanced SQL + capabilities, support for complex queries, data integrity + constraints, transactions, and scalability. +
+
+ +
+
+ + + + +
+
+ + +
+ + + + +
+
+ ); +} From 21c8e373d66d0d71cf6d8662524b60e94489fb18 Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 5 Jul 2023 17:19:22 +0100 Subject: [PATCH 014/191] feat(component): adding onboarding wizard icons --- .../components/icons/DocumentTextIcon.tsx | 47 +++++++++++++++++++ dashboard/components/icons/Folder2Icon.tsx | 29 ++++++++++++ dashboard/components/icons/KeyIcon.tsx | 38 +++++++++++++++ .../components/icons/ShieldSecurityIcon.tsx | 38 +++++++++++++++ dashboard/components/icons/VariableIcon.tsx | 26 ++++++++++ 5 files changed, 178 insertions(+) create mode 100644 dashboard/components/icons/DocumentTextIcon.tsx create mode 100644 dashboard/components/icons/Folder2Icon.tsx create mode 100644 dashboard/components/icons/KeyIcon.tsx create mode 100644 dashboard/components/icons/ShieldSecurityIcon.tsx create mode 100644 dashboard/components/icons/VariableIcon.tsx diff --git a/dashboard/components/icons/DocumentTextIcon.tsx b/dashboard/components/icons/DocumentTextIcon.tsx new file mode 100644 index 000000000..15ee47823 --- /dev/null +++ b/dashboard/components/icons/DocumentTextIcon.tsx @@ -0,0 +1,47 @@ +import { SVGProps } from 'react'; + +const DocumentTextIcon = (props: SVGProps) => ( + + + + + + +); + +export default DocumentTextIcon; diff --git a/dashboard/components/icons/Folder2Icon.tsx b/dashboard/components/icons/Folder2Icon.tsx new file mode 100644 index 000000000..d307d2ac9 --- /dev/null +++ b/dashboard/components/icons/Folder2Icon.tsx @@ -0,0 +1,29 @@ +import { SVGProps } from 'react'; + +const Folder2Icon = (props: SVGProps) => ( + + + + +); + +export default Folder2Icon; diff --git a/dashboard/components/icons/KeyIcon.tsx b/dashboard/components/icons/KeyIcon.tsx new file mode 100644 index 000000000..53181b28a --- /dev/null +++ b/dashboard/components/icons/KeyIcon.tsx @@ -0,0 +1,38 @@ +import { SVGProps } from 'react'; + +const KeyIcon = (props: SVGProps) => ( + + + + + +); + +export default KeyIcon; diff --git a/dashboard/components/icons/ShieldSecurityIcon.tsx b/dashboard/components/icons/ShieldSecurityIcon.tsx new file mode 100644 index 000000000..7ece47d88 --- /dev/null +++ b/dashboard/components/icons/ShieldSecurityIcon.tsx @@ -0,0 +1,38 @@ +import { SVGProps } from 'react'; + +const ShieldSecurityIcon = (props: SVGProps) => ( + + + + + +); + +export default ShieldSecurityIcon; diff --git a/dashboard/components/icons/VariableIcon.tsx b/dashboard/components/icons/VariableIcon.tsx new file mode 100644 index 000000000..327e09b93 --- /dev/null +++ b/dashboard/components/icons/VariableIcon.tsx @@ -0,0 +1,26 @@ +import { SVGProps } from 'react'; + +const VariableIcon = (props: SVGProps) => ( + + + + +); + +export default VariableIcon; From a867c0a8cd95f178b2e7a194da5b9f704f12810f Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 5 Jul 2023 17:20:44 +0100 Subject: [PATCH 015/191] feat(component): fixes to layout routing and linting files --- dashboard/components/layout/Layout.tsx | 2 +- .../pages/onboarding/choose-database.tsx | 24 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/dashboard/components/layout/Layout.tsx b/dashboard/components/layout/Layout.tsx index f4c76e9d4..ce902247d 100644 --- a/dashboard/components/layout/Layout.tsx +++ b/dashboard/components/layout/Layout.tsx @@ -74,7 +74,7 @@ function Layout({ children }: LayoutProps) { title="We could not find a cloud account" message="Get Started Onboarding" action={() => { - router.push('/onboarding'); + router.push('/onboarding/choose-cloud'); }} actionLabel="Begin Onboarding" secondaryAction={() => { diff --git a/dashboard/pages/onboarding/choose-database.tsx b/dashboard/pages/onboarding/choose-database.tsx index 864110555..ca871a911 100644 --- a/dashboard/pages/onboarding/choose-database.tsx +++ b/dashboard/pages/onboarding/choose-database.tsx @@ -31,8 +31,9 @@ function DatabaseLeftItem({ return (
{`${value} @@ -147,10 +150,11 @@ export default function Onboarding() { alt="Komiser Logo" width={135} height={100} - className={`${database === 'postgres' - ? 'ml-16' - : 'rotate-onboarding-arrow ml-[182px]' - }`} + className={`${ + database === 'postgres' + ? 'ml-16' + : 'rotate-onboarding-arrow ml-[182px]' + }`} />
From 3e7eff551bfcba98aa6cfc01d6e7b08763217375 Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 5 Jul 2023 17:23:06 +0100 Subject: [PATCH 016/191] feat(component): file and select inputs completed --- .../onboarding-wizard/InputFileSelect.tsx | 72 +++++++++++++++++++ .../onboarding-wizard/SelectInput.tsx | 34 +++++---- 2 files changed, 91 insertions(+), 15 deletions(-) create mode 100644 dashboard/components/onboarding-wizard/InputFileSelect.tsx diff --git a/dashboard/components/onboarding-wizard/InputFileSelect.tsx b/dashboard/components/onboarding-wizard/InputFileSelect.tsx new file mode 100644 index 000000000..cd3b87c19 --- /dev/null +++ b/dashboard/components/onboarding-wizard/InputFileSelect.tsx @@ -0,0 +1,72 @@ +import { MutableRefObject, ReactNode } from 'react'; + +interface InputFileSelectProps { + id: string; + value?: any; + type: string; + label: string; + icon?: ReactNode; + subLabel?: string; + disabled?: boolean; + placeholder?: string; + iconClick?: () => void; + handleFileChange: (event: any) => void; + fileInputRef: MutableRefObject; +} + +function InputFileSelect({ + id, + icon, + type, + label, + value, + subLabel, + iconClick, + placeholder, + fileInputRef, + handleFileChange, + disabled = false +}: InputFileSelectProps) { + return ( +
+ + + {subLabel && ( + + {subLabel} + + )} + +
+ + + + + {icon && ( + + )} +
+
+ ); +} + +export default InputFileSelect; diff --git a/dashboard/components/onboarding-wizard/SelectInput.tsx b/dashboard/components/onboarding-wizard/SelectInput.tsx index de872a148..6ac23c4d9 100644 --- a/dashboard/components/onboarding-wizard/SelectInput.tsx +++ b/dashboard/components/onboarding-wizard/SelectInput.tsx @@ -1,13 +1,12 @@ import { useState } from 'react'; import classNames from 'classnames'; -import ChevronDownIcon from '../icons/ChevronDownIcon'; export type SelectInputProps = { label: string; value: string; values: string[]; - displayValues: string[]; handleChange: (value: string) => void; + displayValues: { [key: string]: any }[]; }; function SelectInput({ @@ -24,27 +23,31 @@ function SelectInput({ setIsOpen(!isOpen); } + function handleClick(item: string) { + handleChange(item); + toggle(); + } + return (
- + Change
+ + @@ -54,7 +57,7 @@ function SelectInput({ onClick={toggle} className="fixed inset-0 z-20 hidden animate-fade-in bg-transparent opacity-0 sm:block" >
-
+
{values.map((item, idx) => { const isActive = value === item; @@ -62,12 +65,13 @@ function SelectInput({ ); })} From 2c42dc68bababbcbd56961cb3a54ebfad5c690d4 Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 5 Jul 2023 17:23:33 +0100 Subject: [PATCH 017/191] feat(component): adding file input to kubernetes --- dashboard/pages/onboarding/kubernetes.tsx | 41 ++++++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/dashboard/pages/onboarding/kubernetes.tsx b/dashboard/pages/onboarding/kubernetes.tsx index 1e36b5bb2..d45cb3888 100644 --- a/dashboard/pages/onboarding/kubernetes.tsx +++ b/dashboard/pages/onboarding/kubernetes.tsx @@ -1,5 +1,6 @@ -import { useState } from 'react'; +import { useState, useRef } from 'react'; import Head from 'next/head'; +import Image from 'next/image'; import { useRouter } from 'next/router'; import Button from '../../components/button/Button'; @@ -8,10 +9,11 @@ import OnboardingWizardLayout, { RightSideLayout } from '../../components/onboarding-wizard/OnboardingWizardLayout'; import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; +import InputFileSelect from '../../components/onboarding-wizard/InputFileSelect'; export default function AWSCredentials() { const router = useRouter(); - const [provider, setProvider] = useState('aws'); + const [provider, setProvider] = useState('kubernetes'); const handleNext = () => { router.push(`/onboarding/${provider}`); @@ -22,6 +24,19 @@ export default function AWSCredentials() { 'https://docs.komiser.io/docs/faqs#how-can-i-request-a-new-feature' ); + const fileInputRef = useRef(null); + const handleButtonClick = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); + } + }; + + const handleFileChange = (event: any) => { + const file = event.target.files[0]; + // Set Input field to file.name and use temporary file path for the upload value + console.log(file); + }; + return (
@@ -120,9 +135,25 @@ export default function AWSCredentials() {
-
- -
+ + } + fileInputRef={fileInputRef} + iconClick={handleButtonClick} + handleFileChange={handleFileChange} + />
From c051a45e9c92f04c43081f52b45de280a99924ad Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 5 Jul 2023 17:23:55 +0100 Subject: [PATCH 018/191] feat(component): adding file and select inputs to aws --- dashboard/pages/onboarding/aws.tsx | 188 ++++++++++++++++++----------- 1 file changed, 116 insertions(+), 72 deletions(-) diff --git a/dashboard/pages/onboarding/aws.tsx b/dashboard/pages/onboarding/aws.tsx index fc928e0ba..01a56b3f4 100644 --- a/dashboard/pages/onboarding/aws.tsx +++ b/dashboard/pages/onboarding/aws.tsx @@ -1,6 +1,12 @@ -import { useState } from 'react'; import Head from 'next/head'; import { useRouter } from 'next/router'; +import { ReactNode, useRef, useState } from 'react'; + +import KeyIcon from '../../components/icons/KeyIcon'; +import Folder2Icon from '../../components/icons/Folder2Icon'; +import VariableIcon from '../../components/icons/VariableIcon'; +import DocumentTextIcon from '../../components/icons/DocumentTextIcon'; +import ShieldSecurityIcon from '../../components/icons/ShieldSecurityIcon'; import Button from '../../components/button/Button'; import OnboardingWizardLayout, { @@ -9,10 +15,44 @@ import OnboardingWizardLayout, { } from '../../components/onboarding-wizard/OnboardingWizardLayout'; import SelectInput from '../../components/onboarding-wizard/SelectInput'; import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; +import InputFileSelect from '../../components/onboarding-wizard/InputFileSelect'; + +interface SelectOptions { + icon: ReactNode; + label: string; + value: string; +} + +const options: SelectOptions[] = [ + { + icon: , + label: 'Credentials File', + value: 'credentials-file' + }, + { + icon: , + label: 'Credentials keys', + value: 'credentials-keys' + }, + { + icon: , + label: 'Environment Variables', + value: 'environment-variables' + }, + { + icon: , + label: 'IAM Instance Role', + value: 'iam-instance-role' + } +]; export default function AWSCredentials() { + const provider = 'aws'; + const router = useRouter(); - const [provider, setProvider] = useState('aws'); + const [credentialType, setCredentialType] = useState( + options[0].value + ); const handleNext = () => { router.push(`/onboarding/${provider}`); @@ -23,6 +63,23 @@ export default function AWSCredentials() { 'https://docs.komiser.io/docs/faqs#how-can-i-request-a-new-feature' ); + const fileInputRef = useRef(null); + const handleButtonClick = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); + } + }; + + const handleFileChange = (event: any) => { + const file = event.target.files[0]; + // Set Input field to file.name and use temporary file path for the upload value + console.log(file); + }; + + function handleSelectChange(newValue: string) { + setCredentialType(newValue); + } + return (
@@ -60,82 +117,69 @@ export default function AWSCredentials() { label="Account name" placeholder="my-aws-account" /> -
+
- -
-
- - - - - - + option.value)} + /> + {[options[2].value, options[3].value].includes( + credentialType + ) && ( +
+ {credentialType === options[3].value + ? 'Komiser will fetch the credentials from AWS' + : 'Komiser will load credentials from AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.'}
- + + {credentialType === options[0].value && ( +
+ } + subLabel="Enter the path or browse the file" + placeholder="C:\Documents\Komiser\credentials" + fileInputRef={fileInputRef} + iconClick={handleButtonClick} + handleFileChange={handleFileChange} + /> + + -
-
+ )} - setProvider(value)} - label="Cloud provider" - value={provider} - values={['1']} - /> - - + {credentialType === options[1].value && ( +
+ + + +
+ )}
From 8d335c36c737b02424d3eb1f0d6e7b703baadb1f Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 5 Jul 2023 17:24:12 +0100 Subject: [PATCH 019/191] feat(component): adding support for sqlite --- .../pages/onboarding/database/sqlite.tsx | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 dashboard/pages/onboarding/database/sqlite.tsx diff --git a/dashboard/pages/onboarding/database/sqlite.tsx b/dashboard/pages/onboarding/database/sqlite.tsx new file mode 100644 index 000000000..662cd9002 --- /dev/null +++ b/dashboard/pages/onboarding/database/sqlite.tsx @@ -0,0 +1,55 @@ +import Head from 'next/head'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import DatabasePurplin from '../../../components/onboarding-wizard/DatabasePurplin'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +export default function PostgreSQLCredentials() { + const handleNext = () => {}; + + return ( +
+ + Configure SQLite - Komiser + + + + + +
+
+ SQLite is a lightweight, serverless, self-contained RDBMS that + operates directly on files. It is known for its simplicity, ease + of use, and portability across platforms. +
+
+ +
+
+ +
+
+ + +
+ + + + +
+
+ ); +} From 493754bb9f735e4d3fd32a693433f0a992e128f7 Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Wed, 5 Jul 2023 19:17:21 +0100 Subject: [PATCH 020/191] feat(component): fixes for choose cloud page --- .../onboarding-wizard/SelectInput.tsx | 18 ++-- dashboard/pages/onboarding/aws.tsx | 28 +----- dashboard/pages/onboarding/choose-cloud.tsx | 88 ++++++++---------- .../public/assets/img/others/arrow-down.svg | 26 ++++++ .../assets/img/others/onboarding-cloud.svg | 17 ++++ .../assets/img/others/onboarding-padlock.png | Bin 73951 -> 0 bytes dashboard/utils/providerHelper.ts | 15 +++ 7 files changed, 113 insertions(+), 79 deletions(-) create mode 100644 dashboard/public/assets/img/others/arrow-down.svg create mode 100644 dashboard/public/assets/img/others/onboarding-cloud.svg delete mode 100644 dashboard/public/assets/img/others/onboarding-padlock.png diff --git a/dashboard/components/onboarding-wizard/SelectInput.tsx b/dashboard/components/onboarding-wizard/SelectInput.tsx index 6ac23c4d9..f6c5138ca 100644 --- a/dashboard/components/onboarding-wizard/SelectInput.tsx +++ b/dashboard/components/onboarding-wizard/SelectInput.tsx @@ -1,10 +1,13 @@ -import { useState } from 'react'; +import { ReactNode, useState } from 'react'; import classNames from 'classnames'; +import ChevronDownIcon from '../icons/ChevronDownIcon'; + export type SelectInputProps = { label: string; value: string; values: string[]; + icon?: string | ReactNode; handleChange: (value: string) => void; displayValues: { [key: string]: any }[]; }; @@ -13,8 +16,9 @@ function SelectInput({ label, value, values, + handleChange, displayValues, - handleChange + icon = }: SelectInputProps) { const [isOpen, setIsOpen] = useState(false); const index = values.findIndex(currentValue => currentValue === value); @@ -34,7 +38,7 @@ function SelectInput({ className="pointer-events-none absolute right-4 bottom-[1.15rem] text-komiser-600 transition-all" > - Change + {icon}
@@ -46,7 +50,7 @@ function SelectInput({ )} >
- {displayValues[index].icon} + {displayValues[index].icon && displayValues[index].icon} {displayValues[index].label}
@@ -70,8 +74,10 @@ function SelectInput({ )} onClick={() => handleClick(item)} > - {displayValues[idx].icon} -
{displayValues[idx].label}
+ {displayValues[idx].icon && displayValues[idx].icon} +
+ {displayValues[idx].label} +
); })} diff --git a/dashboard/pages/onboarding/aws.tsx b/dashboard/pages/onboarding/aws.tsx index 01a56b3f4..0d52f0e4b 100644 --- a/dashboard/pages/onboarding/aws.tsx +++ b/dashboard/pages/onboarding/aws.tsx @@ -8,7 +8,6 @@ import VariableIcon from '../../components/icons/VariableIcon'; import DocumentTextIcon from '../../components/icons/DocumentTextIcon'; import ShieldSecurityIcon from '../../components/icons/ShieldSecurityIcon'; -import Button from '../../components/button/Button'; import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout @@ -16,6 +15,7 @@ import OnboardingWizardLayout, { import SelectInput from '../../components/onboarding-wizard/SelectInput'; import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; import InputFileSelect from '../../components/onboarding-wizard/InputFileSelect'; +import CredentialsButton from '../../components/onboarding-wizard/CredentialsButton'; interface SelectOptions { icon: ReactNode; @@ -58,11 +58,6 @@ export default function AWSCredentials() { router.push(`/onboarding/${provider}`); }; - const handleSuggest = () => - router.replace( - 'https://docs.komiser.io/docs/faqs#how-can-i-request-a-new-feature' - ); - const fileInputRef = useRef(null); const handleButtonClick = () => { if (fileInputRef.current) { @@ -120,6 +115,7 @@ export default function AWSCredentials() {
-
- - -
+ diff --git a/dashboard/pages/onboarding/choose-cloud.tsx b/dashboard/pages/onboarding/choose-cloud.tsx index 415d5ba95..87d420c64 100644 --- a/dashboard/pages/onboarding/choose-cloud.tsx +++ b/dashboard/pages/onboarding/choose-cloud.tsx @@ -3,49 +3,21 @@ import Head from 'next/head'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; -import Select from '../../components/select/Select'; import Button from '../../components/button/Button'; import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout } from '../../components/onboarding-wizard/OnboardingWizardLayout'; +import SelectInput from '../../components/onboarding-wizard/SelectInput'; -const SelectCloud = { - 'Amazon Web Services': 'aws', - 'Microsoft Azure': 'azure', - 'Google Cloud Platform': 'gcp', - 'Oracle Cloud Infrastructure': 'oci', - Kubernetes: 'kubernetes', - 'Digital Ocean': 'digitalocean', - Civo: 'civo', - 'MongoDB Atlas': 'mongodbatlas', - 'Tencent Cloud': 'tencent', - Scaleway: 'scaleway', - 'OVH Cloud': 'ovh', - Linode: 'linode' -} as const; - -type Clouds = keyof typeof SelectCloud; -type CloudsValues = (typeof SelectCloud)[Clouds]; - -const cloudLogo: { [K in CloudsValues]: string } = { - aws: '/assets/img/providers/aws.png', - azure: '/assets/img/providers/azure.svg', - gcp: '/assets/img/providers/gcp.png', - oci: '/assets/img/providers/oci.png', - civo: '/assets/img/providers/civo.jpeg', - tencent: '/assets/img/providers/tencent.jpeg', - kubernetes: '/assets/img/providers/kubernetes.png', - digitalocean: '/assets/img/providers/digitalocean.png', - mongodbatlas: '/assets/img/providers/mongodbatlas.jpg', - scaleway: '/assets/img/providers/scaleway.png', - ovh: '/assets/img/providers/ovh.jpeg', - linode: '/assets/img/providers/linode.png' -}; +import ProviderCls, { + allProviders, + Provider +} from '../../utils/providerHelper'; export default function Onboarding() { const router = useRouter(); - const [provider, setProvider] = useState('aws'); + const [provider, setProvider] = useState('aws'); const handleNext = () => { router.push(`/onboarding/${provider}`); @@ -56,6 +28,9 @@ export default function Onboarding() { 'https://docs.komiser.io/docs/faqs#how-can-i-request-a-new-feature' ); + const handleSelectChange = (newValue: string) => + setProvider(newValue as Provider); + return (
@@ -76,12 +51,14 @@ export default function Onboarding() {
Get started now by connecting your first account.
- - -
-
+ option.value)} + /> Date: Thu, 13 Jul 2023 23:18:02 +0100 Subject: [PATCH 024/191] feat(fix): handling merge conflict removal --- .../view/alerts/hooks/useSlackAlerts.tsx | 115 ------------------ 1 file changed, 115 deletions(-) delete mode 100644 dashboard/components/inventory/components/view/alerts/hooks/useSlackAlerts.tsx diff --git a/dashboard/components/inventory/components/view/alerts/hooks/useSlackAlerts.tsx b/dashboard/components/inventory/components/view/alerts/hooks/useSlackAlerts.tsx deleted file mode 100644 index 566bf4836..000000000 --- a/dashboard/components/inventory/components/view/alerts/hooks/useSlackAlerts.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { useEffect, useState } from 'react'; -import settingsService from '../../../../../../services/settingsService'; - -type useSlackAlertsProps = { - viewId: number; -}; - -export type SlackAlert = { - id: number; - name: string; - viewId: string; - type: 'BUDGET' | 'USAGE'; - budget?: number | string; - usage?: number | string; - IsSlack?: boolean; - endpoint?: string; - secret?: string; -}; - -function useSlackAlerts({ viewId }: useSlackAlertsProps) { - const [loading, setLoading] = useState(true); - const [error, setError] = useState(false); - const [hasSlack, setHasSlack] = useState(false); - const [slackAlerts, setSlackAlerts] = useState(); - const [editSlackAlert, setEditSlackAlert] = useState(false); - const [currentSlackAlert, setCurrentSlackAlert] = useState(); - - function fetchSlackStatus() { - if (!loading) { - setLoading(true); - } - - if (error) { - setError(false); - } - - settingsService.getSlackIntegration().then(res => { - if (res === Error) { - setLoading(false); - setError(true); - } else { - setLoading(false); - setHasSlack(res.enabled); - } - }); - } - - function fetchViewAlerts() { - if (!loading) { - setLoading(true); - } - - if (error) { - setError(false); - } - - settingsService.getSlackAlertsFromAView(viewId).then(res => { - if (res === Error) { - setLoading(false); - setError(true); - } else { - setLoading(false); - setSlackAlerts(res); - } - }); - } - - function createOrEditSlackAlert(alertId?: number) { - if (alertId && slackAlerts) { - const foundSlackAlert = slackAlerts.find(alert => alert.id === alertId); - - if (foundSlackAlert) { - setCurrentSlackAlert(foundSlackAlert); - } - } - setEditSlackAlert(true); - } - - function closeSlackAlert(action?: 'hasChanges') { - setCurrentSlackAlert(undefined); - setEditSlackAlert(false); - - if (action === 'hasChanges') { - fetchViewAlerts(); - } - } - - useEffect(() => { - if (!hasSlack) { - fetchSlackStatus(); - } - - if (hasSlack && viewId) { - fetchViewAlerts(); - } - }, [hasSlack]); - - const hasNoSlackAlerts = - hasSlack && !editSlackAlert && slackAlerts && slackAlerts.length === 0; - - return { - loading, - error, - hasSlack, - slackAlerts, - hasNoSlackAlerts, - editSlackAlert, - currentSlackAlert, - createOrEditSlackAlert, - closeSlackAlert, - fetchViewAlerts - }; -} - -export default useSlackAlerts; From 7ee7b72691b45c7fc0c4fdfc01e2c3cbd6b9ecda Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Sun, 23 Jul 2023 12:09:12 +0100 Subject: [PATCH 025/191] feat(onboarding-wizard): fixing types, naming conventions, casing and application semantics --- dashboard/pages/onboarding/choose-cloud.tsx | 20 ++++---- .../pages/onboarding/choose-database.tsx | 46 ++++++++--------- .../pages/onboarding/database/postgres.tsx | 12 +++-- .../pages/onboarding/database/sqlite.tsx | 15 ++++-- .../pages/onboarding/{ => provider}/aws.tsx | 31 +++++------ .../pages/onboarding/{ => provider}/azure.tsx | 16 +++--- .../pages/onboarding/{ => provider}/civo.tsx | 23 +++++---- .../{ => provider}/digitalocean.tsx | 24 +++++---- .../onboarding/{ => provider}/kubernetes.tsx | 28 +++++----- dashboard/utils/providerHelper.ts | 51 ++++++++++++++----- 10 files changed, 158 insertions(+), 108 deletions(-) rename dashboard/pages/onboarding/{ => provider}/aws.tsx (82%) rename dashboard/pages/onboarding/{ => provider}/azure.tsx (90%) rename dashboard/pages/onboarding/{ => provider}/civo.tsx (74%) rename dashboard/pages/onboarding/{ => provider}/digitalocean.tsx (75%) rename dashboard/pages/onboarding/{ => provider}/kubernetes.tsx (75%) diff --git a/dashboard/pages/onboarding/choose-cloud.tsx b/dashboard/pages/onboarding/choose-cloud.tsx index 87d420c64..07f2992da 100644 --- a/dashboard/pages/onboarding/choose-cloud.tsx +++ b/dashboard/pages/onboarding/choose-cloud.tsx @@ -3,6 +3,11 @@ import Head from 'next/head'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; +import ProviderCls, { + allProviders, + Provider +} from '../../utils/providerHelper'; + import Button from '../../components/button/Button'; import OnboardingWizardLayout, { LeftSideLayout, @@ -10,17 +15,12 @@ import OnboardingWizardLayout, { } from '../../components/onboarding-wizard/OnboardingWizardLayout'; import SelectInput from '../../components/onboarding-wizard/SelectInput'; -import ProviderCls, { - allProviders, - Provider -} from '../../utils/providerHelper'; - -export default function Onboarding() { +export default function ChooseCloud() { const router = useRouter(); - const [provider, setProvider] = useState('aws'); + const [provider, setProvider] = useState(allProviders.AWS); const handleNext = () => { - router.push(`/onboarding/${provider}`); + router.push(`/onboarding/provider/${provider}`); }; const handleSuggest = () => @@ -54,9 +54,9 @@ export default function Onboarding() { ({ + displayValues={Object.values(allProviders).map(value => ({ label: ProviderCls.providerLabel(value) }))} /> diff --git a/dashboard/pages/onboarding/choose-database.tsx b/dashboard/pages/onboarding/choose-database.tsx index ca871a911..8ce9cde46 100644 --- a/dashboard/pages/onboarding/choose-database.tsx +++ b/dashboard/pages/onboarding/choose-database.tsx @@ -3,20 +3,20 @@ import Head from 'next/head'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; +import { DBProvider, allDBProviders } from '../../utils/providerHelper'; + import Button from '../../components/button/Button'; import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout } from '../../components/onboarding-wizard/OnboardingWizardLayout'; -type DB = 'postgres' | 'sqlite'; - interface DatabaseItemProps { - value: DB; - selected: DB; + value: DBProvider; + selected: DBProvider; label?: string; imageUrl: string; - handleClick: (db: DB) => void; + handleClick: (db: DBProvider) => void; } function DatabaseLeftItem({ @@ -31,9 +31,8 @@ function DatabaseLeftItem({ return (
{`${value} @@ -76,19 +73,19 @@ function DatabaseRightItem({ ); } -export default function Onboarding() { +export default function ChooseDatabase() { const router = useRouter(); - const [database, setDatabase] = useState('postgres'); + const [database, setDatabase] = useState(allDBProviders.POSTGRES); const handleNext = () => router.push(`/onboarding/database/${database}`); - const handleClick = (db: DB) => setDatabase(db); + const handleClick = (db: DBProvider) => setDatabase(db); return (
Select Database - Komiser - + @@ -150,24 +147,23 @@ export default function Onboarding() { alt="Komiser Logo" width={135} height={100} - className={`${ - database === 'postgres' - ? 'ml-16' - : 'rotate-onboarding-arrow ml-[182px]' - }`} + className={`${database === allDBProviders.POSTGRES + ? 'ml-16' + : 'rotate-onboarding-arrow ml-[182px]' + }`} />
diff --git a/dashboard/pages/onboarding/database/postgres.tsx b/dashboard/pages/onboarding/database/postgres.tsx index 9fd0e58cc..9eb8cbefc 100644 --- a/dashboard/pages/onboarding/database/postgres.tsx +++ b/dashboard/pages/onboarding/database/postgres.tsx @@ -1,5 +1,7 @@ import Head from 'next/head'; +import { allDBProviders } from '../../../utils/providerHelper'; + import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout @@ -9,13 +11,17 @@ import DatabasePurplin from '../../../components/onboarding-wizard/DatabasePurpl import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; export default function PostgreSQLCredentials() { - const handleNext = () => {}; + const database = allDBProviders.POSTGRES; + + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; return (
Configure Postgres - Komiser - + @@ -69,7 +75,7 @@ export default function PostgreSQLCredentials() { - +
diff --git a/dashboard/pages/onboarding/database/sqlite.tsx b/dashboard/pages/onboarding/database/sqlite.tsx index c7dbdfafc..8e94bee89 100644 --- a/dashboard/pages/onboarding/database/sqlite.tsx +++ b/dashboard/pages/onboarding/database/sqlite.tsx @@ -1,6 +1,8 @@ import Head from 'next/head'; import { useRef } from 'react'; +import { allDBProviders } from '../../../utils/providerHelper'; + import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout @@ -10,8 +12,12 @@ import DatabasePurplin from '../../../components/onboarding-wizard/DatabasePurpl import InputFileSelect from '../../../components/onboarding-wizard/InputFileSelect'; import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; -export default function PostgreSQLCredentials() { - const handleNext = () => {}; +export default function SqliteCredentials() { + const database = allDBProviders.SQLITE; + + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; const fileInputRef = useRef(null); const handleButtonClick = () => { @@ -22,8 +28,7 @@ export default function PostgreSQLCredentials() { const handleFileChange = (event: any) => { const file = event.target.files[0]; - // Set Input field to file.name and use temporary file path for the upload value - console.log(file); + // TODO: (onboarding-wizard) handle file change and naming. Set Input field to file.name and use temporary file path for the upload value }; return ( @@ -66,7 +71,7 @@ export default function PostgreSQLCredentials() { - +
diff --git a/dashboard/pages/onboarding/aws.tsx b/dashboard/pages/onboarding/provider/aws.tsx similarity index 82% rename from dashboard/pages/onboarding/aws.tsx rename to dashboard/pages/onboarding/provider/aws.tsx index b15c36678..8d3860bea 100644 --- a/dashboard/pages/onboarding/aws.tsx +++ b/dashboard/pages/onboarding/provider/aws.tsx @@ -2,21 +2,23 @@ import Head from 'next/head'; import { useRouter } from 'next/router'; import { ReactNode, useRef, useState } from 'react'; -import KeyIcon from '../../components/icons/KeyIcon'; -import Folder2Icon from '../../components/icons/Folder2Icon'; -import VariableIcon from '../../components/icons/VariableIcon'; -import DocumentTextIcon from '../../components/icons/DocumentTextIcon'; -import ShieldSecurityIcon from '../../components/icons/ShieldSecurityIcon'; +import { allProviders } from '../../../utils/providerHelper'; + +import KeyIcon from '../../../components/icons/KeyIcon'; +import Folder2Icon from '../../../components/icons/Folder2Icon'; +import VariableIcon from '../../../components/icons/VariableIcon'; +import DocumentTextIcon from '../../../components/icons/DocumentTextIcon'; +import ShieldSecurityIcon from '../../../components/icons/ShieldSecurityIcon'; import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout -} from '../../components/onboarding-wizard/OnboardingWizardLayout'; -import SelectInput from '../../components/onboarding-wizard/SelectInput'; -import PurplinCloud from '../../components/onboarding-wizard/PurplinCloud'; -import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; -import InputFileSelect from '../../components/onboarding-wizard/InputFileSelect'; -import CredentialsButton from '../../components/onboarding-wizard/CredentialsButton'; +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import SelectInput from '../../../components/onboarding-wizard/SelectInput'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import InputFileSelect from '../../../components/onboarding-wizard/InputFileSelect'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; interface SelectOptions { icon: ReactNode; @@ -48,7 +50,7 @@ const options: SelectOptions[] = [ ]; export default function AWSCredentials() { - const provider = 'aws'; + const provider = allProviders.AWS; const router = useRouter(); const [credentialType, setCredentialType] = useState( @@ -56,7 +58,7 @@ export default function AWSCredentials() { ); const handleNext = () => { - router.push(`/onboarding/${provider}`); + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation }; const fileInputRef = useRef(null); @@ -68,8 +70,7 @@ export default function AWSCredentials() { const handleFileChange = (event: any) => { const file = event.target.files[0]; - // Set Input field to file.name and use temporary file path for the upload value - console.log(file); + // TODO: (onboarding-wizard) handle file change and naming. Set Input field to file.name and use temporary file path for the upload value }; function handleSelectChange(newValue: string) { diff --git a/dashboard/pages/onboarding/azure.tsx b/dashboard/pages/onboarding/provider/azure.tsx similarity index 90% rename from dashboard/pages/onboarding/azure.tsx rename to dashboard/pages/onboarding/provider/azure.tsx index 2ad2900b9..da10e9dc2 100644 --- a/dashboard/pages/onboarding/azure.tsx +++ b/dashboard/pages/onboarding/provider/azure.tsx @@ -1,17 +1,21 @@ import Head from 'next/head'; +import { allProviders } from '../../../utils/providerHelper'; + import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout -} from '../../components/onboarding-wizard/OnboardingWizardLayout'; -import PurplinCloud from '../../components/onboarding-wizard/PurplinCloud'; -import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; -import CredentialsButton from '../../components/onboarding-wizard/CredentialsButton'; +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; export default function AzureCredentials() { - const provider = 'azure'; + const provider = allProviders.AZURE; - const handleNext = () => {}; + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; return (
diff --git a/dashboard/pages/onboarding/civo.tsx b/dashboard/pages/onboarding/provider/civo.tsx similarity index 74% rename from dashboard/pages/onboarding/civo.tsx rename to dashboard/pages/onboarding/provider/civo.tsx index f3e18b44b..edd41e2e4 100644 --- a/dashboard/pages/onboarding/civo.tsx +++ b/dashboard/pages/onboarding/provider/civo.tsx @@ -1,24 +1,29 @@ import Head from 'next/head'; +import { allProviders } from '../../../utils/providerHelper'; + +import RecordCircleIcon from '../../../components/icons/RecordCircleIcon'; + import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout -} from '../../components/onboarding-wizard/OnboardingWizardLayout'; -import RecordCircleIcon from '../../components/icons/RecordCircleIcon'; -import PurplinCloud from '../../components/onboarding-wizard/PurplinCloud'; -import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; -import CredentialsButton from '../../components/onboarding-wizard/CredentialsButton'; +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; -export default function AzureCredentials() { - const provider = 'civo'; +export default function CivoCredentials() { + const provider = allProviders.CIVO; - const handleNext = () => {}; + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; return (
Setup Civo - Komiser - + diff --git a/dashboard/pages/onboarding/digitalocean.tsx b/dashboard/pages/onboarding/provider/digitalocean.tsx similarity index 75% rename from dashboard/pages/onboarding/digitalocean.tsx rename to dashboard/pages/onboarding/provider/digitalocean.tsx index 223e5d03f..d23e967d2 100644 --- a/dashboard/pages/onboarding/digitalocean.tsx +++ b/dashboard/pages/onboarding/provider/digitalocean.tsx @@ -1,23 +1,29 @@ import Head from 'next/head'; +import { allProviders } from '../../../utils/providerHelper'; + +import RecordCircleIcon from '../../../components/icons/RecordCircleIcon'; + import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout -} from '../../components/onboarding-wizard/OnboardingWizardLayout'; -import PurplinCloud from '../../components/onboarding-wizard/PurplinCloud'; -import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; -import CredentialsButton from '../../components/onboarding-wizard/CredentialsButton'; -import RecordCircleIcon from '../../components/icons/RecordCircleIcon'; +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +export default function DigitalOceanCredentials() { + const provider = allProviders.DIGITAL_OCEAN; -export default function AzureCredentials() { - const provider = 'digitalocean'; - const handleNext = () => {}; + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; return (
Setup DigitalOcean - Komiser - + diff --git a/dashboard/pages/onboarding/kubernetes.tsx b/dashboard/pages/onboarding/provider/kubernetes.tsx similarity index 75% rename from dashboard/pages/onboarding/kubernetes.tsx rename to dashboard/pages/onboarding/provider/kubernetes.tsx index 9256ff8d6..96298397e 100644 --- a/dashboard/pages/onboarding/kubernetes.tsx +++ b/dashboard/pages/onboarding/provider/kubernetes.tsx @@ -2,17 +2,20 @@ import Head from 'next/head'; import { useRouter } from 'next/router'; import { ReactNode, useRef, useState } from 'react'; +import { allProviders } from '../../../utils/providerHelper'; + +import Folder2Icon from '../../../components/icons/Folder2Icon'; +import DocumentTextIcon from '../../../components/icons/DocumentTextIcon'; + import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout -} from '../../components/onboarding-wizard/OnboardingWizardLayout'; -import Folder2Icon from '../../components/icons/Folder2Icon'; -import DocumentTextIcon from '../../components/icons/DocumentTextIcon'; -import SelectInput from '../../components/onboarding-wizard/SelectInput'; -import PurplinCloud from '../../components/onboarding-wizard/PurplinCloud'; -import LabelledInput from '../../components/onboarding-wizard/LabelledInput'; -import InputFileSelect from '../../components/onboarding-wizard/InputFileSelect'; -import CredentialsButton from '../../components/onboarding-wizard/CredentialsButton'; +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import SelectInput from '../../../components/onboarding-wizard/SelectInput'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import InputFileSelect from '../../../components/onboarding-wizard/InputFileSelect'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; interface SelectOptions { icon: ReactNode; @@ -28,8 +31,8 @@ const options: SelectOptions[] = [ }, ]; -export default function AWSCredentials() { - const provider = 'kubernetes'; +export default function KubernetesCredentials() { + const provider = allProviders.KUBERNETES; const router = useRouter(); const [credentialType, setCredentialType] = useState( @@ -37,6 +40,7 @@ export default function AWSCredentials() { ); const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation router.push(`/onboarding/${provider}`); }; @@ -49,7 +53,7 @@ export default function AWSCredentials() { const handleFileChange = (event: any) => { const file = event.target.files[0]; - // Set Input field to file.name and use temporary file path for the upload value + // TODO: (onboarding-wizard) handle file change and naming. Set Input field to file.name and use temporary file path for the upload value console.log(file); }; @@ -61,7 +65,7 @@ export default function AWSCredentials() {
Setup Kubernetes - Komiser - + diff --git a/dashboard/utils/providerHelper.ts b/dashboard/utils/providerHelper.ts index 4f2cf57a1..ccb051c23 100644 --- a/dashboard/utils/providerHelper.ts +++ b/dashboard/utils/providerHelper.ts @@ -12,20 +12,43 @@ export type Provider = | 'scaleway' | 'mongodbatlas'; -export const allProviders: Provider[] = [ - 'aws', - 'gcp', - 'ovh', - 'digitalocean', - 'azure', - 'civo', - 'kubernetes', - 'linode', - 'tencent', - 'oci', - 'scaleway', - 'mongodbatlas' -]; +type ProviderKey = + | 'AWS' + | 'GCP' + | 'OVH' + | 'DIGITAL_OCEAN' + | 'AZURE' + | 'CIVO' + | 'KUBERNETES' + | 'LINODE' + | 'TENCENT' + | 'OCI' + | 'SCALE_WAY' + | 'MONGODB_ATLAS'; + +export const allProviders: { [key in ProviderKey]: Provider } = { + AWS: 'aws', + GCP: 'gcp', + OVH: 'ovh', + DIGITAL_OCEAN: 'digitalocean', + AZURE: 'azure', + CIVO: 'civo', + KUBERNETES: 'kubernetes', + LINODE: 'linode', + TENCENT: 'tencent', + OCI: 'oci', + SCALE_WAY: 'scaleway', + MONGODB_ATLAS: 'mongodbatlas' +}; + +export type DBProvider = 'postgres' | 'sqlite'; + +type DBProviderKey = 'POSTGRES' | 'SQLITE'; + +export const allDBProviders: { [key in DBProviderKey]: DBProvider } = { + POSTGRES: 'postgres', + SQLITE: 'sqlite' +}; const providers = { providerLabel(arg: Provider) { From e8a0a9b0bf1a67bf3ee0c8c3eb6f4b82399be220 Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Sun, 23 Jul 2023 12:20:19 +0100 Subject: [PATCH 026/191] feat(onboarding-wizard): streamlining beta flag for app using context --- dashboard/pages/index.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dashboard/pages/index.tsx b/dashboard/pages/index.tsx index d7a0f7dfd..7bc74d11b 100644 --- a/dashboard/pages/index.tsx +++ b/dashboard/pages/index.tsx @@ -1,12 +1,15 @@ import { useRouter } from 'next/router'; -import { useEffect } from 'react'; +import { useContext, useEffect } from 'react'; + +import GlobalAppContext from '../components/layout/context/GlobalAppContext'; function Home() { + const { betaFlagOnboardingWizard } = useContext(GlobalAppContext); + const router = useRouter(); - const isBetaFlagOnboardingWizard = true; useEffect(() => { - if (isBetaFlagOnboardingWizard) { + if (betaFlagOnboardingWizard) { router.push('/onboarding/choose-cloud'); } else { router.push('/dashboard'); From 129ceb78f4c9b2f6d1d62e9e45315c422a673761 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 17:03:14 +0530 Subject: [PATCH 027/191] Create lke_pools.go --- providers/linode/linode-lke/lke_pools.go | 64 ++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 providers/linode/linode-lke/lke_pools.go diff --git a/providers/linode/linode-lke/lke_pools.go b/providers/linode/linode-lke/lke_pools.go new file mode 100644 index 000000000..15c923102 --- /dev/null +++ b/providers/linode/linode-lke/lke_pools.go @@ -0,0 +1,64 @@ +package linode-lke + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/linode/linodego" + log "github.com/sirupsen/logrus" + + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/providers" +) + +type LinodeLKENodePool struct { + NodePool *linodego.LKECluster `json:"node_pool"` +} + +func LKENodePools(ctx context.Context, client providers.ProviderClient, linodeLKENodePools []LinodeLKENodePool) ([]Resource, error) { + resources := make([]Resource, 0) + + for _, lkeNodePool := range linodeLKENodePools { + nodePool := lkeNodePool.NodePool + + tags := make([]Tag, 0) + // If Linode LKE node pools have tags, you can handle them here. + // Replace the example tags below with your actual tag handling logic. + if len(nodePool.Tags) > 0 { + tags = append(tags, models.Tag{ + Key: "example-key", + Value: nodePool.Tags[0], + }) + } + + // Get the count of nodes in the pool. + // Note: Linode does not provide direct access to the node count in the node pool. + // You may need to handle this based on the context in which you manage the LKE node pools. + nodeCount := 0 + + resources = append(resources, models.Resource{ + Provider: "Linode", + Account: client.Name, + Service: "Linode Kubernetes Engine", + Region: nodePool.Region, + ResourceId: fmt.Sprintf("%d", nodePool.ID), + Cost: 0, + Name: nodePool.Label, + FetchedAt: time.Now(), + CreatedAt: time.Time{}, // Update this with the actual created time. + Tags: tags, + Link: fmt.Sprintf("https://cloud.linode.com/kubernetes/clusters/%d", nodePool.ID), + // Add any additional fields or data you want to collect here. + }) + } + + log.WithFields(log.Fields{ + "provider": "Linode", + "account": client.Name, + "service": "Linode Kubernetes Engine", + "resources": len(resources), + }).Info("Fetched LKE node pools") + return resources, nil +} From 83da841f00506e9baaae9ead361e7a2fc6a1dc4a Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 17:05:46 +0530 Subject: [PATCH 028/191] Update linode.go --- providers/linode/linode.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/providers/linode/linode.go b/providers/linode/linode.go index 2677d88c7..a0ade1085 100644 --- a/providers/linode/linode.go +++ b/providers/linode/linode.go @@ -13,6 +13,7 @@ import ( "github.com/tailwarden/komiser/providers/linode/sql" "github.com/tailwarden/komiser/providers/linode/postgres" "github.com/tailwarden/komiser/providers/linode/storage" + "github.com/tailwarden/komiser/providers/linode/linode-lke" "github.com/uptrace/bun" ) @@ -27,6 +28,7 @@ func listOfSupportedServices() []providers.FetchDataFunction { networking.Firewalls, sql.Instances, postgres.Instances, + linode-lke.LKENodePools, } } From bf38dd5623afd5d024bbd0ff19fd63eafd38e7f8 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 17:16:36 +0530 Subject: [PATCH 029/191] Update lke_pools.go --- providers/linode/linode-lke/lke_pools.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/linode/linode-lke/lke_pools.go b/providers/linode/linode-lke/lke_pools.go index 15c923102..d251e719d 100644 --- a/providers/linode/linode-lke/lke_pools.go +++ b/providers/linode/linode-lke/lke_pools.go @@ -1,4 +1,4 @@ -package linode-lke +package linodelke import ( "context" From d04397df23618a9a263efa62e87d2431910cb181 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 17:30:53 +0530 Subject: [PATCH 030/191] Update lke_pools.go --- providers/linode/linode-lke/lke_pools.go | 67 +++++++++++++----------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/providers/linode/linode-lke/lke_pools.go b/providers/linode/linode-lke/lke_pools.go index d251e719d..cdc78718f 100644 --- a/providers/linode/linode-lke/lke_pools.go +++ b/providers/linode/linode-lke/lke_pools.go @@ -1,4 +1,4 @@ -package linodelke +package compute import ( "context" @@ -17,41 +17,46 @@ type LinodeLKENodePool struct { NodePool *linodego.LKECluster `json:"node_pool"` } -func LKENodePools(ctx context.Context, client providers.ProviderClient, linodeLKENodePools []LinodeLKENodePool) ([]Resource, error) { - resources := make([]Resource, 0) +func LKENodePools(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { + resources := make([]models.Resource, 0) - for _, lkeNodePool := range linodeLKENodePools { - nodePool := lkeNodePool.NodePool + lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptions{}) + if err != nil { + return resources, err + } - tags := make([]Tag, 0) - // If Linode LKE node pools have tags, you can handle them here. - // Replace the example tags below with your actual tag handling logic. - if len(nodePool.Tags) > 0 { - tags = append(tags, models.Tag{ - Key: "example-key", - Value: nodePool.Tags[0], - }) + for _, lkeCluster := range lkeClusters { + nodePools, err := client.LinodeClient.ListLKEClusterNodePools(ctx, lkeCluster.ID, &linodego.ListOptions{}) + if err != nil { + return resources, err } - // Get the count of nodes in the pool. - // Note: Linode does not provide direct access to the node count in the node pool. - // You may need to handle this based on the context in which you manage the LKE node pools. - nodeCount := 0 + for _, nodePool := range nodePools { + tags := make([]models.Tag, 0) + // If Linode LKE node pools have tags, you can handle them here. + // Replace the example tags below with your actual tag handling logic. + if len(nodePool.Tags) > 0 { + tags = append(tags, models.Tag{ + Key: "example-key", + Value: nodePool.Tags[0], + }) + } - resources = append(resources, models.Resource{ - Provider: "Linode", - Account: client.Name, - Service: "Linode Kubernetes Engine", - Region: nodePool.Region, - ResourceId: fmt.Sprintf("%d", nodePool.ID), - Cost: 0, - Name: nodePool.Label, - FetchedAt: time.Now(), - CreatedAt: time.Time{}, // Update this with the actual created time. - Tags: tags, - Link: fmt.Sprintf("https://cloud.linode.com/kubernetes/clusters/%d", nodePool.ID), - // Add any additional fields or data you want to collect here. - }) + resources = append(resources, models.Resource{ + Provider: "Linode", + Account: client.Name, + Service: "Linode Kubernetes Engine", + Region: nodePool.Region, + ResourceId: fmt.Sprintf("%d", nodePool.ID), + Cost: 0, + Name: nodePool.Label, + FetchedAt: time.Now(), + CreatedAt: time.Time{}, // Update this with the actual created time. + Tags: tags, + Link: fmt.Sprintf("https://cloud.linode.com/kubernetes/clusters/%d", lkeCluster.ID), + // Add any additional fields or data you want to collect here. + }) + } } log.WithFields(log.Fields{ From bcba7b0c4d19f01391a4ca3396fa3170ef48a1b8 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 17:45:30 +0530 Subject: [PATCH 031/191] Update lke_pools.go --- providers/linode/linode-lke/lke_pools.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/linode/linode-lke/lke_pools.go b/providers/linode/linode-lke/lke_pools.go index cdc78718f..f693e0925 100644 --- a/providers/linode/linode-lke/lke_pools.go +++ b/providers/linode/linode-lke/lke_pools.go @@ -26,7 +26,7 @@ func LKENodePools(ctx context.Context, client providers.ProviderClient) ([]model } for _, lkeCluster := range lkeClusters { - nodePools, err := client.LinodeClient.ListLKEClusterNodePools(ctx, lkeCluster.ID, &linodego.ListOptions{}) + nodePools, err := client.LinodeClient.ListLKENodePool(ctx, lkeCluster.ID, &linodego.ListOptions{}) if err != nil { return resources, err } From 96acc281aa5bef2a378bdb5312e1d30d309cf0dd Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 17:55:04 +0530 Subject: [PATCH 032/191] Update lke_pools.go --- providers/linode/linode-lke/lke_pools.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/linode/linode-lke/lke_pools.go b/providers/linode/linode-lke/lke_pools.go index f693e0925..9aff104ee 100644 --- a/providers/linode/linode-lke/lke_pools.go +++ b/providers/linode/linode-lke/lke_pools.go @@ -26,7 +26,7 @@ func LKENodePools(ctx context.Context, client providers.ProviderClient) ([]model } for _, lkeCluster := range lkeClusters { - nodePools, err := client.LinodeClient.ListLKENodePool(ctx, lkeCluster.ID, &linodego.ListOptions{}) + nodePools, err := client.LinodeClient.ListLKENodePools(ctx, lkeCluster.ID, &linodego.ListOptions{}) if err != nil { return resources, err } From 6b7b435029173049b6283b27ed0dd6c63fb200cb Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 18:04:49 +0530 Subject: [PATCH 033/191] Update lke_pools.go --- providers/linode/linode-lke/lke_pools.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/providers/linode/linode-lke/lke_pools.go b/providers/linode/linode-lke/lke_pools.go index 9aff104ee..0024bf9f8 100644 --- a/providers/linode/linode-lke/lke_pools.go +++ b/providers/linode/linode-lke/lke_pools.go @@ -3,7 +3,7 @@ package compute import ( "context" "fmt" - "strings" + // "strings" "time" "github.com/linode/linodego" @@ -46,10 +46,10 @@ func LKENodePools(ctx context.Context, client providers.ProviderClient) ([]model Provider: "Linode", Account: client.Name, Service: "Linode Kubernetes Engine", - Region: nodePool.Region, + // Region: nodePool.Region, ResourceId: fmt.Sprintf("%d", nodePool.ID), Cost: 0, - Name: nodePool.Label, + // Name: nodePool.Label, FetchedAt: time.Now(), CreatedAt: time.Time{}, // Update this with the actual created time. Tags: tags, From 285ab79ad77e92b343190eb50a2578e016030b79 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 18:17:43 +0530 Subject: [PATCH 034/191] Delete providers/linode/linode-lke directory --- providers/linode/linode-lke/lke_pools.go | 69 ------------------------ 1 file changed, 69 deletions(-) delete mode 100644 providers/linode/linode-lke/lke_pools.go diff --git a/providers/linode/linode-lke/lke_pools.go b/providers/linode/linode-lke/lke_pools.go deleted file mode 100644 index 0024bf9f8..000000000 --- a/providers/linode/linode-lke/lke_pools.go +++ /dev/null @@ -1,69 +0,0 @@ -package compute - -import ( - "context" - "fmt" - // "strings" - "time" - - "github.com/linode/linodego" - log "github.com/sirupsen/logrus" - - "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/providers" -) - -type LinodeLKENodePool struct { - NodePool *linodego.LKECluster `json:"node_pool"` -} - -func LKENodePools(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { - resources := make([]models.Resource, 0) - - lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptions{}) - if err != nil { - return resources, err - } - - for _, lkeCluster := range lkeClusters { - nodePools, err := client.LinodeClient.ListLKENodePools(ctx, lkeCluster.ID, &linodego.ListOptions{}) - if err != nil { - return resources, err - } - - for _, nodePool := range nodePools { - tags := make([]models.Tag, 0) - // If Linode LKE node pools have tags, you can handle them here. - // Replace the example tags below with your actual tag handling logic. - if len(nodePool.Tags) > 0 { - tags = append(tags, models.Tag{ - Key: "example-key", - Value: nodePool.Tags[0], - }) - } - - resources = append(resources, models.Resource{ - Provider: "Linode", - Account: client.Name, - Service: "Linode Kubernetes Engine", - // Region: nodePool.Region, - ResourceId: fmt.Sprintf("%d", nodePool.ID), - Cost: 0, - // Name: nodePool.Label, - FetchedAt: time.Now(), - CreatedAt: time.Time{}, // Update this with the actual created time. - Tags: tags, - Link: fmt.Sprintf("https://cloud.linode.com/kubernetes/clusters/%d", lkeCluster.ID), - // Add any additional fields or data you want to collect here. - }) - } - } - - log.WithFields(log.Fields{ - "provider": "Linode", - "account": client.Name, - "service": "Linode Kubernetes Engine", - "resources": len(resources), - }).Info("Fetched LKE node pools") - return resources, nil -} From 5f0b29a8fc1f967505582b7ea62054bfccf69768 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 18:34:12 +0530 Subject: [PATCH 035/191] Create lke_pool.go --- providers/linode/lkepool/lke_pool.go | 67 ++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 providers/linode/lkepool/lke_pool.go diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go new file mode 100644 index 000000000..cfa17f57e --- /dev/null +++ b/providers/linode/lkepool/lke_pool.go @@ -0,0 +1,67 @@ +package lkepool + +import ( + "context" + "fmt" + "time" + + "github.com/linode/linodego" + log "github.com/sirupsen/logrus" + + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/providers" +) + +type LinodeLKENodePool struct { + NodePool *linodego.LKECluster `json:"node_pool"` +} + +func LKENodePools(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { + resources := make([]models.Resource, 0) + + nodePools, err := client.LinodeClient.ListLKENodePools(ctx, nil) + if err != nil { + return resources, err + } + + for _, nodePool := range nodePools { + tags := make([]models.Tag, 0) + for _, tag := range nodePool.Tags { + if strings.Contains(tag, ":") { + parts := strings.Split(tag, ":") + tags = append(tags, models.Tag{ + Key: parts[0], + Value: parts[1], + }) + } else { + tags = append(tags, models.Tag{ + Key: tag, + Value: tag, + }) + } + } + + resources = append(resources, models.Resource{ + Provider: "Linode", + Account: client.Name, + Service: "Linode Kubernetes Engine", + // Region: nodePool.Region, + ResourceId: fmt.Sprintf("%d", nodePool.ID), + Cost: 0, + // Name: nodePool.Label, + FetchedAt: time.Now(), + CreatedAt: time.Time{}, // Update this with the actual created time. + Tags: tags, + Link: fmt.Sprintf("https://cloud.linode.com/kubernetes/clusters/%d", nodePool.ID), + // Add any additional fields or data you want to collect here. + }) + } + + log.WithFields(log.Fields{ + "provider": "Linode", + "account": client.Name, + "service": "Linode Kubernetes Engine", + "resources": len(resources), + }).Info("Fetched LKE node pools") + return resources, nil +} From 55675e0a2541e73c95dd0ed6586a9b2c8fce131d Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 18:34:15 +0530 Subject: [PATCH 036/191] Update linode.go --- providers/linode/linode.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/linode/linode.go b/providers/linode/linode.go index a0ade1085..87537b3fc 100644 --- a/providers/linode/linode.go +++ b/providers/linode/linode.go @@ -13,7 +13,7 @@ import ( "github.com/tailwarden/komiser/providers/linode/sql" "github.com/tailwarden/komiser/providers/linode/postgres" "github.com/tailwarden/komiser/providers/linode/storage" - "github.com/tailwarden/komiser/providers/linode/linode-lke" + "github.com/tailwarden/komiser/providers/linode/lkepool" "github.com/uptrace/bun" ) @@ -28,7 +28,7 @@ func listOfSupportedServices() []providers.FetchDataFunction { networking.Firewalls, sql.Instances, postgres.Instances, - linode-lke.LKENodePools, + lkepool.LKENodePools, } } From fce994602a88d5f01ee094c758e4f254045b88eb Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 19:09:57 +0530 Subject: [PATCH 037/191] Update lke_pool.go strings added --- providers/linode/lkepool/lke_pool.go | 1 + 1 file changed, 1 insertion(+) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index cfa17f57e..fb3683f0c 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -3,6 +3,7 @@ package lkepool import ( "context" "fmt" + "strings" "time" "github.com/linode/linodego" From cb984e2198a8107dca2b700faa2af34981015c65 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 19:28:07 +0530 Subject: [PATCH 038/191] Update lke_pool.go --- providers/linode/lkepool/lke_pool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index fb3683f0c..0f19325df 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -20,7 +20,7 @@ type LinodeLKENodePool struct { func LKENodePools(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { resources := make([]models.Resource, 0) - nodePools, err := client.LinodeClient.ListLKENodePools(ctx, nil) + nodePools, err := client.LinodeClient.ListLKENodePools(ctx, &linodego.ListOptions{}) if err != nil { return resources, err } From 0469f946c05302a7d4db9fa11ed6045a2b01ac08 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 19:41:36 +0530 Subject: [PATCH 039/191] Update lke_pool.go --- providers/linode/lkepool/lke_pool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index 0f19325df..764265ff2 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -20,7 +20,7 @@ type LinodeLKENodePool struct { func LKENodePools(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { resources := make([]models.Resource, 0) - nodePools, err := client.LinodeClient.ListLKENodePools(ctx, &linodego.ListOptions{}) + nodePools, err := client.LinodeClient.ListLKENodePools(ctx,int, &linodego.ListOptions{}) if err != nil { return resources, err } From 4833038a5ec95503c17afebab1ea3f484b75bc40 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 20:26:39 +0530 Subject: [PATCH 040/191] Update lke_pool.go --- providers/linode/lkepool/lke_pool.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index 764265ff2..dce15db1a 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -20,11 +20,17 @@ type LinodeLKENodePool struct { func LKENodePools(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { resources := make([]models.Resource, 0) - nodePools, err := client.LinodeClient.ListLKENodePools(ctx,int, &linodego.ListOptions{}) + +lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptions{}) if err != nil { return resources, err } + for _, lkeCluster := range lkeClusters { + nodePools, err := client.LinodeClient.ListLKENodePools(ctx, lkeCluster.ID, &linodego.ListOptions{}) + if err != nil { + return resources, err + } for _, nodePool := range nodePools { tags := make([]models.Tag, 0) for _, tag := range nodePool.Tags { From a8fbe8a90ff0f1d75e613e710152799ea992fdf3 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sun, 23 Jul 2023 20:42:23 +0530 Subject: [PATCH 041/191] Update lke_pool.go --- providers/linode/lkepool/lke_pool.go | 1 + 1 file changed, 1 insertion(+) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index dce15db1a..50196d753 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -62,6 +62,7 @@ lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptio Link: fmt.Sprintf("https://cloud.linode.com/kubernetes/clusters/%d", nodePool.ID), // Add any additional fields or data you want to collect here. }) + } } log.WithFields(log.Fields{ From 596a117fcfe8221cb744ecf8b7d04bbd2a1cb62b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Phillip-Hope=20K=E1=BB=8Dla=CC=81w=E1=BB=8Dle=CC=81=20O?= =?UTF-8?q?=CC=80jo=CD=81?= <61082329+Kolawole99@users.noreply.github.com> Date: Wed, 26 Jul 2023 20:23:29 +0100 Subject: [PATCH 042/191] feat: onboarding wizard (#880) Co-authored-by: LABOUARDY Mohamed Co-authored-by: ShubhamPalriwala --- .../components/icons/DocumentTextIcon.tsx | 47 +++++ dashboard/components/icons/Folder2Icon.tsx | 29 +++ dashboard/components/icons/KeyIcon.tsx | 38 ++++ .../components/icons/RecordCircleIcon.tsx | 30 +++ .../components/icons/ShieldSecurityIcon.tsx | 38 ++++ dashboard/components/icons/VariableIcon.tsx | 26 +++ dashboard/components/layout/Layout.tsx | 123 ++++++----- .../layout/context/GlobalAppContext.tsx | 4 +- .../onboarding-wizard/CredentialsButton.tsx | 39 ++++ .../onboarding-wizard/DatabasePurplin.tsx | 32 +++ .../onboarding-wizard/InputFileSelect.tsx | 72 +++++++ .../onboarding-wizard/LabelledInput.tsx | 58 ++++++ .../OnboardingWizardLayout.tsx | 63 ++++++ .../onboarding-wizard/PageHeaders.tsx | 18 ++ .../onboarding-wizard/ProgressBar.tsx | 9 + .../onboarding-wizard/PurplinCloud.tsx | 28 +++ .../onboarding-wizard/SelectInput.tsx | 92 +++++++++ dashboard/components/select/Select.tsx | 2 +- dashboard/pages/index.tsx | 12 +- dashboard/pages/onboarding/choose-cloud.tsx | 121 +++++++++++ .../pages/onboarding/choose-database.tsx | 176 ++++++++++++++++ dashboard/pages/onboarding/complete.tsx | 66 ++++++ .../pages/onboarding/database/postgres.tsx | 83 ++++++++ .../pages/onboarding/database/sqlite.tsx | 79 +++++++ dashboard/pages/onboarding/provider/aws.tsx | 194 ++++++++++++++++++ dashboard/pages/onboarding/provider/azure.tsx | 144 +++++++++++++ dashboard/pages/onboarding/provider/civo.tsx | 90 ++++++++ .../onboarding/provider/digitalocean.tsx | 90 ++++++++ .../pages/onboarding/provider/kubernetes.tsx | 134 ++++++++++++ .../assets/img/database/db-arrow-vector.svg | 9 + .../public/assets/img/database/postgresql.svg | 9 + .../assets/img/database/selectdb-komiser.svg | 96 +++++++++ .../public/assets/img/database/sqlite.svg | 9 + .../public/assets/img/others/arrow-down.svg | 26 +++ .../assets/img/others/empty-dashboard.png | Bin 0 -> 38855 bytes .../assets/img/others/onboarding-cloud.svg | 17 ++ dashboard/styles/globals.css | 17 ++ dashboard/utils/providerHelper.ts | 38 ++++ 38 files changed, 2108 insertions(+), 50 deletions(-) create mode 100644 dashboard/components/icons/DocumentTextIcon.tsx create mode 100644 dashboard/components/icons/Folder2Icon.tsx create mode 100644 dashboard/components/icons/KeyIcon.tsx create mode 100644 dashboard/components/icons/RecordCircleIcon.tsx create mode 100644 dashboard/components/icons/ShieldSecurityIcon.tsx create mode 100644 dashboard/components/icons/VariableIcon.tsx create mode 100644 dashboard/components/onboarding-wizard/CredentialsButton.tsx create mode 100644 dashboard/components/onboarding-wizard/DatabasePurplin.tsx create mode 100644 dashboard/components/onboarding-wizard/InputFileSelect.tsx create mode 100644 dashboard/components/onboarding-wizard/LabelledInput.tsx create mode 100644 dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx create mode 100644 dashboard/components/onboarding-wizard/PageHeaders.tsx create mode 100644 dashboard/components/onboarding-wizard/ProgressBar.tsx create mode 100644 dashboard/components/onboarding-wizard/PurplinCloud.tsx create mode 100644 dashboard/components/onboarding-wizard/SelectInput.tsx create mode 100644 dashboard/pages/onboarding/choose-cloud.tsx create mode 100644 dashboard/pages/onboarding/choose-database.tsx create mode 100644 dashboard/pages/onboarding/complete.tsx create mode 100644 dashboard/pages/onboarding/database/postgres.tsx create mode 100644 dashboard/pages/onboarding/database/sqlite.tsx create mode 100644 dashboard/pages/onboarding/provider/aws.tsx create mode 100644 dashboard/pages/onboarding/provider/azure.tsx create mode 100644 dashboard/pages/onboarding/provider/civo.tsx create mode 100644 dashboard/pages/onboarding/provider/digitalocean.tsx create mode 100644 dashboard/pages/onboarding/provider/kubernetes.tsx create mode 100644 dashboard/public/assets/img/database/db-arrow-vector.svg create mode 100644 dashboard/public/assets/img/database/postgresql.svg create mode 100644 dashboard/public/assets/img/database/selectdb-komiser.svg create mode 100644 dashboard/public/assets/img/database/sqlite.svg create mode 100644 dashboard/public/assets/img/others/arrow-down.svg create mode 100644 dashboard/public/assets/img/others/empty-dashboard.png create mode 100644 dashboard/public/assets/img/others/onboarding-cloud.svg diff --git a/dashboard/components/icons/DocumentTextIcon.tsx b/dashboard/components/icons/DocumentTextIcon.tsx new file mode 100644 index 000000000..15ee47823 --- /dev/null +++ b/dashboard/components/icons/DocumentTextIcon.tsx @@ -0,0 +1,47 @@ +import { SVGProps } from 'react'; + +const DocumentTextIcon = (props: SVGProps) => ( + + + + + + +); + +export default DocumentTextIcon; diff --git a/dashboard/components/icons/Folder2Icon.tsx b/dashboard/components/icons/Folder2Icon.tsx new file mode 100644 index 000000000..d307d2ac9 --- /dev/null +++ b/dashboard/components/icons/Folder2Icon.tsx @@ -0,0 +1,29 @@ +import { SVGProps } from 'react'; + +const Folder2Icon = (props: SVGProps) => ( + + + + +); + +export default Folder2Icon; diff --git a/dashboard/components/icons/KeyIcon.tsx b/dashboard/components/icons/KeyIcon.tsx new file mode 100644 index 000000000..53181b28a --- /dev/null +++ b/dashboard/components/icons/KeyIcon.tsx @@ -0,0 +1,38 @@ +import { SVGProps } from 'react'; + +const KeyIcon = (props: SVGProps) => ( + + + + + +); + +export default KeyIcon; diff --git a/dashboard/components/icons/RecordCircleIcon.tsx b/dashboard/components/icons/RecordCircleIcon.tsx new file mode 100644 index 000000000..a9de91820 --- /dev/null +++ b/dashboard/components/icons/RecordCircleIcon.tsx @@ -0,0 +1,30 @@ +import { SVGProps } from 'react'; + +const RecordCircleIcon = (props: SVGProps) => ( + + + + +); + +export default RecordCircleIcon; diff --git a/dashboard/components/icons/ShieldSecurityIcon.tsx b/dashboard/components/icons/ShieldSecurityIcon.tsx new file mode 100644 index 000000000..7ece47d88 --- /dev/null +++ b/dashboard/components/icons/ShieldSecurityIcon.tsx @@ -0,0 +1,38 @@ +import { SVGProps } from 'react'; + +const ShieldSecurityIcon = (props: SVGProps) => ( + + + + + +); + +export default ShieldSecurityIcon; diff --git a/dashboard/components/icons/VariableIcon.tsx b/dashboard/components/icons/VariableIcon.tsx new file mode 100644 index 000000000..327e09b93 --- /dev/null +++ b/dashboard/components/icons/VariableIcon.tsx @@ -0,0 +1,26 @@ +import { SVGProps } from 'react'; + +const VariableIcon = (props: SVGProps) => ( + + + + +); + +export default VariableIcon; diff --git a/dashboard/components/layout/Layout.tsx b/dashboard/components/layout/Layout.tsx index f85a7f67e..ce902247d 100644 --- a/dashboard/components/layout/Layout.tsx +++ b/dashboard/components/layout/Layout.tsx @@ -37,6 +37,10 @@ function Layout({ children }: LayoutProps) { } }, [telemetry]); + const betaFlagOnboardingWizard = true; // To test the onboarding wizard feature, set this beta-flag to true + const isOnboarding = + betaFlagOnboardingWizard && router.pathname.startsWith('/onboarding'); + return ( - - -
- {canRender && children} + {isOnboarding && <>{children}} + + {!isOnboarding && ( + <> + + +
+ {canRender && children} + + {hasNoAccounts && betaFlagOnboardingWizard && !isOnboarding && ( + { + router.push('/onboarding/choose-cloud'); + }} + actionLabel="Begin Onboarding" + secondaryAction={() => { + router.push( + 'https://github.com/tailwarden/komiser/issues/new/choose' + ); + }} + secondaryActionLabel="Report an issue" + mascotPose="greetings" + /> + )} - {hasNoAccounts && ( - { - router.push( - 'https://docs.komiser.io/docs/introduction/getting-started?utm_source=komiser&utm_medium=referral&utm_campaign=static' - ); - }} - actionLabel="Guide to connect account" - secondaryAction={() => { - router.push( - 'https://github.com/tailwarden/komiser/issues/new/choose' - ); - }} - secondaryActionLabel="Report an issue" - mascotPose="thinking" - /> - )} + {/* This block would be removed when onboarding Wizard is stable leaving the block above */} + {hasNoAccounts && !betaFlagOnboardingWizard && ( + { + router.push( + 'https://docs.komiser.io/docs/introduction/getting-started?utm_source=komiser&utm_medium=referral&utm_campaign=static' + ); + }} + actionLabel="Guide to connect account" + secondaryAction={() => { + router.push( + 'https://github.com/tailwarden/komiser/issues/new/choose' + ); + }} + secondaryActionLabel="Report an issue" + mascotPose="thinking" + /> + )} + {/* This block would be removed when onboarding Wizard is stable leaving the block above */} - {error && ( - router.reload()} - > - Refresh the page - - } - /> - )} -
+ {error && ( + router.reload()} + > + Refresh the page + + } + /> + )} +
+ + )}
); } diff --git a/dashboard/components/layout/context/GlobalAppContext.tsx b/dashboard/components/layout/context/GlobalAppContext.tsx index 31db2995f..c5c249519 100644 --- a/dashboard/components/layout/context/GlobalAppContext.tsx +++ b/dashboard/components/layout/context/GlobalAppContext.tsx @@ -15,6 +15,7 @@ export type GlobalAppContextProps = { error: boolean; hasNoAccounts: boolean; fetch: () => void; + betaFlagOnboardingWizard: boolean; }; export const initialContext = { @@ -24,7 +25,8 @@ export const initialContext = { data: undefined, error: false, hasNoAccounts: false, - fetch: () => {} + fetch: () => {}, + betaFlagOnboardingWizard: false }; const GlobalAppContext = createContext(initialContext); diff --git a/dashboard/components/onboarding-wizard/CredentialsButton.tsx b/dashboard/components/onboarding-wizard/CredentialsButton.tsx new file mode 100644 index 000000000..e561a66eb --- /dev/null +++ b/dashboard/components/onboarding-wizard/CredentialsButton.tsx @@ -0,0 +1,39 @@ +import { useRouter } from 'next/router'; + +import Button from '../button/Button'; + +interface CredentialsButtonProps { + nextLabel?: string; + handleNext?: (e?: any) => void; +} + +function CredentialsButton({ + handleNext, + nextLabel = 'Add a cloud account' +}: CredentialsButtonProps) { + const router = useRouter(); + + return ( +
+ + +
+ ); +} + +export default CredentialsButton; diff --git a/dashboard/components/onboarding-wizard/DatabasePurplin.tsx b/dashboard/components/onboarding-wizard/DatabasePurplin.tsx new file mode 100644 index 000000000..55f6ade5f --- /dev/null +++ b/dashboard/components/onboarding-wizard/DatabasePurplin.tsx @@ -0,0 +1,32 @@ +import Image from 'next/image'; + +interface DatabasePurplinProps { + database: string; +} + +function DatabasePurplin({ database }: DatabasePurplinProps) { + return ( +
+
+ {`${database} +
+ {`Purplin +
+ ); +} + +export default DatabasePurplin; diff --git a/dashboard/components/onboarding-wizard/InputFileSelect.tsx b/dashboard/components/onboarding-wizard/InputFileSelect.tsx new file mode 100644 index 000000000..cd3b87c19 --- /dev/null +++ b/dashboard/components/onboarding-wizard/InputFileSelect.tsx @@ -0,0 +1,72 @@ +import { MutableRefObject, ReactNode } from 'react'; + +interface InputFileSelectProps { + id: string; + value?: any; + type: string; + label: string; + icon?: ReactNode; + subLabel?: string; + disabled?: boolean; + placeholder?: string; + iconClick?: () => void; + handleFileChange: (event: any) => void; + fileInputRef: MutableRefObject; +} + +function InputFileSelect({ + id, + icon, + type, + label, + value, + subLabel, + iconClick, + placeholder, + fileInputRef, + handleFileChange, + disabled = false +}: InputFileSelectProps) { + return ( +
+ + + {subLabel && ( + + {subLabel} + + )} + +
+ + + + + {icon && ( + + )} +
+
+ ); +} + +export default InputFileSelect; diff --git a/dashboard/components/onboarding-wizard/LabelledInput.tsx b/dashboard/components/onboarding-wizard/LabelledInput.tsx new file mode 100644 index 000000000..336b25286 --- /dev/null +++ b/dashboard/components/onboarding-wizard/LabelledInput.tsx @@ -0,0 +1,58 @@ +import { ReactNode } from 'react'; + +interface LabelledInputProps { + id: string; + value?: any; + type: string; + label: string; + icon?: ReactNode; + subLabel?: string; + disabled?: boolean; + placeholder?: string; +} + +function LabelledInput({ + id, + icon, + type, + label, + value, + subLabel, + placeholder, + disabled = false +}: LabelledInputProps) { + return ( +
+ + + {subLabel && ( + + {subLabel} + + )} + +
+ {icon && ( +
+ {icon} +
+ )} + + +
+
+ ); +} + +export default LabelledInput; diff --git a/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx new file mode 100644 index 000000000..1b2d9de58 --- /dev/null +++ b/dashboard/components/onboarding-wizard/OnboardingWizardLayout.tsx @@ -0,0 +1,63 @@ +import { ReactNode } from 'react'; + +import OnboardingWizardHeader from './PageHeaders'; +import OnboardingWizardProgressBar from './ProgressBar'; + +function OnboardingWizardLayout({ children }: { children: ReactNode }) { + return ( +
+ {children} +
+ ); +} + +type LeftSideLayoutProps = { + title: string; + children: ReactNode; + progressBarWidth: string; +}; + +function LeftSideLayout({ + title, + children, + progressBarWidth +}: LeftSideLayoutProps) { + return ( +
+ +
+ + {children} +
+
+ ); +} + +interface RightSideLayoutProps { + children: ReactNode; + isCustom?: boolean; + customClasses?: string; +} + +function RightSideLayout({ + isCustom, + children, + customClasses +}: RightSideLayoutProps) { + return ( + <> + {isCustom ? ( +
+ {children} +
+ ) : ( +
+ {children} +
+ )} + + ); +} + +export default OnboardingWizardLayout; +export { LeftSideLayout, RightSideLayout }; diff --git a/dashboard/components/onboarding-wizard/PageHeaders.tsx b/dashboard/components/onboarding-wizard/PageHeaders.tsx new file mode 100644 index 000000000..4c48dee84 --- /dev/null +++ b/dashboard/components/onboarding-wizard/PageHeaders.tsx @@ -0,0 +1,18 @@ +import Image from 'next/image'; + +function OnboardingWizardHeader({ title }: { title: string }) { + return ( + <> + Komiser Logo +
{title}
+ + ); +} + +export default OnboardingWizardHeader; diff --git a/dashboard/components/onboarding-wizard/ProgressBar.tsx b/dashboard/components/onboarding-wizard/ProgressBar.tsx new file mode 100644 index 000000000..4cd49a8b0 --- /dev/null +++ b/dashboard/components/onboarding-wizard/ProgressBar.tsx @@ -0,0 +1,9 @@ +function OnboardingWizardProgressBar({ width }: { width: string }) { + return ( +
+
+
+ ); +} + +export default OnboardingWizardProgressBar; diff --git a/dashboard/components/onboarding-wizard/PurplinCloud.tsx b/dashboard/components/onboarding-wizard/PurplinCloud.tsx new file mode 100644 index 000000000..2599b6645 --- /dev/null +++ b/dashboard/components/onboarding-wizard/PurplinCloud.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import Image from 'next/image'; + +import ProviderCls, { Provider } from '../../utils/providerHelper'; + +function PurplinCloud({ provider }: { provider: Provider }) { + return ( +
+ Onboarding cloud +
+ {`${provider} +
+
+ ); +} + +export default PurplinCloud; diff --git a/dashboard/components/onboarding-wizard/SelectInput.tsx b/dashboard/components/onboarding-wizard/SelectInput.tsx new file mode 100644 index 000000000..f6c5138ca --- /dev/null +++ b/dashboard/components/onboarding-wizard/SelectInput.tsx @@ -0,0 +1,92 @@ +import { ReactNode, useState } from 'react'; +import classNames from 'classnames'; + +import ChevronDownIcon from '../icons/ChevronDownIcon'; + +export type SelectInputProps = { + label: string; + value: string; + values: string[]; + icon?: string | ReactNode; + handleChange: (value: string) => void; + displayValues: { [key: string]: any }[]; +}; + +function SelectInput({ + label, + value, + values, + handleChange, + displayValues, + icon = +}: SelectInputProps) { + const [isOpen, setIsOpen] = useState(false); + const index = values.findIndex(currentValue => currentValue === value); + + function toggle() { + setIsOpen(!isOpen); + } + + function handleClick(item: string) { + handleChange(item); + toggle(); + } + + return ( +
+
+ {icon} +
+ + + + + {isOpen && ( + <> +
+
+
+ {values.map((item, idx) => { + const isActive = value === item; + return ( + + ); + })} +
+
+ + )} +
+ ); +} + +export default SelectInput; diff --git a/dashboard/components/select/Select.tsx b/dashboard/components/select/Select.tsx index 50c5b74d3..b7484102e 100644 --- a/dashboard/components/select/Select.tsx +++ b/dashboard/components/select/Select.tsx @@ -54,7 +54,7 @@ function Select({ onClick={toggle} className="fixed inset-0 z-20 hidden animate-fade-in bg-transparent opacity-0 sm:block" >
-
+
{values.map((item, idx) => { const isActive = value === item; diff --git a/dashboard/pages/index.tsx b/dashboard/pages/index.tsx index da9981877..7bc74d11b 100644 --- a/dashboard/pages/index.tsx +++ b/dashboard/pages/index.tsx @@ -1,11 +1,19 @@ import { useRouter } from 'next/router'; -import { useEffect } from 'react'; +import { useContext, useEffect } from 'react'; + +import GlobalAppContext from '../components/layout/context/GlobalAppContext'; function Home() { + const { betaFlagOnboardingWizard } = useContext(GlobalAppContext); + const router = useRouter(); useEffect(() => { - router.push('/dashboard'); + if (betaFlagOnboardingWizard) { + router.push('/onboarding/choose-cloud'); + } else { + router.push('/dashboard'); + } }, []); } diff --git a/dashboard/pages/onboarding/choose-cloud.tsx b/dashboard/pages/onboarding/choose-cloud.tsx new file mode 100644 index 000000000..07f2992da --- /dev/null +++ b/dashboard/pages/onboarding/choose-cloud.tsx @@ -0,0 +1,121 @@ +import { useState } from 'react'; +import Head from 'next/head'; +import Image from 'next/image'; +import { useRouter } from 'next/navigation'; + +import ProviderCls, { + allProviders, + Provider +} from '../../utils/providerHelper'; + +import Button from '../../components/button/Button'; +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../components/onboarding-wizard/OnboardingWizardLayout'; +import SelectInput from '../../components/onboarding-wizard/SelectInput'; + +export default function ChooseCloud() { + const router = useRouter(); + const [provider, setProvider] = useState(allProviders.AWS); + + const handleNext = () => { + router.push(`/onboarding/provider/${provider}`); + }; + + const handleSuggest = () => + router.replace( + 'https://docs.komiser.io/docs/faqs#how-can-i-request-a-new-feature' + ); + + const handleSelectChange = (newValue: string) => + setProvider(newValue as Provider); + + return ( +
+ + Onboarding - Komiser + + + + + +
+
+ Komiser is cloud agnostic, one platform across all major public + cloud
providers. +
+
Get started now by connecting your first account.
+
+
+ ({ + label: ProviderCls.providerLabel(value) + }))} + /> +
+
+ + +
+
+ + +
+ Onboarding cloud +
+ {`${provider} +
+
+ Arrow down + {`${provider} +
+
+
+ ); +} diff --git a/dashboard/pages/onboarding/choose-database.tsx b/dashboard/pages/onboarding/choose-database.tsx new file mode 100644 index 000000000..8ce9cde46 --- /dev/null +++ b/dashboard/pages/onboarding/choose-database.tsx @@ -0,0 +1,176 @@ +import { useState } from 'react'; +import Head from 'next/head'; +import Image from 'next/image'; +import { useRouter } from 'next/navigation'; + +import { DBProvider, allDBProviders } from '../../utils/providerHelper'; + +import Button from '../../components/button/Button'; +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../components/onboarding-wizard/OnboardingWizardLayout'; + +interface DatabaseItemProps { + value: DBProvider; + selected: DBProvider; + label?: string; + imageUrl: string; + handleClick: (db: DBProvider) => void; +} + +function DatabaseLeftItem({ + imageUrl, + label, + value, + selected, + handleClick +}: DatabaseItemProps) { + const onClick = () => handleClick(value); + + return ( +
+ {`${label} +
{label}
+
+ ); +} + +function DatabaseRightItem({ + imageUrl, + value, + selected, + handleClick +}: DatabaseItemProps) { + const onClick = () => handleClick(value); + + return ( +
+ {`${value} +
+ ); +} + +export default function ChooseDatabase() { + const router = useRouter(); + const [database, setDatabase] = useState(allDBProviders.POSTGRES); + + const handleNext = () => router.push(`/onboarding/database/${database}`); + + const handleClick = (db: DBProvider) => setDatabase(db); + + return ( +
+ + Select Database - Komiser + + + + + +
+
+ Add a way to store and retain data through a database, so that it + remains accessible and preserved even after you end your session + on Komiser. +
+
+
+

Select a database type

+
+ + +
+
+
+ +
+
+ + +
+ Komiser Logo + +
+ Komiser Logo +
+ +
+ + +
+
+
+
+
+ ); +} diff --git a/dashboard/pages/onboarding/complete.tsx b/dashboard/pages/onboarding/complete.tsx new file mode 100644 index 000000000..3f7f3355c --- /dev/null +++ b/dashboard/pages/onboarding/complete.tsx @@ -0,0 +1,66 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import { useRouter } from 'next/navigation'; + +import Button from '../../components/button/Button'; +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../components/onboarding-wizard/OnboardingWizardLayout'; + +export default function OnboardingComplete() { + const router = useRouter(); + + return ( +
+ + Onboarding Complete - Komiser + + + + + +
+ Rocket +

+ Your data is being synced +

+
+ Processing time for your data varies based on its complexity. You + can start using Komiser with the available data. +
+ +
+
+ + +
+ Dashboard +
+
+
+
+ ); +} diff --git a/dashboard/pages/onboarding/database/postgres.tsx b/dashboard/pages/onboarding/database/postgres.tsx new file mode 100644 index 000000000..9eb8cbefc --- /dev/null +++ b/dashboard/pages/onboarding/database/postgres.tsx @@ -0,0 +1,83 @@ +import Head from 'next/head'; + +import { allDBProviders } from '../../../utils/providerHelper'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import DatabasePurplin from '../../../components/onboarding-wizard/DatabasePurplin'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +export default function PostgreSQLCredentials() { + const database = allDBProviders.POSTGRES; + + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; + + return ( +
+ + Configure Postgres - Komiser + + + + + +
+
+ PostgreSQL is a powerful and feature-rich open-source RDBMS known + for its extensibility and robustness. It offers advanced SQL + capabilities, support for complex queries, data integrity + constraints, transactions, and scalability. +
+
+ +
+
+ + + + +
+
+ + +
+ + + + +
+
+ ); +} diff --git a/dashboard/pages/onboarding/database/sqlite.tsx b/dashboard/pages/onboarding/database/sqlite.tsx new file mode 100644 index 000000000..8e94bee89 --- /dev/null +++ b/dashboard/pages/onboarding/database/sqlite.tsx @@ -0,0 +1,79 @@ +import Head from 'next/head'; +import { useRef } from 'react'; + +import { allDBProviders } from '../../../utils/providerHelper'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import Folder2Icon from '../../../components/icons/Folder2Icon'; +import DatabasePurplin from '../../../components/onboarding-wizard/DatabasePurplin'; +import InputFileSelect from '../../../components/onboarding-wizard/InputFileSelect'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +export default function SqliteCredentials() { + const database = allDBProviders.SQLITE; + + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; + + const fileInputRef = useRef(null); + const handleButtonClick = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); + } + }; + + const handleFileChange = (event: any) => { + const file = event.target.files[0]; + // TODO: (onboarding-wizard) handle file change and naming. Set Input field to file.name and use temporary file path for the upload value + }; + + return ( +
+ + Configure SQLite - Komiser + + + + + +
+
+ SQLite is a lightweight, serverless, self-contained RDBMS that + operates directly on files. It is known for its simplicity, ease + of use, and portability across platforms. +
+
+ +
+
+ } + fileInputRef={fileInputRef} + iconClick={handleButtonClick} + handleFileChange={handleFileChange} + /> +
+
+ + +
+ + + + +
+
+ ); +} diff --git a/dashboard/pages/onboarding/provider/aws.tsx b/dashboard/pages/onboarding/provider/aws.tsx new file mode 100644 index 000000000..8d3860bea --- /dev/null +++ b/dashboard/pages/onboarding/provider/aws.tsx @@ -0,0 +1,194 @@ +import Head from 'next/head'; +import { useRouter } from 'next/router'; +import { ReactNode, useRef, useState } from 'react'; + +import { allProviders } from '../../../utils/providerHelper'; + +import KeyIcon from '../../../components/icons/KeyIcon'; +import Folder2Icon from '../../../components/icons/Folder2Icon'; +import VariableIcon from '../../../components/icons/VariableIcon'; +import DocumentTextIcon from '../../../components/icons/DocumentTextIcon'; +import ShieldSecurityIcon from '../../../components/icons/ShieldSecurityIcon'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import SelectInput from '../../../components/onboarding-wizard/SelectInput'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import InputFileSelect from '../../../components/onboarding-wizard/InputFileSelect'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +interface SelectOptions { + icon: ReactNode; + label: string; + value: string; +} + +const options: SelectOptions[] = [ + { + icon: , + label: 'Credentials File', + value: 'credentials-file' + }, + { + icon: , + label: 'Credentials keys', + value: 'credentials-keys' + }, + { + icon: , + label: 'Environment Variables', + value: 'environment-variables' + }, + { + icon: , + label: 'IAM Instance Role', + value: 'iam-instance-role' + } +]; + +export default function AWSCredentials() { + const provider = allProviders.AWS; + + const router = useRouter(); + const [credentialType, setCredentialType] = useState( + options[0].value + ); + + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; + + const fileInputRef = useRef(null); + const handleButtonClick = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); + } + }; + + const handleFileChange = (event: any) => { + const file = event.target.files[0]; + // TODO: (onboarding-wizard) handle file change and naming. Set Input field to file.name and use temporary file path for the upload value + }; + + function handleSelectChange(newValue: string) { + setCredentialType(newValue); + } + + return ( +
+ + Setup AWS - Komiser + + + + + +
+
+ AWS is a cloud computing platform that provides infrastructure + services, application services, and developer tools provided by + Amazon. +
+
+ Read our guide on{' '} + + adding an AWS account to Komiser. + +
+
+
+ +
+
+ option.value)} + /> + {[options[2].value, options[3].value].includes( + credentialType + ) && ( +
+ {credentialType === options[3].value + ? 'Komiser will fetch the credentials from AWS' + : 'Komiser will load credentials from AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.'} +
+ )} +
+ + {credentialType === options[0].value && ( +
+ } + subLabel="Enter the path or browse the file" + placeholder="C:\Documents\Komiser\credentials" + fileInputRef={fileInputRef} + iconClick={handleButtonClick} + handleFileChange={handleFileChange} + /> + + +
+ )} + + {credentialType === options[1].value && ( +
+ + + +
+ )} +
+
+ +
+ + +
+ +
+
+
+
+ ); +} diff --git a/dashboard/pages/onboarding/provider/azure.tsx b/dashboard/pages/onboarding/provider/azure.tsx new file mode 100644 index 000000000..da10e9dc2 --- /dev/null +++ b/dashboard/pages/onboarding/provider/azure.tsx @@ -0,0 +1,144 @@ +import Head from 'next/head'; + +import { allProviders } from '../../../utils/providerHelper'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +export default function AzureCredentials() { + const provider = allProviders.AZURE; + + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; + + return ( +
+ ); +} diff --git a/dashboard/pages/onboarding/provider/civo.tsx b/dashboard/pages/onboarding/provider/civo.tsx new file mode 100644 index 000000000..edd41e2e4 --- /dev/null +++ b/dashboard/pages/onboarding/provider/civo.tsx @@ -0,0 +1,90 @@ +import Head from 'next/head'; + +import { allProviders } from '../../../utils/providerHelper'; + +import RecordCircleIcon from '../../../components/icons/RecordCircleIcon'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +export default function CivoCredentials() { + const provider = allProviders.CIVO; + + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; + + return ( +
+ + Setup Civo - Komiser + + + + + +
+
+ Civo is the first cloud native service provider powered only by + Kubernetes. +
+
+ Read our guide on{' '} + + adding a CIVO account to Komiser. + +
+
+ +
+ + +
+ } + /> + +
+
+ + +
+ + +
+ +
+
+
+
+ ); +} diff --git a/dashboard/pages/onboarding/provider/digitalocean.tsx b/dashboard/pages/onboarding/provider/digitalocean.tsx new file mode 100644 index 000000000..d23e967d2 --- /dev/null +++ b/dashboard/pages/onboarding/provider/digitalocean.tsx @@ -0,0 +1,90 @@ +import Head from 'next/head'; + +import { allProviders } from '../../../utils/providerHelper'; + +import RecordCircleIcon from '../../../components/icons/RecordCircleIcon'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +export default function DigitalOceanCredentials() { + const provider = allProviders.DIGITAL_OCEAN; + + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + }; + + return ( +
+ + Setup DigitalOcean - Komiser + + + + + +
+
+ DigitalOcean is a cloud hosting provider that offers cloud + computing services and Infrastructure as a Service (IaaS). +
+ +
+ +
+ + +
+ } + /> + +
+
+ + +
+ + +
+ +
+
+
+
+ ); +} diff --git a/dashboard/pages/onboarding/provider/kubernetes.tsx b/dashboard/pages/onboarding/provider/kubernetes.tsx new file mode 100644 index 000000000..96298397e --- /dev/null +++ b/dashboard/pages/onboarding/provider/kubernetes.tsx @@ -0,0 +1,134 @@ +import Head from 'next/head'; +import { useRouter } from 'next/router'; +import { ReactNode, useRef, useState } from 'react'; + +import { allProviders } from '../../../utils/providerHelper'; + +import Folder2Icon from '../../../components/icons/Folder2Icon'; +import DocumentTextIcon from '../../../components/icons/DocumentTextIcon'; + +import OnboardingWizardLayout, { + LeftSideLayout, + RightSideLayout +} from '../../../components/onboarding-wizard/OnboardingWizardLayout'; +import SelectInput from '../../../components/onboarding-wizard/SelectInput'; +import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; +import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; +import InputFileSelect from '../../../components/onboarding-wizard/InputFileSelect'; +import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; + +interface SelectOptions { + icon: ReactNode; + label: string; + value: string; +} + +const options: SelectOptions[] = [ + { + icon: , + label: 'Credentials File', + value: 'credentials-file' + }, +]; + +export default function KubernetesCredentials() { + const provider = allProviders.KUBERNETES; + + const router = useRouter(); + const [credentialType, setCredentialType] = useState( + options[0].value + ); + + const handleNext = () => { + // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + router.push(`/onboarding/${provider}`); + }; + + const fileInputRef = useRef(null); + const handleButtonClick = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); + } + }; + + const handleFileChange = (event: any) => { + const file = event.target.files[0]; + // TODO: (onboarding-wizard) handle file change and naming. Set Input field to file.name and use temporary file path for the upload value + console.log(file); + }; + + function handleSelectChange(newValue: string) { + setCredentialType(newValue); + } + + return ( +
+ + Setup Kubernetes - Komiser + + + + + +
+
+ Kubernetes, also known as K8s, is an open-source system for + automating deployment, scaling, and management of containerized + applications. +
+ +
+
+ +
+ option.value)} + /> + } + fileInputRef={fileInputRef} + iconClick={handleButtonClick} + handleFileChange={handleFileChange} + /> +
+
+ +
+ + +
+ +
+
+
+
+ ); +} diff --git a/dashboard/public/assets/img/database/db-arrow-vector.svg b/dashboard/public/assets/img/database/db-arrow-vector.svg new file mode 100644 index 000000000..3e1ec6696 --- /dev/null +++ b/dashboard/public/assets/img/database/db-arrow-vector.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dashboard/public/assets/img/database/postgresql.svg b/dashboard/public/assets/img/database/postgresql.svg new file mode 100644 index 000000000..48630cfd6 --- /dev/null +++ b/dashboard/public/assets/img/database/postgresql.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dashboard/public/assets/img/database/selectdb-komiser.svg b/dashboard/public/assets/img/database/selectdb-komiser.svg new file mode 100644 index 000000000..474bae6ae --- /dev/null +++ b/dashboard/public/assets/img/database/selectdb-komiser.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dashboard/public/assets/img/database/sqlite.svg b/dashboard/public/assets/img/database/sqlite.svg new file mode 100644 index 000000000..3c074907d --- /dev/null +++ b/dashboard/public/assets/img/database/sqlite.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dashboard/public/assets/img/others/arrow-down.svg b/dashboard/public/assets/img/others/arrow-down.svg new file mode 100644 index 000000000..dec32b0ea --- /dev/null +++ b/dashboard/public/assets/img/others/arrow-down.svg @@ -0,0 +1,26 @@ + + + + + + + + + + \ No newline at end of file diff --git a/dashboard/public/assets/img/others/empty-dashboard.png b/dashboard/public/assets/img/others/empty-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..ad468bf6fde5461935447a31fe2a37566389b0ed GIT binary patch literal 38855 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

2$-k>c$9ILpwXoV~;Ag>m8Qx- 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 G+ + + + + + + + + + + + + + + + + diff --git a/dashboard/styles/globals.css b/dashboard/styles/globals.css index c5eaec72d..59fb937e3 100644 --- a/dashboard/styles/globals.css +++ b/dashboard/styles/globals.css @@ -24,3 +24,20 @@ background: #95a3a3; } } + +@variants responsive { + /* Chrome, Safari and Opera */ + .no-scrollbar::-webkit-scrollbar { + display: none; + } + + .no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + } +} + +.rotate-onboarding-arrow { + /* flip horizontally */ + transform: rotateY(180deg); +} diff --git a/dashboard/utils/providerHelper.ts b/dashboard/utils/providerHelper.ts index 360b52db7..ccb051c23 100644 --- a/dashboard/utils/providerHelper.ts +++ b/dashboard/utils/providerHelper.ts @@ -12,6 +12,44 @@ export type Provider = | 'scaleway' | 'mongodbatlas'; +type ProviderKey = + | 'AWS' + | 'GCP' + | 'OVH' + | 'DIGITAL_OCEAN' + | 'AZURE' + | 'CIVO' + | 'KUBERNETES' + | 'LINODE' + | 'TENCENT' + | 'OCI' + | 'SCALE_WAY' + | 'MONGODB_ATLAS'; + +export const allProviders: { [key in ProviderKey]: Provider } = { + AWS: 'aws', + GCP: 'gcp', + OVH: 'ovh', + DIGITAL_OCEAN: 'digitalocean', + AZURE: 'azure', + CIVO: 'civo', + KUBERNETES: 'kubernetes', + LINODE: 'linode', + TENCENT: 'tencent', + OCI: 'oci', + SCALE_WAY: 'scaleway', + MONGODB_ATLAS: 'mongodbatlas' +}; + +export type DBProvider = 'postgres' | 'sqlite'; + +type DBProviderKey = 'POSTGRES' | 'SQLITE'; + +export const allDBProviders: { [key in DBProviderKey]: DBProvider } = { + POSTGRES: 'postgres', + SQLITE: 'sqlite' +}; + const providers = { providerLabel(arg: Provider) { let label; From dd75aca6c3650b20130daad28b833f56f885c69e Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Thu, 27 Jul 2023 13:43:31 +0530 Subject: [PATCH 043/191] Update lke_pool.go --- providers/linode/lkepool/lke_pool.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index 50196d753..3e2923fe7 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -52,15 +52,12 @@ lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptio Provider: "Linode", Account: client.Name, Service: "Linode Kubernetes Engine", - // Region: nodePool.Region, ResourceId: fmt.Sprintf("%d", nodePool.ID), Cost: 0, - // Name: nodePool.Label, FetchedAt: time.Now(), - CreatedAt: time.Time{}, // Update this with the actual created time. + CreatedAt: time.Time{}, Tags: tags, Link: fmt.Sprintf("https://cloud.linode.com/kubernetes/clusters/%d", nodePool.ID), - // Add any additional fields or data you want to collect here. }) } } From 24948b1eb06bfd687505aaa1d15f7d2cf925f9a0 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Thu, 27 Jul 2023 13:47:11 +0530 Subject: [PATCH 044/191] Update lke_pool.go --- providers/linode/lkepool/lke_pool.go | 1 + 1 file changed, 1 insertion(+) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index 3e2923fe7..3e7d99d0c 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -54,6 +54,7 @@ lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptio Service: "Linode Kubernetes Engine", ResourceId: fmt.Sprintf("%d", nodePool.ID), Cost: 0, + Name: lkeNodePool.Label, FetchedAt: time.Now(), CreatedAt: time.Time{}, Tags: tags, From 5944939c7dfa95f979f216160f2d1f1e44264607 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Thu, 27 Jul 2023 13:48:51 +0530 Subject: [PATCH 045/191] Update lke_pool.go --- providers/linode/lkepool/lke_pool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index 3e7d99d0c..a849570d2 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -54,7 +54,7 @@ lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptio Service: "Linode Kubernetes Engine", ResourceId: fmt.Sprintf("%d", nodePool.ID), Cost: 0, - Name: lkeNodePool.Label, + Name: lkeNodePools.Label, FetchedAt: time.Now(), CreatedAt: time.Time{}, Tags: tags, From 4bb79faf12a59adbf1b4bfb8225ea2ba06dc2d34 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Thu, 27 Jul 2023 13:53:18 +0530 Subject: [PATCH 046/191] Update lke_pool.go --- providers/linode/lkepool/lke_pool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index a849570d2..b93689d81 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -54,7 +54,7 @@ lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptio Service: "Linode Kubernetes Engine", ResourceId: fmt.Sprintf("%d", nodePool.ID), Cost: 0, - Name: lkeNodePools.Label, + Name: nodePool.Label, FetchedAt: time.Now(), CreatedAt: time.Time{}, Tags: tags, From 77f0669fd7e377376829c128de8de58c629cd822 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Thu, 27 Jul 2023 13:55:13 +0530 Subject: [PATCH 047/191] Update lke_pool.go --- providers/linode/lkepool/lke_pool.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index b93689d81..471f1a5f6 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -53,8 +53,7 @@ lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptio Account: client.Name, Service: "Linode Kubernetes Engine", ResourceId: fmt.Sprintf("%d", nodePool.ID), - Cost: 0, - Name: nodePool.Label, + Cost: 0, FetchedAt: time.Now(), CreatedAt: time.Time{}, Tags: tags, From 73adc54c247605c7fd66a9603ec487fb44857572 Mon Sep 17 00:00:00 2001 From: Sh0bhit Date: Sat, 29 Jul 2023 14:39:14 +0530 Subject: [PATCH 048/191] fix(filter-tags): fix tags and button design --- .../components/InventoryActiveFilters.tsx | 17 +++++++++-------- .../filter/InventoryFilterSummary.tsx | 10 ++++------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/dashboard/components/inventory/components/InventoryActiveFilters.tsx b/dashboard/components/inventory/components/InventoryActiveFilters.tsx index cc6653b7f..a96918d3c 100644 --- a/dashboard/components/inventory/components/InventoryActiveFilters.tsx +++ b/dashboard/components/inventory/components/InventoryActiveFilters.tsx @@ -7,7 +7,7 @@ import PlusIcon from '../../icons/PlusIcon'; import useFilterWizard from './filter/hooks/useFilterWizard'; import useInventory from '../hooks/useInventory/useInventory'; import InventoryFilterDropdown from './InventoryFilterDropdown'; -import ClearFilterIcon from '../../icons/ClearFilterIcon'; +import CloseIcon from '../../icons/CloseIcon'; type InventoryActiveFiltersProps = { hasFilters: boolean | undefined; @@ -65,7 +65,7 @@ function InventoryActiveFilters({

)}
diff --git a/dashboard/components/inventory/components/filter/InventoryFilterSummary.tsx b/dashboard/components/inventory/components/filter/InventoryFilterSummary.tsx index 9fb4a2ebe..b5566743e 100644 --- a/dashboard/components/inventory/components/filter/InventoryFilterSummary.tsx +++ b/dashboard/components/inventory/components/filter/InventoryFilterSummary.tsx @@ -52,7 +52,7 @@ function InventoryFilterSummary({
{getField('icon')}
@@ -61,9 +61,7 @@ function InventoryFilterSummary({ {data.operator && ( <> : - - {getOperator(data.operator)} - + {getOperator(data.operator)} )} {data.values && @@ -76,7 +74,7 @@ function InventoryFilterSummary({ {value} {data.values.length > 1 && idx < data.values.length - 1 && ( - + {data.field === 'cost' && data.operator === 'BETWEEN' ? 'and' : 'or'} @@ -98,7 +96,7 @@ function InventoryFilterSummary({ } }} > - +
)} From cdae824af7f20bbce8b7adc261de63fafa536d4c Mon Sep 17 00:00:00 2001 From: Swamy M S <57250315+swamy-m-s@users.noreply.github.com> Date: Wed, 2 Aug 2023 10:14:08 +0530 Subject: [PATCH 049/191] Update policy.json --- policy.json | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/policy.json b/policy.json index b41a15df0..fe10d4daf 100644 --- a/policy.json +++ b/policy.json @@ -1,25 +1,23 @@ { - "Version": "2012-10-17", "Statement": [ { - "Sid": "1", - "Effect": "Allow", "Action": [ "ec2:Describe*", "elasticloadbalancing:Describe*", "autoscaling:Describe*", "s3:Describe*", + "s3:List*", "ecs:List*", "ce:GetCostAndUsage", "ce:GetCostForecast", "apigateway:GET", "dynamodb:Describe*" ], - "Resource": "*" + "Effect": "Allow", + "Resource": "*", + "Sid": "1" }, { - "Sid": "2", - "Effect": "Allow", "Action": [ "lambda:List*", "dynamodb:List*", @@ -32,29 +30,32 @@ "sns:List*", "s3:Get*" ], - "Resource": "*" + "Effect": "Allow", + "Resource": "*", + "Sid": "2" }, { - "Sid": "3", - "Effect": "Allow", "Action": [ "acm:List*", "mq:List*", "cloudwatch:Get*", + "cloudwatch:List*", "cloudtrail:LookupEvents", "datapipeline:List*", "eks:List*", "elasticache:Describe*", + "servicecatalog:SearchProductsAsAdmin", + "ssm:DescribeMaintenanceWindows", "es:List*", "logs:Describe*", "rds:Describe*", "cloudwatch:Describe*" ], - "Resource": "*" + "Effect": "Allow", + "Resource": "*", + "Sid": "3" }, { - "Sid": "4", - "Effect": "Allow", "Action": [ "glue:Get*", "organizations:Describe*", @@ -69,11 +70,11 @@ "swf:List*", "config:BatchGetResourceConfig" ], - "Resource": "*" + "Effect": "Allow", + "Resource": "*", + "Sid": "4" }, { - "Sid": "5", - "Effect": "Allow", "Action": [ "sns:List*", "lambda:List*", @@ -86,7 +87,10 @@ "eks:Describe*", "elasticloadbalancing:DescribeTags" ], - "Resource": "*" + "Effect": "Allow", + "Resource": "*", + "Sid": "5" } - ] + ], + "Version": "2012-10-17" } From 415877253b7f7c84f4f90dbf1c47d26d201fe1d6 Mon Sep 17 00:00:00 2001 From: Manish <9532643074b@gmail.com> Date: Wed, 9 Aug 2023 14:38:54 +0530 Subject: [PATCH 050/191] fix(842): correcting input stroke width in InputComponent --- dashboard/components/input/Input.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/components/input/Input.tsx b/dashboard/components/input/Input.tsx index b23692999..de6ab5534 100644 --- a/dashboard/components/input/Input.tsx +++ b/dashboard/components/input/Input.tsx @@ -68,7 +68,7 @@ function Input({ Date: Mon, 14 Aug 2023 20:03:14 +0530 Subject: [PATCH 051/191] fix(814) Add instance disks resource to linode --- providers/linode/compute/instances.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/providers/linode/compute/instances.go b/providers/linode/compute/instances.go index fe8798bf4..ff65c7582 100644 --- a/providers/linode/compute/instances.go +++ b/providers/linode/compute/instances.go @@ -18,7 +18,7 @@ type LinodeInstance struct { Instance *linodego.Instance } -func Linodes(ctx context.Context, client providers.ProviderClient, linodeInstances []LinodeInstance) ([]Resource, error) { +func LinodesAndDisks(ctx context.Context, client providers.ProviderClient, linodeInstances []LinodeInstance) ([]Resource, error) { resources := make([]Resource, 0) for _, linodeInstance := range linodeInstances { @@ -53,12 +53,32 @@ func Linodes(ctx context.Context, client providers.ProviderClient, linodeInstanc Tags: tags, Link: fmt.Sprintf("https://cloud.linode.com/linodes/%d", instance.ID), }) + + instanceDisks, err := client.LinodeClient.ListInstanceDisks(ctx, instance.ID, &linodego.ListOptions{}) + if err != nil { + return resources, err + } + + for _, disk := range instanceDisks { + resources = append(resources, models.Resource{ + Provider: "Linode", + Account: client.Name, + Service: "Instance Disk", + Region: instance.Region, + ResourceId: fmt.Sprintf("%d", disk.ID), + Cost: 0, + Name: disk.Label, + FetchedAt: time.Now(), + CreatedAt: *disk.Created, + Link: fmt.Sprintf("https://cloud.linode.com/linodes/%d/storage", instance.ID), + }) + } } log.WithFields(log.Fields{ "provider": "Linode", "account": client.Name, - "service": "Linode", + "service": "Linode and Instance Disk", "resources": len(resources), }).Info("Fetched resources") return resources, nil From de26f7f5fa87158294fdb7b9586b31a3f9b6cb97 Mon Sep 17 00:00:00 2001 From: Pavan Gudiwada <25551553+pavangudiwada@users.noreply.github.com> Date: Sat, 19 Aug 2023 14:33:40 +0530 Subject: [PATCH 052/191] Added support for AWS Load balancer Target Groups --- providers/aws/aws.go | 1 + providers/aws/elb/targetgroups.go | 68 +++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 providers/aws/elb/targetgroups.go diff --git a/providers/aws/aws.go b/providers/aws/aws.go index bab2af836..72fad43d2 100644 --- a/providers/aws/aws.go +++ b/providers/aws/aws.go @@ -69,6 +69,7 @@ func listOfSupportedServices() []providers.FetchDataFunction { rds.ProxyEndpoints, rds.AutoBackups, elb.LoadBalancers, + elb.TargetGroups, efs.ElasticFileStorage, apigateway.Apis, elasticache.Clusters, diff --git a/providers/aws/elb/targetgroups.go b/providers/aws/elb/targetgroups.go new file mode 100644 index 000000000..422814639 --- /dev/null +++ b/providers/aws/elb/targetgroups.go @@ -0,0 +1,68 @@ +package elb + +import ( + "context" + "fmt" + "time" + + log "github.com/sirupsen/logrus" + + "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2" + . "github.com/tailwarden/komiser/models" + . "github.com/tailwarden/komiser/providers" +) + +func TargetGroups(ctx context.Context, client ProviderClient) ([]Resource, error) { + resources := make([]Resource, 0) + + var config elasticloadbalancingv2.DescribeTargetGroupsInput + elbtgClient := elasticloadbalancingv2.NewFromConfig(*client.AWSClient) + + output, err := elbtgClient.DescribeTargetGroups(ctx, &config) + + if err != nil { + return resources, err + } + + for _, targetgroup := range output.TargetGroups { + resourceArn := *targetgroup.TargetGroupArn + outputTags, err := elbtgClient.DescribeTags(ctx, &elasticloadbalancingv2.DescribeTagsInput{ + ResourceArns: []string{resourceArn}, + }) + if err != nil { + return resources, err + } + + tags := make([]Tag, 0) + for _, tagDescription := range outputTags.TagDescriptions { + for _, tag := range tagDescription.Tags { + tags = append(tags, Tag{ + Key: *tag.Key, + Value: *tag.Value, + }) + } + } + + resources = append(resources, Resource{ + Provider: "AWS", + Account: client.Name, + Service: "Target Group", + ResourceId: resourceArn, + Region: client.AWSClient.Region, + Name: *targetgroup.TargetGroupName, + Tags: tags, + FetchedAt: time.Now(), + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#/LoadBalancer:loadBalancerArn=%s", client.AWSClient.Region, client.AWSClient.Region, resourceArn), + }) + } + + log.WithFields(log.Fields{ + "provider": "AWS", + "account": client.Name, + "region": client.AWSClient.Region, + "service": "Target Group", + "resources": len(resources), + }).Info("Fetched resources") + + return resources, nil +} From 7c442d4a8b9d61317a2d24125e7795c3f1dccf4c Mon Sep 17 00:00:00 2001 From: Pavan Gudiwada <25551553+pavangudiwada@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:01:53 +0530 Subject: [PATCH 053/191] Fixing target group resource link --- providers/aws/elb/targetgroups.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/aws/elb/targetgroups.go b/providers/aws/elb/targetgroups.go index 422814639..b34fafd84 100644 --- a/providers/aws/elb/targetgroups.go +++ b/providers/aws/elb/targetgroups.go @@ -52,7 +52,7 @@ func TargetGroups(ctx context.Context, client ProviderClient) ([]Resource, error Name: *targetgroup.TargetGroupName, Tags: tags, FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#/LoadBalancer:loadBalancerArn=%s", client.AWSClient.Region, client.AWSClient.Region, resourceArn), + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#TargetGroup:targetGroupArn=%s", client.AWSClient.Region, client.AWSClient.Region, resourceArn), }) } From 210ffd55d202a955e50f841764c5bcf592acff4e Mon Sep 17 00:00:00 2001 From: Pavan Gudiwada <25551553+pavangudiwada@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:29:28 +0530 Subject: [PATCH 054/191] Removing a / thats breaking the console URL --- providers/aws/elb/loadbalancers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/aws/elb/loadbalancers.go b/providers/aws/elb/loadbalancers.go index c83e054c9..fd6d61a19 100644 --- a/providers/aws/elb/loadbalancers.go +++ b/providers/aws/elb/loadbalancers.go @@ -62,7 +62,7 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro Tags: tags, CreatedAt: *loadbalancer.CreatedTime, FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#/LoadBalancer:loadBalancerArn=%s", client.AWSClient.Region, client.AWSClient.Region, resourceArn), + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#LoadBalancer:loadBalancerArn=%s", client.AWSClient.Region, client.AWSClient.Region, resourceArn), }) } From f3a7b81ad824d003386afc31ee9e202373434044 Mon Sep 17 00:00:00 2001 From: LABOUARDY Mohamed Date: Mon, 21 Aug 2023 16:07:35 +0200 Subject: [PATCH 055/191] chore: added Avinesh as a code owner --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 242a3ee9a..f0288d55d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,3 @@ -* @mlabouardy @ShubhamPalriwala +* @mlabouardy @ShubhamPalriwala @AvineshTripathi README.md @jakepage91 CONTRIBUTING.md @jakepage91 From 56feef48bcf827ad72999fa06b42822d11b11263 Mon Sep 17 00:00:00 2001 From: LABOUARDY Mohamed Date: Tue, 22 Aug 2023 10:06:51 +0200 Subject: [PATCH 056/191] chore: fix typo on README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e4895ab66..62c793b7e 100644 --- a/README.md +++ b/README.md @@ -162,16 +162,16 @@ We are very excited about what is in store in the coming weeks and months, take Komiser is written in `Golang` and is `Elv2 licensed` - contributions are always welcome whether that means providing feedback, be it through GitHub, through the `#feedback` channel on our [Discord server](https://discord.tailwarden.com) or testing existing and new features. Feel free to check out our [contributor guidelines](./CONTRIBUTING.md) and consider becoming a **contributor** today. -Learn how to contribute with this walkthrough videos: +Learn how to contribute with these walkthrough videos: -- [How to contributor to Komiser engine](https://www.youtube.com/watch?v=Vn5uc2elcVg) -- [How to contributor to Komiser dashboard](https://www.youtube.com/watch?v=uwxj11-eRt8) +- [How to contribute to Komiser engine](https://www.youtube.com/watch?v=Vn5uc2elcVg) +- [How to contribute to Komiser dashboard](https://www.youtube.com/watch?v=uwxj11-eRt8) # Users 🧑‍🤝‍🧑 If you'd like to have your company represented and are using `Komiser` please give formal written permission below via email to contact@tailwarden.com. -We will need a URL to a svg or png logo, a text title and a company URL. +We will need a URL to an SVG or png logo, a text title, and a company URL. # Versioning 🧮 From c1e6440b45ccf67bac130b7124f52ca07d4aff0d Mon Sep 17 00:00:00 2001 From: Pavan Gudiwada <25551553+pavangudiwada@users.noreply.github.com> Date: Tue, 22 Aug 2023 20:56:39 +0530 Subject: [PATCH 057/191] Added support for AWS ELB Listeners --- providers/aws/elb/loadbalancers.go | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/providers/aws/elb/loadbalancers.go b/providers/aws/elb/loadbalancers.go index fd6d61a19..e885294d7 100644 --- a/providers/aws/elb/loadbalancers.go +++ b/providers/aws/elb/loadbalancers.go @@ -23,6 +23,8 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro return resources, err } + var configListeners elasticloadbalancingv2.DescribeListenersInput + for _, loadbalancer := range output.LoadBalancers { resourceArn := *loadbalancer.LoadBalancerArn outputTags, err := elbClient.DescribeTags(ctx, &elasticloadbalancingv2.DescribeTagsInput{ @@ -64,6 +66,48 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro FetchedAt: time.Now(), Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#LoadBalancer:loadBalancerArn=%s", client.AWSClient.Region, client.AWSClient.Region, resourceArn), }) + + configListeners.LoadBalancerArn = &resourceArn + elblisClient := elasticloadbalancingv2.NewFromConfig(*client.AWSClient) + + output, err := elblisClient.DescribeListeners(ctx, &configListeners) + if err != nil { + return resources, err + } + + for _, listener := range output.Listeners { + listenerArn := *listener.ListenerArn + + outputTags, err := elblisClient.DescribeTags(ctx, &elasticloadbalancingv2.DescribeTagsInput{ + ResourceArns: []string{listenerArn}, + }) + if err != nil { + return resources, err + } + + tags := make([]Tag, 0) + for _, tagDescription := range outputTags.TagDescriptions { + for _, tag := range tagDescription.Tags { + tags = append(tags, Tag{ + Key: *tag.Key, + Value: *tag.Value, + }) + } + } + + resources = append(resources, Resource{ + Provider: "AWS", + Account: client.Name, + Service: "ELB Listener", + ResourceId: listenerArn, + Region: client.AWSClient.Region, + Name: listenerArn, + Tags: tags, + FetchedAt: time.Now(), + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#ELBListenerV2:listenerArn=%s", client.AWSClient.Region, client.AWSClient.Region, listenerArn), + }) + } + } log.WithFields(log.Fields{ From 3403e642d4aa0a9472dda91dbdb3906078d99ed4 Mon Sep 17 00:00:00 2001 From: Pavan Gudiwada <25551553+pavangudiwada@users.noreply.github.com> Date: Tue, 22 Aug 2023 21:13:29 +0530 Subject: [PATCH 058/191] Removed redundant client --- providers/aws/elb/loadbalancers.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/providers/aws/elb/loadbalancers.go b/providers/aws/elb/loadbalancers.go index e885294d7..4243f7b98 100644 --- a/providers/aws/elb/loadbalancers.go +++ b/providers/aws/elb/loadbalancers.go @@ -68,17 +68,14 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro }) configListeners.LoadBalancerArn = &resourceArn - elblisClient := elasticloadbalancingv2.NewFromConfig(*client.AWSClient) - - output, err := elblisClient.DescribeListeners(ctx, &configListeners) + output, err := elbClient.DescribeListeners(ctx, &configListeners) if err != nil { return resources, err } for _, listener := range output.Listeners { listenerArn := *listener.ListenerArn - - outputTags, err := elblisClient.DescribeTags(ctx, &elasticloadbalancingv2.DescribeTagsInput{ + outputTags, err := elbClient.DescribeTags(ctx, &elasticloadbalancingv2.DescribeTagsInput{ ResourceArns: []string{listenerArn}, }) if err != nil { From 75fb46d358cc5d86ec1da5eea008df21756931c8 Mon Sep 17 00:00:00 2001 From: Pavan Gudiwada <25551553+pavangudiwada@users.noreply.github.com> Date: Tue, 22 Aug 2023 22:11:04 +0530 Subject: [PATCH 059/191] Updated IAM Identity Provider console URL --- providers/aws/iam/oidcproviders.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/aws/iam/oidcproviders.go b/providers/aws/iam/oidcproviders.go index b5153b383..f2cc2489a 100644 --- a/providers/aws/iam/oidcproviders.go +++ b/providers/aws/iam/oidcproviders.go @@ -3,6 +3,7 @@ package iam import ( "context" "fmt" + "net/url" "time" log "github.com/sirupsen/logrus" @@ -49,7 +50,7 @@ func OIDCProviders(ctx context.Context, client ProviderClient) ([]Resource, erro Tags: tags, CreatedAt: *outputProvider.CreateDate, FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/iamv2/home?region=%s#/identity_providers/details/%s", client.AWSClient.Region, client.AWSClient.Region, *oidcprovider.Arn), + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/iamv2/home?region=%s#/identity_providers/details/OPENID/%s", client.AWSClient.Region, client.AWSClient.Region, url.QueryEscape(*oidcprovider.Arn)), }) } From 57bbd94ae975fcb18daf822e8f1687eaace3eac8 Mon Sep 17 00:00:00 2001 From: titanventura Date: Thu, 24 Aug 2023 20:56:04 +0530 Subject: [PATCH 060/191] Refactored Linodes and Instance disks Signed-off-by: titanventura --- providers/linode/compute/instances.go | 8 ++++---- providers/linode/linode.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/providers/linode/compute/instances.go b/providers/linode/compute/instances.go index ff65c7582..a04102cd9 100644 --- a/providers/linode/compute/instances.go +++ b/providers/linode/compute/instances.go @@ -18,7 +18,7 @@ type LinodeInstance struct { Instance *linodego.Instance } -func LinodesAndDisks(ctx context.Context, client providers.ProviderClient, linodeInstances []LinodeInstance) ([]Resource, error) { +func LinodeInstancesAndInstanceDisks(ctx context.Context, client providers.ProviderClient, linodeInstances []LinodeInstance) ([]Resource, error) { resources := make([]Resource, 0) for _, linodeInstance := range linodeInstances { @@ -43,7 +43,7 @@ func LinodesAndDisks(ctx context.Context, client providers.ProviderClient, linod resources = append(resources, models.Resource{ Provider: "Linode", Account: client.Name, - Service: "Linode", + Service: "Linode Instance", Region: instance.Region, ResourceId: fmt.Sprintf("%d", instance.ID), Cost: 0, @@ -63,7 +63,7 @@ func LinodesAndDisks(ctx context.Context, client providers.ProviderClient, linod resources = append(resources, models.Resource{ Provider: "Linode", Account: client.Name, - Service: "Instance Disk", + Service: "Linode Instance Disk", Region: instance.Region, ResourceId: fmt.Sprintf("%d", disk.ID), Cost: 0, @@ -78,7 +78,7 @@ func LinodesAndDisks(ctx context.Context, client providers.ProviderClient, linod log.WithFields(log.Fields{ "provider": "Linode", "account": client.Name, - "service": "Linode and Instance Disk", + "service": "Linode Instance and Instance Disk", "resources": len(resources), }).Info("Fetched resources") return resources, nil diff --git a/providers/linode/linode.go b/providers/linode/linode.go index 2677d88c7..f921a889e 100644 --- a/providers/linode/linode.go +++ b/providers/linode/linode.go @@ -10,15 +10,15 @@ import ( "github.com/tailwarden/komiser/providers" "github.com/tailwarden/komiser/providers/linode/compute" - "github.com/tailwarden/komiser/providers/linode/sql" "github.com/tailwarden/komiser/providers/linode/postgres" + "github.com/tailwarden/komiser/providers/linode/sql" "github.com/tailwarden/komiser/providers/linode/storage" "github.com/uptrace/bun" ) func listOfSupportedServices() []providers.FetchDataFunction { return []providers.FetchDataFunction{ - // compute.Linodes, + // compute.LinodeInstancesAndInstanceDisks, compute.LKEClusters, storage.Volumes, storage.Databases, From f495bcbf59a2399076514990cf09d0daf8098dac Mon Sep 17 00:00:00 2001 From: Pavan Gudiwada <25551553+pavangudiwada@users.noreply.github.com> Date: Fri, 25 Aug 2023 07:52:48 +0530 Subject: [PATCH 061/191] Added support for ELB and Listener types --- providers/aws/elb/loadbalancers.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/providers/aws/elb/loadbalancers.go b/providers/aws/elb/loadbalancers.go index 4243f7b98..bfa3f575d 100644 --- a/providers/aws/elb/loadbalancers.go +++ b/providers/aws/elb/loadbalancers.go @@ -13,8 +13,20 @@ import ( "github.com/tailwarden/komiser/utils" ) +type ELBOptions struct { + elbType string + elbPrice float64 +} + func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, error) { resources := make([]Resource, 0) + + elbValues := map[string]ELBOptions{ + "application": {"Application", 0.0225}, + "network": {"Network", 0.0225}, + "gateway": {"Gateway", 0.0125}, + } + var config elasticloadbalancingv2.DescribeLoadBalancersInput elbClient := elasticloadbalancingv2.NewFromConfig(*client.AWSClient) @@ -27,6 +39,8 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro for _, loadbalancer := range output.LoadBalancers { resourceArn := *loadbalancer.LoadBalancerArn + resourceType := string(loadbalancer.Type) + outputTags, err := elbClient.DescribeTags(ctx, &elasticloadbalancingv2.DescribeTagsInput{ ResourceArns: []string{resourceArn}, }) @@ -51,12 +65,12 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro } else { hourlyUsage = int(time.Since(*loadbalancer.CreatedTime).Hours()) } - monthlyCost := float64(hourlyUsage) * 0.0225 + monthlyCost := float64(hourlyUsage) * elbValues[resourceType].elbPrice resources = append(resources, Resource{ Provider: "AWS", Account: client.Name, - Service: "ELB", + Service: "ELB" + " " + elbValues[resourceType].elbType, ResourceId: resourceArn, Region: client.AWSClient.Region, Name: *loadbalancer.LoadBalancerName, @@ -95,7 +109,7 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro resources = append(resources, Resource{ Provider: "AWS", Account: client.Name, - Service: "ELB Listener", + Service: "ELB Listener" + " " + elbValues[resourceType].elbType, ResourceId: listenerArn, Region: client.AWSClient.Region, Name: listenerArn, From f64a42b27177ff578504127bbcf72ac9340342cf Mon Sep 17 00:00:00 2001 From: Erik K Anderson Date: Fri, 25 Aug 2023 07:29:46 -0500 Subject: [PATCH 062/191] add redshift event subscription (wip) This is a wip commit with some todo question items. I would like to do a rebase before opening the PR, so that I send in one clean commit to the pull request. Also, there is another todo item: I should make the needed changes to go.mod, but no other changes. --- providers/aws/aws.go | 2 + providers/aws/redshift/eventsubscription.go | 87 +++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 providers/aws/redshift/eventsubscription.go diff --git a/providers/aws/aws.go b/providers/aws/aws.go index bab2af836..f7e77dd27 100644 --- a/providers/aws/aws.go +++ b/providers/aws/aws.go @@ -24,6 +24,7 @@ import ( "github.com/tailwarden/komiser/providers/aws/lambda" "github.com/tailwarden/komiser/providers/aws/opensearch" "github.com/tailwarden/komiser/providers/aws/rds" + "github.com/tailwarden/komiser/providers/aws/redshift" "github.com/tailwarden/komiser/providers/aws/s3" "github.com/tailwarden/komiser/providers/aws/servicecatalog" "github.com/tailwarden/komiser/providers/aws/sns" @@ -88,6 +89,7 @@ func listOfSupportedServices() []providers.FetchDataFunction { ec2.VpcEndpoints, ec2.VpcPeeringConnections, kinesis.Streams, + redshift.EventSubscription, } } diff --git a/providers/aws/redshift/eventsubscription.go b/providers/aws/redshift/eventsubscription.go new file mode 100644 index 000000000..cac40a7c4 --- /dev/null +++ b/providers/aws/redshift/eventsubscription.go @@ -0,0 +1,87 @@ +package redshift + +import ( + "context" + "fmt" + "time" + + log "github.com/sirupsen/logrus" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/redshift" + "github.com/aws/aws-sdk-go-v2/service/sts" + . "github.com/tailwarden/komiser/models" + . "github.com/tailwarden/komiser/providers" +) + +func EventSubscription(ctx context.Context, client ProviderClient) ([]Resource, error) { + resources := make([]Resource, 0) + var config redshift.DescribeEventSubscriptionsInput + redshiftClient := redshift.NewFromConfig(*client.AWSClient) + + stsClient := sts.NewFromConfig(*client.AWSClient) + stsOutput, err := stsClient.GetCallerIdentity(ctx, &sts.GetCallerIdentityInput{}) + if err != nil { + return resources, err + } + + accountId := stsOutput.Account + + for { + output, err := redshiftClient.DescribeEventSubscriptions(ctx, &config) + if err != nil { + return resources, err + } + + for _, eventSubscription := range output.EventSubscriptionsList { // TODO: capitalization convention? + if eventSubscription.CustSubscriptionId != nil { // TODO: is this equivalent to filesystem.Name from the efs example? + + resourceArn := fmt.Sprintf("arn:aws:redshift:%s:%s:eventsubscripion/%s", client.AWSClient.Region, *accountId, *eventSubscription.CustSubscriptionId) // TODO: is this arn format correct + outputTags, err := redshiftClient.DescribeTags(ctx, &redshift.DescribeTagsInput{ + ResourceName: &resourceArn, // TODO: is ResourceName here equivalent to ResourceId in the efs example? + }) + + tags := make([]Tag, 0) + + if err == nil { + for _, tag := range outputTags.TaggedResources { // TODO: this is slightly different than in the efs example. Is it correct? + tags = append(tags, Tag{ + Key: *tag.Tag.Key, + Value: *tag.Tag.Value, + }) + } + } + + monthlyCost := float64(0) // TODO: what is the monthly cost + + resources = append(resources, Resource{ + Provider: "AWS", + Account: client.Name, + Service: "Redshift", + ResourceId: resourceArn, + Region: client.AWSClient.Region, + Name: *eventSubscription.CustSubscriptionId, + Cost: monthlyCost, + Tags: tags, + FetchedAt: time.Now(), + Link: fmt.Sprintf("https://%s.console.aws.amaxon.com/redshift/home?region=%s/event-subscriptions/%s", client.AWSClient.Region, client.AWSClient.Region, eventSubscription.CustSubscriptionId), // TODO: verify that the link format is correct + }) + } + } + + if aws.ToString(output.Marker) == "" { // TODO: is output.Marker here playing the same role as ouput.NextMarker in the efs example? + break + } + config.Marker = output.Marker + } + + log.WithFields(log.Fields{ + "provider": "AWS", + "account": client.Name, + "region": client.AWSClient.Region, + "service": "Redshift", + "resources": len(resources), + }).Info("Fetched resources") + return resources, nil + +} From fbf1438ae8ef14163ebaa52e9762d983ab9bccbf Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Sat, 26 Aug 2023 16:10:10 +0530 Subject: [PATCH 063/191] Update lke_pool.go Added identifier "Type" as a name --- providers/linode/lkepool/lke_pool.go | 1 + 1 file changed, 1 insertion(+) diff --git a/providers/linode/lkepool/lke_pool.go b/providers/linode/lkepool/lke_pool.go index 471f1a5f6..004a32668 100644 --- a/providers/linode/lkepool/lke_pool.go +++ b/providers/linode/lkepool/lke_pool.go @@ -54,6 +54,7 @@ lkeClusters, err := client.LinodeClient.ListLKEClusters(ctx, &linodego.ListOptio Service: "Linode Kubernetes Engine", ResourceId: fmt.Sprintf("%d", nodePool.ID), Cost: 0, + Name: nodePool.Type, FetchedAt: time.Now(), CreatedAt: time.Time{}, Tags: tags, From c3b9239cd4eb1089a9e2cba115a1d02c699cf0d6 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Sat, 26 Aug 2023 17:06:54 +0530 Subject: [PATCH 064/191] fix: disable onboarding wizard in default settings until ready --- dashboard/components/layout/Layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/components/layout/Layout.tsx b/dashboard/components/layout/Layout.tsx index ce902247d..834f6180c 100644 --- a/dashboard/components/layout/Layout.tsx +++ b/dashboard/components/layout/Layout.tsx @@ -37,7 +37,7 @@ function Layout({ children }: LayoutProps) { } }, [telemetry]); - const betaFlagOnboardingWizard = true; // To test the onboarding wizard feature, set this beta-flag to true + const betaFlagOnboardingWizard = false; // To test the onboarding wizard feature, set this beta-flag to true const isOnboarding = betaFlagOnboardingWizard && router.pathname.startsWith('/onboarding'); From 885e9216ea6db58e81bb049bc60d7ec1a236445a Mon Sep 17 00:00:00 2001 From: Erik K Anderson Date: Mon, 28 Aug 2023 17:35:24 -0500 Subject: [PATCH 065/191] use go get github.com/aws/aws-sdk-go-v2/service/redshift --- go.mod | 9 +++++---- go.sum | 10 ++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index c74592f9c..ae88e7534 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.0.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 github.com/BurntSushi/toml v1.2.1 - github.com/aws/aws-sdk-go-v2 v1.18.1 + github.com/aws/aws-sdk-go-v2 v1.21.0 github.com/aws/aws-sdk-go-v2/config v1.18.27 github.com/aws/aws-sdk-go-v2/service/apigateway v1.16.0 github.com/aws/aws-sdk-go-v2/service/autoscaling v1.27.2 @@ -81,6 +81,7 @@ require ( require ( cloud.google.com/go/longrunning v0.4.1 // indirect github.com/apache/arrow/go/v11 v11.0.0 // indirect + github.com/aws/aws-sdk-go-v2/service/redshift v1.29.5 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect ) @@ -97,8 +98,8 @@ require ( github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.26 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.5 // indirect github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.20.9 @@ -111,7 +112,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/servicecatalog v1.18.2 github.com/aws/aws-sdk-go-v2/service/ssm v1.36.2 github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 // indirect - github.com/aws/smithy-go v1.13.5 // indirect + github.com/aws/smithy-go v1.14.2 // indirect github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect diff --git a/go.sum b/go.sum index eb8865a36..b2023ae3f 100644 --- a/go.sum +++ b/go.sum @@ -65,6 +65,8 @@ github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.18.1 h1:+tefE750oAb7ZQGzla6bLkOwfcQCEtC5y2RqoqCeqKo= github.com/aws/aws-sdk-go-v2 v1.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= +github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3/go.mod h1:gNsR5CaXKmQSSzrmGxmwmct/r+ZBfbxorAuXYsj/M5Y= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= @@ -90,6 +92,8 @@ github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11X github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 h1:A5UqQEmPaCFpedKouS4v+dHCTUo2sKqhoKO9U5kxyWo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34/go.mod h1:wZpTEecJe0Btj3IYnDx/VlUzor9wm3fJHyvLpQF0VwY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.8/go.mod h1:ZIV8GYoC6WLBW5KGs+o4rsc65/ozd+eQ0L31XF5VDwk= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19/go.mod h1:6Q0546uHDp421okhmmGfbxzq2hBqbXFNpi4k+Q1JnQA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= @@ -100,6 +104,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7im github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 h1:srIVS45eQuewqz6fKKu6ZGXaq6FuFg5NzgQBAM6g8Y4= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 h1:SijA0mgjV8E+8G45ltVHs0fvKpTj8xmZJ3VwhGKtUSI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15 h1:QquxR7NH3ULBsKC+NoTpilzbKKS+5AELfNREInbhvas= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15/go.mod h1:Tkrthp/0sNBShQQsamR7j/zY4p19tVTAs+nnqhH6R3c= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= @@ -164,6 +170,8 @@ github.com/aws/aws-sdk-go-v2/service/pricing v1.20.0 h1:x5gKeerbKIQ/tdhmaAGNpivS github.com/aws/aws-sdk-go-v2/service/pricing v1.20.0/go.mod h1:JjpnqJdEW/5An429Ou+5Kb3UkwjXv16gRD2ZdGA2Gw8= github.com/aws/aws-sdk-go-v2/service/rds v1.30.1 h1:/B3GswjV+ScqZSZnhs3NMLwvVFXb1/aQL/elQwo0CMM= github.com/aws/aws-sdk-go-v2/service/rds v1.30.1/go.mod h1:wPFe1Cj3nZWmNWKKdkXw961l1dJheTZQ5JjPImqbMuI= +github.com/aws/aws-sdk-go-v2/service/redshift v1.29.5 h1:ufl4QI+6Vuxg6E8UOFVy+CeCtXS+gBMb00oTh2qSPco= +github.com/aws/aws-sdk-go-v2/service/redshift v1.29.5/go.mod h1:U8V+thdAH44/2weiprIA0JyDWa2XBov58TtdjCTTpc8= github.com/aws/aws-sdk-go-v2/service/s3 v1.27.1 h1:OKQIQ0QhEBmGr2LfT952meIZz3ujrPYnxH+dO/5ldnI= github.com/aws/aws-sdk-go-v2/service/s3 v1.27.1/go.mod h1:NffjpNsMUFXp6Ok/PahrktAncoekWrywvmIK83Q2raE= github.com/aws/aws-sdk-go-v2/service/servicecatalog v1.18.2 h1:YQ7/6UE9h6dIHMjHFr4xXLMZDfhwtQUea/D18XAjhcE= @@ -188,6 +196,8 @@ github.com/aws/smithy-go v1.12.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J github.com/aws/smithy-go v1.13.4/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= +github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= From 6b167b809ac4da7bcb736215cb132783f51a5ac9 Mon Sep 17 00:00:00 2001 From: Erik K Anderson Date: Wed, 30 Aug 2023 15:54:01 -0500 Subject: [PATCH 066/191] implement suggestions from pull request conversation --- providers/aws/aws.go | 2 +- providers/aws/redshift/eventsubscription.go | 24 ++++++++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/providers/aws/aws.go b/providers/aws/aws.go index 89c40c467..dfb0931ff 100644 --- a/providers/aws/aws.go +++ b/providers/aws/aws.go @@ -90,7 +90,7 @@ func listOfSupportedServices() []providers.FetchDataFunction { ec2.VpcEndpoints, ec2.VpcPeeringConnections, kinesis.Streams, - redshift.EventSubscription, + redshift.EventSubscriptions, } } diff --git a/providers/aws/redshift/eventsubscription.go b/providers/aws/redshift/eventsubscription.go index cac40a7c4..40d076199 100644 --- a/providers/aws/redshift/eventsubscription.go +++ b/providers/aws/redshift/eventsubscription.go @@ -14,7 +14,7 @@ import ( . "github.com/tailwarden/komiser/providers" ) -func EventSubscription(ctx context.Context, client ProviderClient) ([]Resource, error) { +func EventSubscriptions(ctx context.Context, client ProviderClient) ([]Resource, error) { resources := make([]Resource, 0) var config redshift.DescribeEventSubscriptionsInput redshiftClient := redshift.NewFromConfig(*client.AWSClient) @@ -33,21 +33,19 @@ func EventSubscription(ctx context.Context, client ProviderClient) ([]Resource, return resources, err } - for _, eventSubscription := range output.EventSubscriptionsList { // TODO: capitalization convention? - if eventSubscription.CustSubscriptionId != nil { // TODO: is this equivalent to filesystem.Name from the efs example? + for _, eventSubscription := range output.EventSubscriptionsList { + if eventSubscription.CustSubscriptionId != nil { resourceArn := fmt.Sprintf("arn:aws:redshift:%s:%s:eventsubscripion/%s", client.AWSClient.Region, *accountId, *eventSubscription.CustSubscriptionId) // TODO: is this arn format correct - outputTags, err := redshiftClient.DescribeTags(ctx, &redshift.DescribeTagsInput{ - ResourceName: &resourceArn, // TODO: is ResourceName here equivalent to ResourceId in the efs example? - }) + outputTags := eventSubscription.Tags tags := make([]Tag, 0) if err == nil { - for _, tag := range outputTags.TaggedResources { // TODO: this is slightly different than in the efs example. Is it correct? + for _, tag := range outputTags { tags = append(tags, Tag{ - Key: *tag.Tag.Key, - Value: *tag.Tag.Value, + Key: *tag.Key, + Value: *tag.Value, }) } } @@ -57,19 +55,19 @@ func EventSubscription(ctx context.Context, client ProviderClient) ([]Resource, resources = append(resources, Resource{ Provider: "AWS", Account: client.Name, - Service: "Redshift", + Service: "Redshift EventSubscription", ResourceId: resourceArn, Region: client.AWSClient.Region, Name: *eventSubscription.CustSubscriptionId, Cost: monthlyCost, Tags: tags, FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amaxon.com/redshift/home?region=%s/event-subscriptions/%s", client.AWSClient.Region, client.AWSClient.Region, eventSubscription.CustSubscriptionId), // TODO: verify that the link format is correct + Link: fmt.Sprintf("https://%s.console.aws.amaxon.com/redshift/home?region=%s/event-subscriptions/%s", client.AWSClient.Region, client.AWSClient.Region, *eventSubscription.CustSubscriptionId), // TODO: verify that the link format is correct }) } } - if aws.ToString(output.Marker) == "" { // TODO: is output.Marker here playing the same role as ouput.NextMarker in the efs example? + if aws.ToString(output.Marker) == "" { break } config.Marker = output.Marker @@ -79,7 +77,7 @@ func EventSubscription(ctx context.Context, client ProviderClient) ([]Resource, "provider": "AWS", "account": client.Name, "region": client.AWSClient.Region, - "service": "Redshift", + "service": "Redshift EventSubscription", "resources": len(resources), }).Info("Fetched resources") return resources, nil From a81c33fdc85cddee917cbe0358231eb7976e3b67 Mon Sep 17 00:00:00 2001 From: Erik K Anderson Date: Fri, 1 Sep 2023 04:04:21 -0500 Subject: [PATCH 067/191] clear out todo comments --- providers/aws/redshift/eventsubscription.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/providers/aws/redshift/eventsubscription.go b/providers/aws/redshift/eventsubscription.go index 40d076199..d2b488d8c 100644 --- a/providers/aws/redshift/eventsubscription.go +++ b/providers/aws/redshift/eventsubscription.go @@ -36,7 +36,7 @@ func EventSubscriptions(ctx context.Context, client ProviderClient) ([]Resource, for _, eventSubscription := range output.EventSubscriptionsList { if eventSubscription.CustSubscriptionId != nil { - resourceArn := fmt.Sprintf("arn:aws:redshift:%s:%s:eventsubscripion/%s", client.AWSClient.Region, *accountId, *eventSubscription.CustSubscriptionId) // TODO: is this arn format correct + resourceArn := fmt.Sprintf("arn:aws:redshift:%s:%s:eventsubscripion/%s", client.AWSClient.Region, *accountId, *eventSubscription.CustSubscriptionId) outputTags := eventSubscription.Tags tags := make([]Tag, 0) @@ -50,7 +50,7 @@ func EventSubscriptions(ctx context.Context, client ProviderClient) ([]Resource, } } - monthlyCost := float64(0) // TODO: what is the monthly cost + monthlyCost := float64(0) resources = append(resources, Resource{ Provider: "AWS", @@ -62,7 +62,7 @@ func EventSubscriptions(ctx context.Context, client ProviderClient) ([]Resource, Cost: monthlyCost, Tags: tags, FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amaxon.com/redshift/home?region=%s/event-subscriptions/%s", client.AWSClient.Region, client.AWSClient.Region, *eventSubscription.CustSubscriptionId), // TODO: verify that the link format is correct + Link: fmt.Sprintf("https://%s.console.aws.amaxon.com/redshift/home?region=%s/event-subscriptions/%s", client.AWSClient.Region, client.AWSClient.Region, *eventSubscription.CustSubscriptionId), }) } } From b968e8e87ab501f45ee24e3301b8abab97e3fffb Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Thu, 24 Aug 2023 15:07:33 +0530 Subject: [PATCH 068/191] add dependabot --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..5b3ff3516 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/dashboard" + schedule: + interval: "daily" From 3268982cd9eb1ce29695207ce68add38ea9629e6 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Thu, 31 Aug 2023 10:48:50 +0530 Subject: [PATCH 069/191] Update dependabot.yml --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5b3ff3516..de7d6e180 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,4 +3,4 @@ updates: - package-ecosystem: "npm" directory: "/dashboard" schedule: - interval: "daily" + interval: "weekly" From 409e5a4a0ae44f0547e067335e7bfdc969ba7dae Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Sat, 2 Sep 2023 01:27:44 +0100 Subject: [PATCH 070/191] feat(onboarding-wizard): initial support for managing cloud accounts --- .../components/CloudAccountsHeader.tsx | 26 +++++++ .../components/CloudAccountsLayout.tsx | 73 +++++++++++++++++++ .../useCloudAccounts/useCloudAccount.tsx | 37 ++++++++++ dashboard/components/icons/More2Icon.tsx | 27 +++++++ dashboard/components/navbar/Navbar.tsx | 16 ++-- dashboard/pages/cloud-accounts.tsx | 70 ++++++++++++++++++ 6 files changed, 243 insertions(+), 6 deletions(-) create mode 100644 dashboard/components/cloud-account/components/CloudAccountsHeader.tsx create mode 100644 dashboard/components/cloud-account/components/CloudAccountsLayout.tsx create mode 100644 dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.tsx create mode 100644 dashboard/components/icons/More2Icon.tsx create mode 100644 dashboard/pages/cloud-accounts.tsx diff --git a/dashboard/components/cloud-account/components/CloudAccountsHeader.tsx b/dashboard/components/cloud-account/components/CloudAccountsHeader.tsx new file mode 100644 index 000000000..24cd167e1 --- /dev/null +++ b/dashboard/components/cloud-account/components/CloudAccountsHeader.tsx @@ -0,0 +1,26 @@ +import Button from '../../button/Button'; +import PlusIcon from '../../icons/PlusIcon'; + +type CloudAccountsHeaderProps = { + isNotCustomView: boolean; +}; + +function CloudAccountsHeader({ isNotCustomView }: CloudAccountsHeaderProps) { + return ( +
+ {isNotCustomView && ( + <> +

+ Your Cloud Accounts +

+ + + )} +
+ ); +} + +export default CloudAccountsHeader; diff --git a/dashboard/components/cloud-account/components/CloudAccountsLayout.tsx b/dashboard/components/cloud-account/components/CloudAccountsLayout.tsx new file mode 100644 index 000000000..8a63d439f --- /dev/null +++ b/dashboard/components/cloud-account/components/CloudAccountsLayout.tsx @@ -0,0 +1,73 @@ +import { NextRouter } from 'next/router'; +import { ReactNode, useContext } from 'react'; + +import GlobalAppContext from '../../layout/context/GlobalAppContext'; +import Providers, { allProviders } from '../../../utils/providerHelper'; + +type CloudAccountsLayoutProps = { + children: ReactNode; + router: NextRouter; +}; + +function CloudAccountsLayout({ children, router }: CloudAccountsLayoutProps) { + const { displayBanner } = useContext(GlobalAppContext); + + const cloudProviders = Object.values(allProviders); + + return ( + <> + +
{children}
+ + ); +} + +export default CloudAccountsLayout; diff --git a/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.tsx b/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.tsx new file mode 100644 index 000000000..b484da61f --- /dev/null +++ b/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.tsx @@ -0,0 +1,37 @@ +import { useState } from 'react'; +import { useRouter } from 'next/router'; + +import useToast from '../../../toast/hooks/useToast'; +import { Provider } from '../../../../utils/providerHelper'; + +interface CloudAccounts { + provider: Provider; + name: string; + status: 'Connected' | 'Permission Issue' | 'Syncing'; +} + +function useCloudAccount() { + const router = useRouter(); + const { toast, dismissToast } = useToast(); + + const [cloudAccounts, setCloudAccounts] = useState>([ + { provider: 'aws', name: 'Loudy AWS', status: 'Connected' }, + { + provider: 'azure', + name: 'Loudy Azure', + status: 'Permission Issue' + }, + { provider: 'gcp', name: 'Loudy GCP', status: 'Syncing' } + ]); + const isNotCustomView = !router.query.view; + + return { + router, + toast, + dismissToast, + cloudAccounts, + isNotCustomView + }; +} + +export default useCloudAccount; diff --git a/dashboard/components/icons/More2Icon.tsx b/dashboard/components/icons/More2Icon.tsx new file mode 100644 index 000000000..ae6fe87a4 --- /dev/null +++ b/dashboard/components/icons/More2Icon.tsx @@ -0,0 +1,27 @@ +import { SVGProps } from 'react'; + +const More2Icon = (props: SVGProps) => ( + + + + + +); + +export default More2Icon; diff --git a/dashboard/components/navbar/Navbar.tsx b/dashboard/components/navbar/Navbar.tsx index f0d71668f..fd4a38966 100644 --- a/dashboard/components/navbar/Navbar.tsx +++ b/dashboard/components/navbar/Navbar.tsx @@ -5,17 +5,21 @@ import { useContext } from 'react'; import GlobalAppContext from '../layout/context/GlobalAppContext'; function Navbar() { - const { displayBanner } = useContext(GlobalAppContext); + const { displayBanner, betaFlagOnboardingWizard } = useContext(GlobalAppContext); const router = useRouter(); + // TODO: (onboarding-wizard) Remove the betaFlagOnboardingWizard conditional when feature is stable const nav = [ { label: 'Dashboard', href: '/dashboard' }, - { label: 'Inventory', href: '/inventory' } - ]; + { label: 'Inventory', href: '/inventory' }, + betaFlagOnboardingWizard + ? { label: 'Cloud Accounts', href: '/cloud-accounts' } + : null + ].filter(item => item !== null); + return (
\ No newline at end of file +
+ diff --git a/docs/configuration/cloud-providers/k8s.mdx b/docs/configuration/cloud-providers/k8s.mdx index 583d1c4f4..65e850379 100644 --- a/docs/configuration/cloud-providers/k8s.mdx +++ b/docs/configuration/cloud-providers/k8s.mdx @@ -73,7 +73,9 @@ Point your browser to `http://localhost:3000` ### You should see something like this! > In komiser v3.0.1 only `pods` and `services` are supported. More Kubernetes resources will be added shortly. -![Kubernetes-dashboard](/images/k8s-view.png) + + + ### Here's a video tutorial on how to integrate your Kubernetes cluster with Komiser: @@ -84,18 +86,12 @@ Point your browser to `http://localhost:3000` height:0, overflow:'hidden', }}> - -
\ No newline at end of file +
+ diff --git a/docs/getting-started/installation.mdx b/docs/getting-started/installation.mdx index a0212e836..2237b9d11 100644 --- a/docs/getting-started/installation.mdx +++ b/docs/getting-started/installation.mdx @@ -58,18 +58,12 @@ brew reinstall komiser height:0, overflow:'hidden', }}> - -
\ No newline at end of file + +
+ diff --git a/docs/getting-started/introduction.mdx b/docs/getting-started/introduction.mdx index afd0bc277..16495465d 100644 --- a/docs/getting-started/introduction.mdx +++ b/docs/getting-started/introduction.mdx @@ -8,11 +8,15 @@ This section is a high-level overview of how the Komiser Documentation is struct The Komiser Documentation covers everything you need to know about Komiser. It made up of five main sections which are: -- [Introduction](/docs/Introduction/installation.md) -- [Cloud Providers](/docs/cloud-providers/aws) -- [Contributing](/docs/Contributing/contribute.md) -- [Guides](/docs/guides/overview) -- [FAQs](/docs/FAQ/faq.md) +[Introduction](/docs/Introduction/installation.md) + +[Cloud Providers](/docs/cloud-providers/aws) + +[Contributing](/docs/Contributing/contribute.md) + +[Guides](/docs/guides/overview) + +[FAQs](/docs/FAQ/faq.md) ## Introduction @@ -20,40 +24,51 @@ In the `introduction` section you will find the three pages below. Since Komiser Head over to the `Installation` page to get the download the Komiser CLI for your OS and architecture. The `What is Komiser?` page summarizes the goals and features of the Komiser project. -- [Community](/docs/Introduction/community.md) -- [Installation](/docs/Introduction/installation.md) -- [What is Komiser?](/docs/Introduction/what-is-komiser.md) +[Community](/docs/Introduction/community.md) + +[Installation](/docs/Introduction/installation.md) + +[What is Komiser?](/docs/Introduction/what-is-komiser.md) ## Cloud Providers Komiser supports multiple cloud providers and form of deployment. Follow the links below to get the installation steps for the each cloud provider: -- [AWS](/docs/cloud-providers/aws) -- [Azure](/docs/cloud-providers/azure) -- [Civo](/docs/cloud-providers/civo) -- [DigitalOcean](/docs/cloud-providers/digital-ocean) -- [Kubernetes](/docs/cloud-providers/kubernetes) -- [Linode](/docs/cloud-providers/linode) -- [MongoDB Atlas](/docs/cloud-providers/mongodb-atlas) -- [OCI](/docs/cloud-providers/oci) -- [Scaleway](/docs/cloud-providers/scaleway) -- [Tencent](/docs/cloud-providers/tencent) +[AWS](/docs/cloud-providers/aws) + +[Azure](/docs/cloud-providers/azure) + +[Civo](/docs/cloud-providers/civo) + +[DigitalOcean](/docs/cloud-providers/digital-ocean) + +[Kubernetes](/docs/cloud-providers/kubernetes) + +[Linode](/docs/cloud-providers/linode) + +[MongoDB Atlas](/docs/cloud-providers/mongodb-atlas) + +[OCI](/docs/cloud-providers/oci) + +[Scaleway](/docs/cloud-providers/scaleway) + +[Tencent](/docs/cloud-providers/tencent) ## Contributing Komiser is written in `Golang` and is `Elv2 licensed` - contributions are always welcome whether that means providing feedback, be it through GitHub, through the `#feedback` channel on our [Discord server](https://discord.tailwarden.com) or testing existing and new features. All of the relevant information below: -- [Contribute](/docs/Contributing/contribute.md) +[Contribute](/docs/Contributing/contribute.md) ## Guides We want to be able to give Komiser users the tips and guidance neccessary to be able to get the most value from the tool as quickly as possible. That's why we will be continously adding and updating informative guides and series in which try to relay valuable and actionable advice. -- [How to Komiser](/docs/guides/overview) +[How to Komiser](/docs/guides/overview) ## FAQs Find all the answers to all the Komiser related questions you might have. Feel free to reach out via the `#feedback` channel on [Discord](https://discord.tailwarden.com) to request the inclusion of additional questions. -- [FAQs](/docs/FAQ/faq.md) +[FAQs](/docs/FAQ/faq.md) diff --git a/docs/getting-started/quickstart.mdx b/docs/getting-started/quickstart.mdx index 51a8562b2..c5daf0063 100644 --- a/docs/getting-started/quickstart.mdx +++ b/docs/getting-started/quickstart.mdx @@ -47,7 +47,9 @@ uri="postgres://postgres:komiser@localhost:5432/komiser?sslmode=disable" file = "komiser.db" ``` - The reason for this external data persistence is to improve the filtering, sorting and tagging management experience making it faster and smoother. It also serves as a standalone DB which you are free to query and visualize as you see fit. + +The reason for this external data persistence is to improve the filtering, sorting and tagging management experience making it faster and smoother. It also serves as a standalone DB which you are free to query and visualize as you see fit. + ### Example config.toml ``` @@ -121,20 +123,13 @@ docker run -v /local/path/to/config.toml:/etc/config/config.toml -v /local/path height:0, overflow:'hidden', }}> - +
## Self-hosted @@ -151,4 +146,5 @@ Head over to your cloud provider of choice to learn how to connect your Komiser * [MongoDB](/configuration/cloud-providers/mongodb-atlas) * [OCI](/configuration/cloud-providers/oci) * [Scaleway](/configuration/cloud-providers/scaleway) -* [Tencent](/configuration/cloud-providers/tencent) \ No newline at end of file +* [Tencent](/configuration/cloud-providers/tencent) + diff --git a/docs/guides/dashboard.mdx b/docs/guides/dashboard.mdx index f3d791325..0e407bfe1 100644 --- a/docs/guides/dashboard.mdx +++ b/docs/guides/dashboard.mdx @@ -13,7 +13,9 @@ To the left of the cloud map, you will find the `Resource manager`, where you ca Below, you will find the `Cost explorer`, which allows you to sort resources and compare costs on a monthly to yearly basis. You can also exclude resources from the cost comparison. -![Dashboard gif](/images/dashboard.png) + + + ### Check out the `dashboard` in the first part of the Komiser v3.0.3 video: @@ -24,18 +26,11 @@ Below, you will find the `Cost explorer`, which allows you to sort resources and height:0, overflow:'hidden', }}> -
\ No newline at end of file diff --git a/docs/mint.json b/docs/mint.json index fc03b572d..10e7a6c3d 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -7,8 +7,8 @@ }, "favicon": "/favicon.png", "colors": { - "primary": "#697372", - "light": "#FFFFFF", + "primary": "#008484", + "light": "#33CCCC", "dark": "#33CCCC", "background": { "dark": "#090F19" @@ -84,5 +84,12 @@ "linkedin": "https://www.linkedin.com/company/tailwarden", "youtube": "https://www.youtube.com/@tailwarden" }, - "backgroundImage": "/images/background-image.png" -} + + "backgroundImage": "/images/background-image.png", + + "analytics": { + "ga4": { + "measurementId": "G-PVLRSMWSFG" + } + } +} \ No newline at end of file From 6dbc32251894124614d2974ec597341e75c81c73 Mon Sep 17 00:00:00 2001 From: jakepage91 Date: Fri, 15 Sep 2023 14:52:52 +0100 Subject: [PATCH 105/191] updated anchor colors --- docs/mint.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/mint.json b/docs/mint.json index 10e7a6c3d..c12638f95 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -14,8 +14,8 @@ "dark": "#090F19" }, "anchors": { - "from": "#FF7F57", - "to": "#9563FF" + "from": "#008484", + "to": "#33CCCC" } }, "topbarCtaButton": { From fc420e076b3aa97b3750ad9679fb8d8774e3d0a7 Mon Sep 17 00:00:00 2001 From: Pavan Gudiwada <25551553+pavangudiwada@users.noreply.github.com> Date: Sat, 16 Sep 2023 10:35:09 +0530 Subject: [PATCH 106/191] Updated to fmt.Sprintf and revised to full ELB names --- providers/aws/elb/loadbalancers.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/providers/aws/elb/loadbalancers.go b/providers/aws/elb/loadbalancers.go index 58856cac5..3aea90989 100644 --- a/providers/aws/elb/loadbalancers.go +++ b/providers/aws/elb/loadbalancers.go @@ -71,7 +71,7 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro resources = append(resources, Resource{ Provider: "AWS", Account: client.Name, - Service: "ELB" + " " + elbValues[resourceType].elbType, + Service: fmt.Sprintf("ELB %s", elbValues[resourceType].elbType), ResourceId: resourceArn, Region: client.AWSClient.Region, Name: *loadbalancer.LoadBalancerName, @@ -110,7 +110,7 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro resources = append(resources, Resource{ Provider: "AWS", Account: client.Name, - Service: "ELB " + elbValues[resourceType].elbType[:3] + " Listener", + Service: fmt.Sprintf("ELB %s Listener", elbValues[resourceType].elbType), ResourceId: listenerArn, Region: client.AWSClient.Region, Name: *loadbalancer.LoadBalancerName, @@ -146,10 +146,10 @@ func LoadBalancers(ctx context.Context, client ProviderClient) ([]Resource, erro resources = append(resources, Resource{ Provider: "AWS", Account: client.Name, - Service: "ELB " + elbValues[resourceType].elbType[:3] + " Listener Rule", + Service: fmt.Sprintf("ELB %s Listener Rule", elbValues[resourceType].elbType), ResourceId: ruleArn, Region: client.AWSClient.Region, - Name: *loadbalancer.LoadBalancerName + " Rule " + fmt.Sprintf("%d", rule_number+1), + Name: *loadbalancer.LoadBalancerName + fmt.Sprintf(" Rule %d", rule_number+1), Tags: tags, FetchedAt: time.Now(), Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#ListenerRuleDetails:ruleArn=%s", client.AWSClient.Region, client.AWSClient.Region, ruleArn), From a3f1bc3d42428c6cfa1aeb2a0ae2190a6be7f1bd Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Sun, 17 Sep 2023 08:10:45 +0530 Subject: [PATCH 107/191] fix: paths ignored [ #966] --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 15eae7d76..726ab0637 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ tmp credentials main config.toml -docs/ _ out bin From d861493148b3542c81ecd12597fc7292b5b9f73d Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Sun, 17 Sep 2023 11:11:53 +0530 Subject: [PATCH 108/191] chore: upgrade go version in go mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index ae88e7534..de9bc15c2 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/tailwarden/komiser -go 1.20 +go 1.21 require ( cloud.google.com/go/bigquery v1.49.0 From 6799086ab8806b19b903d179e758c9839c44afd6 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Sun, 17 Sep 2023 11:18:46 +0530 Subject: [PATCH 109/191] CI: upgrade go version --- .github/workflows/build_test_pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_test_pr.yml b/.github/workflows/build_test_pr.yml index fefd7e1ff..e17d73ae1 100644 --- a/.github/workflows/build_test_pr.yml +++ b/.github/workflows/build_test_pr.yml @@ -35,7 +35,7 @@ jobs: with: cache: true cache-dependency-path: go.sum - go-version: 1.20.2 + go-version: 1.21 # FIXME: https://github.com/golangci/golangci-lint-action/issues/677 # - name: golangci-lint From 6c12261def8efe692432c2855a723822d5cdddd9 Mon Sep 17 00:00:00 2001 From: AKSHAYA MADHURI <76612327+akshayamadhuri@users.noreply.github.com> Date: Mon, 18 Sep 2023 12:43:25 +0530 Subject: [PATCH 110/191] Update docs/getting-started/introduction.mdx Co-authored-by: Shivam Sharma --- docs/getting-started/introduction.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/introduction.mdx b/docs/getting-started/introduction.mdx index 42a385390..87b227bec 100644 --- a/docs/getting-started/introduction.mdx +++ b/docs/getting-started/introduction.mdx @@ -37,7 +37,7 @@ Komiser is compatible with various cloud providers and deployment methods. Explo ## Contributing -Komiser is written in `Golang` and is `Elv2 licensed` - contributions are always welcome whether that means providing feedback, be it through GitHub, through the `#feedback` channel on our [Discord server](https://discord.tailwarden.com) or testing existing and new features.Find all the details on how to contribute in the [Contribute](https://docs.komiser.io/community-support/contributing) section. +Komiser is written in `Golang` and is `Elv2 licensed` - contributions are always welcome whether that means providing feedback, be it through GitHub, through the `#feedback` channel on our [Discord server](https://discord.tailwarden.com) or testing existing and new features. Find all the details on how to contribute in the [Contribute](https://docs.komiser.io/community-support/contributing) section. ## Guides From adc2384109e66a295f6ef0ed4307f1110b9f629a Mon Sep 17 00:00:00 2001 From: Kolawole Ojo Date: Mon, 18 Sep 2023 16:02:39 +0100 Subject: [PATCH 111/191] feat(cloud-account): ui for deleting cloud accounts --- .../components/icons/AlertCircleIcon.tsx | 35 +++++ dashboard/pages/cloud-accounts.tsx | 138 +++++++++++++++++- 2 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 dashboard/components/icons/AlertCircleIcon.tsx diff --git a/dashboard/components/icons/AlertCircleIcon.tsx b/dashboard/components/icons/AlertCircleIcon.tsx new file mode 100644 index 000000000..5763df243 --- /dev/null +++ b/dashboard/components/icons/AlertCircleIcon.tsx @@ -0,0 +1,35 @@ +import { SVGProps } from 'react'; + +const AlertCircleIcon = (props: SVGProps) => ( + + + + + + +); + +export default AlertCircleIcon; diff --git a/dashboard/pages/cloud-accounts.tsx b/dashboard/pages/cloud-accounts.tsx index a984703be..632f7bfa8 100644 --- a/dashboard/pages/cloud-accounts.tsx +++ b/dashboard/pages/cloud-accounts.tsx @@ -1,21 +1,77 @@ import Head from 'next/head'; import Image from 'next/image'; +import { useEffect, useRef, useState } from 'react'; import classNames from 'classnames'; import providers from '../utils/providerHelper'; import Toast from '../components/toast/Toast'; +import Modal from '../components/modal/Modal'; +import Button from '../components/button/Button'; +import EditIcon from '../components/icons/EditIcon'; import More2Icon from '../components/icons/More2Icon'; +import DeleteIcon from '../components/icons/DeleteIcon'; +import AlertCircleIcon from '../components/icons/AlertCircleIcon'; import CloudAccountsHeader from '../components/cloud-account/components/CloudAccountsHeader'; import CloudAccountsLayout from '../components/cloud-account/components/CloudAccountsLayout'; import useCloudAccount from '../components/cloud-account/hooks/useCloudAccounts/useCloudAccount'; function CloudAccounts() { + const optionsRef = useRef(null); + const [clickedItemId, setClickedItemId] = useState(null); + const [editCloudAccount, setEditCloudAccount] = useState(false); + const [removeCloudAccount, setRemoveCloudAccount] = useState<{ + state: boolean; + accountName: string; + }>({ + state: false, + accountName: '' + }); + const { router, cloudAccounts, toast, dismissToast, isNotCustomView } = useCloudAccount(); + useEffect(() => { + const handleOutsideClick = (event: MouseEvent) => { + if ( + optionsRef.current && + !optionsRef.current.contains(event.target as Node) + ) { + setClickedItemId(null); // Close the options if clicked outside + } + }; + + document.addEventListener('mousedown', handleOutsideClick); + + return () => { + document.removeEventListener('mousedown', handleOutsideClick); + }; + }, []); + + const toggleOptions = (itemId: string) => { + setClickedItemId(prevClickedItemId => { + if (prevClickedItemId === itemId) { + return null; // Close on Clicking the same item's icon + } + return itemId; + }); + }; + + const closeRemoveModal = () => { + setRemoveCloudAccount({ + state: false, + accountName: '' + }); + }; + + const deleteCloudAccount = () => { + const removalName = removeCloudAccount.accountName; + console.log('deleting', removalName); + // TODO: (onboarding-wizard) handle account removal API call here + }; + return ( <> @@ -30,6 +86,7 @@ function CloudAccounts() { {cloudAccounts.map(account => { const { provider, name, status } = account; + const isOpen = clickedItemId === name; return (
+

{name}

{providers.providerLabel(provider)}

+
{status.state} -
+
{status.message}
- + + toggleOptions(name)} + /> + + {isOpen && ( +
+ + +
+ )}
); })} + {/* Delete Modal */} + closeRemoveModal()} + > +
+
+ +

+ Are you sure you want to remove this cloud account? +

+

+ All related data (like custom views and tags) will be deleted and + the {removeCloudAccount.accountName} account will be disconnected + from Komiser. +

+
+
+ + +
+
+
+ + {/* Edit Drawer */} + setEditCloudAccount(false)} + > +
Editing
+
Replace this with the drawer
+
+ {/* Toast component */} {toast && } From 64333075312df706a40655e60f2b0679be7051a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 23:59:24 +0000 Subject: [PATCH 112/191] chore(deps-dev): bump eslint-config-next in /dashboard Bumps [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) from 13.0.1 to 13.4.19. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/commits/v13.4.19/packages/eslint-config-next) --- updated-dependencies: - dependency-name: eslint-config-next dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 117 ++++++++++++++---------------------- dashboard/package.json | 2 +- 2 files changed, 46 insertions(+), 73 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 3bd88db20..118bdd13f 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -42,7 +42,7 @@ "autoprefixer": "^10.4.13", "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-next": "13.0.1", + "eslint-config-next": "13.4.19", "eslint-config-prettier": "^8.5.0", "eslint-plugin-jest": "^27.2.1", "eslint-plugin-prettier": "^4.2.1", @@ -3879,9 +3879,9 @@ "integrity": "sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.0.1.tgz", - "integrity": "sha512-t3bggJhKE/oB4pvMM7hMNnmIpIqsMGJ+OLklk8llOkSeXtfCV+MBQbhImWxf5QODkxNAmMK3IJGAAecQhBTc/Q==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz", + "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==", "dev": true, "dependencies": { "glob": "7.1.7" @@ -11226,20 +11226,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.0.1.tgz", - "integrity": "sha512-/N9UpSwkbEMj5pIiB235p7QHaSW08ta/iKVaIHF44wufxr+PuJVLwg5LzlAaQbmCZCBpYvVttl3ZxTusP1g2sg==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz", + "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==", "dev": true, "dependencies": { - "@next/eslint-plugin-next": "13.0.1", + "@next/eslint-plugin-next": "13.4.19", "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.21.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", + "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "^4.5.0" + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -11284,78 +11284,30 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", - "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", + "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", "dev": true, "dependencies": { "debug": "^4.3.4", - "glob": "^7.2.0", - "is-glob": "^4.0.3", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*" } }, - "node_modules/eslint-import-resolver-typescript/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", @@ -12735,6 +12687,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", + "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/giget": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", @@ -18560,6 +18524,15 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve-url-loader": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", diff --git a/dashboard/package.json b/dashboard/package.json index 1ca343c49..019a59d34 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -48,7 +48,7 @@ "autoprefixer": "^10.4.13", "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-next": "13.0.1", + "eslint-config-next": "13.4.19", "eslint-config-prettier": "^8.5.0", "eslint-plugin-jest": "^27.2.1", "eslint-plugin-prettier": "^4.2.1", From a18c94b0250751c24bd997fd2dad268abc27376d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 00:00:26 +0000 Subject: [PATCH 113/191] chore(deps-dev): bump eslint-plugin-jest in /dashboard Bumps [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) from 27.2.3 to 27.4.0. - [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases) - [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v27.2.3...v27.4.0) --- updated-dependencies: - dependency-name: eslint-plugin-jest dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 8 ++++---- dashboard/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 3bd88db20..b2220f23c 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -44,7 +44,7 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-next": "13.0.1", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-jest": "^27.4.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-storybook": "^0.6.13", "husky": "^8.0.0", @@ -11477,9 +11477,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz", - "integrity": "sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.4.0.tgz", + "integrity": "sha512-ukVeKmMPAUA5SWjHenvyyXnirKfHKMdOsTZdn5tZx5EW05HGVQwBohigjFZGGj3zuv1cV6hc82FvWv6LdIbkgg==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" diff --git a/dashboard/package.json b/dashboard/package.json index 1ca343c49..7b9e19338 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -50,7 +50,7 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-next": "13.0.1", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-jest": "^27.4.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-storybook": "^0.6.13", "husky": "^8.0.0", From ea56b4f33988ee97adbb4bc27909e6d44dce9914 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 06:42:31 +0000 Subject: [PATCH 114/191] chore(deps): bump @types/react from 18.0.24 to 18.2.22 in /dashboard Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.0.24 to 18.2.22. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 8 ++++---- dashboard/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 83c109829..efcd7c9ac 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -11,7 +11,7 @@ "@sentry/react": "^7.41.0", "@sentry/tracing": "^7.41.0", "@types/node": "20.5.9", - "@types/react": "18.0.24", + "@types/react": "18.2.22", "@types/react-dom": "18.0.8", "chart.js": "^4.2.1", "classnames": "^2.3.2", @@ -7105,9 +7105,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.24.tgz", - "integrity": "sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q==", + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", diff --git a/dashboard/package.json b/dashboard/package.json index 81152fc77..086165dd3 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -17,7 +17,7 @@ "@sentry/react": "^7.41.0", "@sentry/tracing": "^7.41.0", "@types/node": "20.5.9", - "@types/react": "18.0.24", + "@types/react": "18.2.22", "@types/react-dom": "18.0.8", "chart.js": "^4.2.1", "classnames": "^2.3.2", From b8a575b2ae3dd3f0b3ebae635f0cf9a7504df53b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 07:49:16 +0000 Subject: [PATCH 115/191] chore(deps): bump @types/react-dom from 18.0.8 to 18.2.7 in /dashboard Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 18.0.8 to 18.2.7. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom) --- updated-dependencies: - dependency-name: "@types/react-dom" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 8 ++++---- dashboard/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index efcd7c9ac..c3fc4b1ce 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -12,7 +12,7 @@ "@sentry/tracing": "^7.41.0", "@types/node": "20.5.9", "@types/react": "18.2.22", - "@types/react-dom": "18.0.8", + "@types/react-dom": "18.2.7", "chart.js": "^4.2.1", "classnames": "^2.3.2", "next": "^13.4.19", @@ -7115,9 +7115,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.8.tgz", - "integrity": "sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==", + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", "dependencies": { "@types/react": "*" } diff --git a/dashboard/package.json b/dashboard/package.json index 086165dd3..91b2ae684 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -18,7 +18,7 @@ "@sentry/tracing": "^7.41.0", "@types/node": "20.5.9", "@types/react": "18.2.22", - "@types/react-dom": "18.0.8", + "@types/react-dom": "18.2.7", "chart.js": "^4.2.1", "classnames": "^2.3.2", "next": "^13.4.19", From ff7b2f2eb86c1fa8ece5e3791831d3ed8a24ad3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 07:49:21 +0000 Subject: [PATCH 116/191] chore(deps): bump @types/node from 20.5.9 to 20.6.2 in /dashboard Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.5.9 to 20.6.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 8 ++++---- dashboard/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index efcd7c9ac..b83f668f3 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@sentry/react": "^7.41.0", "@sentry/tracing": "^7.41.0", - "@types/node": "20.5.9", + "@types/node": "20.6.2", "@types/react": "18.2.22", "@types/react-dom": "18.0.8", "chart.js": "^4.2.1", @@ -7055,9 +7055,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz", + "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==" }, "node_modules/@types/node-fetch": { "version": "2.6.5", diff --git a/dashboard/package.json b/dashboard/package.json index 086165dd3..43ae19afe 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -16,7 +16,7 @@ "dependencies": { "@sentry/react": "^7.41.0", "@sentry/tracing": "^7.41.0", - "@types/node": "20.5.9", + "@types/node": "20.6.2", "@types/react": "18.2.22", "@types/react-dom": "18.0.8", "chart.js": "^4.2.1", From b3e4fd3cc66801286ac9232bb8e6c1c0771da67b Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Tue, 19 Sep 2023 17:32:54 +0530 Subject: [PATCH 117/191] CI: status badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 62c793b7e..3848e9fba 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@

+[![Build and Test komiser](https://github.com/tailwarden/komiser/actions/workflows/build_test.yml/badge.svg)](https://github.com/tailwarden/komiser/actions/workflows/build_test.yml) [![Price](https://img.shields.io/badge/price-FREE-0098f7.svg)](https://github.com/tailwarden/komiser/blob/master/LICENSE) [![Docker Stars](https://img.shields.io/docker/pulls/mlabouardy/komiser.svg)](https://hub.docker.com/r/mlabouardy/komiser) [![ELv2 License](https://img.shields.io/badge/license-ELv2-green)](LICENSE) [![Docker Stars](https://img.shields.io/github/issues/tailwarden/komiser.svg)](https://github.com/tailwarden/komiser/issues) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.tailwarden.com/) From 85925606a35e30009e1680d1110570d08f387264 Mon Sep 17 00:00:00 2001 From: jakepage91 Date: Tue, 19 Sep 2023 14:19:37 +0100 Subject: [PATCH 118/191] fixes deadlinks and added images to alerts guide --- docs/getting-started/introduction.mdx | 32 +++++++++++------------ docs/guides/alerts.mdx | 27 +++++++++++++------ docs/images/alert-example.png | Bin 0 -> 26230 bytes docs/images/untagged-resources-alert.png | Bin 0 -> 67086 bytes 4 files changed, 35 insertions(+), 24 deletions(-) create mode 100644 docs/images/alert-example.png create mode 100644 docs/images/untagged-resources-alert.png diff --git a/docs/getting-started/introduction.mdx b/docs/getting-started/introduction.mdx index 901f68c23..440a4d520 100644 --- a/docs/getting-started/introduction.mdx +++ b/docs/getting-started/introduction.mdx @@ -10,48 +10,48 @@ Welcome to the Komiser Documentation, your comprehensive guide to harnessing the ## What is Komiser? -Komiser is an open-source project that empowers users to optimize and manage their cloud resources efficiently. This documentation serves as a comprehensive guide to understanding and using [Komiser](/docs/Introduction/what-is-komiser.md) effectively. +Komiser is an open-source project that empowers users to optimize and manage their cloud resources efficiently. This documentation serves as a comprehensive guide to understanding and using [Komiser](/welcome/overview) effectively. ## Community -At Komiser, we believe that the strength of any open-source project lies in its community. Whether you're a developer, user, or enthusiast, you can contribute to the project's success. Learn how to get involved and join our thriving community in the [Community](https://docs.komiser.io/community-support/contributing) section. +At Komiser, we believe that the strength of any open-source project lies in its community. Whether you're a developer, user, or enthusiast, you can contribute to the project's success. Learn how to get involved and join our thriving community in the [Contributing](/community-support/contributing) section. ## Installation -To start using Komiser, you'll need to install the Komiser Command-Line Interface (CLI) tailored for your specific operating system and architecture. Visit the [Installation](https://docs.komiser.io/getting-started/installation) page for detailed instructions on how to download and set up Komiser on your system. +To start using Komiser, you'll need to install the Komiser Command-Line Interface (CLI) tailored for your specific operating system and architecture. Visit the [Installation](/getting-started/installation) page for detailed instructions on how to download and set up Komiser on your system. ## Cloud Providers Komiser is compatible with various cloud providers and deployment methods. Explore the installation steps for your preferred cloud provider from the list below: -[AWS](/docs/cloud-providers/aws) +[AWS](/cloud-providers/aws) -[Azure](/docs/cloud-providers/azure) +[Azure](/cloud-providers/azure) -[Civo](/docs/cloud-providers/civo) +[Civo](/cloud-providers/civo) -[DigitalOcean](/docs/cloud-providers/digital-ocean) +[DigitalOcean](/cloud-providers/digital-ocean) -[Kubernetes](/docs/cloud-providers/kubernetes) +[Kubernetes](/cloud-providers/kubernetes) -[Linode](/docs/cloud-providers/linode) +[Linode](/cloud-providers/linode) -[MongoDB Atlas](/docs/cloud-providers/mongodb-atlas) +[MongoDB Atlas](/cloud-providers/mongodb-atlas) -[OCI](/docs/cloud-providers/oci) +[OCI](/cloud-providers/oci) -[Scaleway](/docs/cloud-providers/scaleway) +[Scaleway](/cloud-providers/scaleway) -[Tencent](/docs/cloud-providers/tencent) +[Tencent](/cloud-providers/tencent) ## Contributing -Komiser is written in `Golang` and is `Elv2 licensed` - contributions are always welcome whether that means providing feedback, be it through GitHub, through the `#feedback` channel on our [Discord server](https://discord.tailwarden.com) or testing existing and new features. Find all the details on how to contribute in the [Contribute](https://docs.komiser.io/community-support/contributing) section. +Komiser is written in `Golang` and is `Elv2 licensed` - contributions are always welcome whether that means providing feedback, be it through GitHub, through the `#feedback` channel on our [Discord server](https://discord.tailwarden.com) or testing existing and new features. Find all the details on how to contribute in the [Contribute](/community-support/contributing) section. ## Guides -To help you make the most of Komiser, we provide a collection of informative guides and series. These guides offer valuable insights and actionable advice for optimizing your cloud resources with Komiser. Dive into the world of Komiser with our [How to Komiser](/docs/guides/overview) guide. +To help you make the most of Komiser, we provide a collection of informative guides and series. These guides offer valuable insights and actionable advice for optimizing your cloud resources with Komiser. Dive into the world of Komiser with our [Alerts](/guides/alerts) guide. ## FAQs -Got questions about Komiser? Find answers to commonly asked questions in the [FAQs](/docs/FAQ/faq.md) section. If you have additional questions or suggestions, feel free to reach out through the `#feedback` channel on our [Discord](https://discord.tailwarden.com) server. +Got questions about Komiser? Find answers to commonly asked questions in the [FAQs](/FAQ/faq.md) section. If you have additional questions or suggestions, feel free to reach out through the `#feedback` channel on our [Discord](https://discord.tailwarden.com) server. diff --git a/docs/guides/alerts.mdx b/docs/guides/alerts.mdx index a4402fd74..dba2db37e 100644 --- a/docs/guides/alerts.mdx +++ b/docs/guides/alerts.mdx @@ -22,6 +22,12 @@ Note: The above actions are just a few examples of the endless possibilities tha 6. Save the alert. 7. Congratulations! You should now see the alert when you click on the alerts tab again. + This is the expected output of a triggered alerts on Slack + + + + + ## Slack integration To integrate Komiser with Slack you will have to generate a webhook and add it to the `config.toml` file. Find the steps to generate the slack webhook in the official slack documentation [here](https://api.slack.com/messaging/webhooks). @@ -45,8 +51,8 @@ webhook="https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXX To integrate a custom webhook, you need a URL that listens to the data posted to it when it is triggered. You don't need to edit the `config.toml` file for this integration. ### Request Details -- Komiser makes a **POST** request to the endpoint. -- The data is sent in the following format in the request body: +Komiser makes a **POST** request to the endpoint. +The data is sent in the following format in the request body: ```json { "komiser": "", // [string] @@ -56,8 +62,8 @@ To integrate a custom webhook, you need a URL that listens to the data posted to "timestamp": 1685793973 // [int64] number of seconds since January 1, 1970 UTC } ``` -- You can add an optional **Secret** field. It is a secret value that is added as a request header: `authorization: `. -- It is recommended to **test the endpoint** before submitting the alert and verify the data you receive is the same as: +You can add an optional **Secret** field. It is a secret value that is added as a request header: `authorization: `. +It is recommended to **test the endpoint** before submitting the alert and verify the data you receive is the same as: ```json { "komiser": "komiser version that will send the webhook", @@ -68,6 +74,11 @@ To integrate a custom webhook, you need a URL that listens to the data posted to } ``` +Webhook alert configuration screen + + + + ## Komiser Alerts Webhook Integration Use Cases In this guide, we'll explore five practical use cases for the Komiser alerts webhook integration. This integration allows you to trigger actions based on alerts generated by Komiser, helping you proactively manage your cloud resources. We'll also reference the Komiser Alerts documentation to demonstrate how to set up these use cases. @@ -76,7 +87,7 @@ In this guide, we'll explore five practical use cases for the Komiser alerts web **Scenario:** When Komiser alerts trigger, you want to notify your admin team via email and create a ticket in a task management system. **Solution:** -1. *Komiser Alert Configuration:* Follow the steps outlined in the [Komiser Alerts](#Steps-to-add-an-Alert) to set up alerts for cost or usage thresholds. +1. *Komiser Alert Configuration:* Follow the steps outlined in the [Komiser Alerts](#steps-to-add-an-alert) to set up alerts for cost or usage thresholds. 2. *Webhook Integration:* Configure a webhook integration in Komiser to send alerts. 3. *Zapier Integration:* Use Zapier to connect the Komiser webhook to your email service and task management system. Create a Zap that triggers an email to the admin and generates a ticket on Linear. @@ -85,7 +96,7 @@ In this guide, we'll explore five practical use cases for the Komiser alerts web **Scenario:** When Komiser alerts are triggered, you want to automatically execute actions in AWS Lambda. **Solution:** -1. *Komiser Alert Configuration:* Set up alerts as per the [Komiser Alerts](#Steps-to-add-an-Alert). +1. *Komiser Alert Configuration:* Set up alerts as per the [Komiser Alerts](#steps-to-add-an-alert). 2. *Webhook Integration:* Configure a webhook in Komiser to send alerts. 3. *AWS Lambda Integration:* Create an AWS Lambda function that is triggered by the Komiser webhook. Define the actions you want Lambda to take when an alert is received. @@ -94,7 +105,7 @@ In this guide, we'll explore five practical use cases for the Komiser alerts web **Scenario:** Komiser alerts should trigger PagerDuty incidents, and you want to create post-mortem documentation. **Solution:** -1. *Komiser Alert Configuration:* Set up alerts as described in the [Komiser Alerts](#Steps-to-add-an-Alert). +1. *Komiser Alert Configuration:* Set up alerts as described in the [Komiser Alerts](#steps-to-add-an-alert). 2. *Webhook Integration:* Configure a webhook integration in Komiser to send alerts. 3. *PagerDuty Integration:* In PagerDuty, set up a service that listens for alerts from Komiser via the webhook. Configure PagerDuty to trigger incidents. 4. *Notion Documentation:* Use Zapier or another integration to automatically create post-mortem documentation in Notion when an incident is triggered in PagerDuty. @@ -104,7 +115,7 @@ In this guide, we'll explore five practical use cases for the Komiser alerts web **Scenario:** Receive Komiser alerts in a Slack channel for real-time monitoring. **Solution:** -1. *Komiser Alert Configuration:* Follow the [Komiser Alerts](#Steps-to-add-an-Alert) to set up alerts. +1. *Komiser Alert Configuration:* Follow the [Komiser Alerts](#steps-to-add-an-alert) to set up alerts. 2. *Slack Integration:* Configure the Komiser webhook integration to send alerts to a Slack channel. Reference the [Slack Integration section](#slack-integration) for guidance. ### Use Case 5: Custom Script Execution diff --git a/docs/images/alert-example.png b/docs/images/alert-example.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb137909ce2928753ca2202436a2355ddcc4dce GIT binary patch literal 26230 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

a$tHuB_=L|PnigN5*`rj2fi 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∫D|T@$fwC?|+Vf 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 YFmZ4Pmi5Ca6y#4D2onGHTJPh30e#Q-dH?_b literal 0 HcmV?d00001 From 237dd7646f2a838557d587ceea5b349855bf5d7e Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Tue, 19 Sep 2023 21:52:26 +0300 Subject: [PATCH 119/191] feat: expose is_onboarded and get cloud_accounts endpoints --- cmd/start.go | 2 + handlers/accounts_handler.go | 43 +++++++++++ internal/api/v1/endpoints.go | 3 + internal/config/load.go | 135 +++++++++++++++++++++++++++++++++-- internal/internal.go | 18 ++++- models/account.go | 8 +++ 6 files changed, 199 insertions(+), 10 deletions(-) create mode 100644 handlers/accounts_handler.go create mode 100644 models/account.go diff --git a/cmd/start.go b/cmd/start.go index 830d6ed75..4f3f2a57a 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -2,6 +2,7 @@ package cmd import ( "errors" + "fmt" "time" "github.com/getsentry/sentry-go" @@ -61,6 +62,7 @@ var startCmd = &cobra.Command{ err = internal.Exec(address, port, file, telemetry, analytics, regions, cmd) if err != nil { + fmt.Println(err) return err } diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go new file mode 100644 index 000000000..da814aa70 --- /dev/null +++ b/handlers/accounts_handler.go @@ -0,0 +1,43 @@ +package handlers + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/sirupsen/logrus" + "github.com/tailwarden/komiser/models" +) + +func (handler *ApiHandler) IsOnboardedHandler(c *gin.Context) { + output := struct { + Onboarded bool `json:"onboarded"` + }{ + Onboarded: false, + } + + accounts := make([]models.Account, 0) + err := handler.db.NewRaw("SELECT * FROM accounts").Scan(handler.ctx, &accounts) + if err != nil { + logrus.WithError(err).Error("scan failed") + c.JSON(http.StatusInternalServerError, gin.H{"error": "scan failed"}) + return + } + + if len(accounts) > 0 { + output.Onboarded = true + } + + c.JSON(http.StatusOK, output) +} + +func (handler *ApiHandler) ListCloudAccountsHandler(c *gin.Context) { + accounts := make([]models.Account, 0) + err := handler.db.NewRaw("SELECT * FROM accounts").Scan(handler.ctx, &accounts) + if err != nil { + logrus.WithError(err).Error("scan failed") + c.JSON(http.StatusInternalServerError, gin.H{"error": "scan failed"}) + return + } + + c.JSON(http.StatusOK, accounts) +} diff --git a/internal/api/v1/endpoints.go b/internal/api/v1/endpoints.go index 74c5239df..edd201c96 100644 --- a/internal/api/v1/endpoints.go +++ b/internal/api/v1/endpoints.go @@ -56,6 +56,9 @@ func Endpoints(ctx context.Context, telemetry bool, analytics utils.Analytics, d router.POST("/alerts/test", api.TestEndpointHandler) router.GET("/telemetry", api.TelemetryHandler) + router.GET("/is_onboarded", api.IsOnboardedHandler) + + router.GET("/cloud_accounts", api.ListCloudAccountsHandler) router.NoRoute(gin.WrapH(http.FileServer(assetFS()))) diff --git a/internal/config/load.go b/internal/config/load.go index e0183cb89..feaee4d56 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -9,6 +9,7 @@ import ( "net/http" "os" "path/filepath" + "strings" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/BurntSushi/toml" @@ -19,6 +20,7 @@ import ( "github.com/mongodb-forks/digest" "github.com/oracle/oci-go-sdk/common" "github.com/scaleway/scaleway-sdk-go/scw" + "github.com/tailwarden/komiser/models" . "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" "github.com/tailwarden/komiser/utils" @@ -26,6 +28,7 @@ import ( "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/regions" tccvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312" + "github.com/uptrace/bun" "go.mongodb.org/atlas/mongodbatlas" "golang.org/x/oauth2" "golang.org/x/oauth2/google" @@ -62,27 +65,39 @@ func loadConfigFromBytes(b []byte) (*Config, error) { return &config, nil } -func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config, []providers.ProviderClient, error) { +func Load(configPath string, telemetry bool, analytics utils.Analytics, db *bun.DB) (*Config, []providers.ProviderClient, []models.Account, error) { config, err := loadConfigFromFile(configPath) if err != nil { - return nil, nil, err + return nil, nil, nil, err } if len(config.SQLite.File) == 0 && config.Postgres.URI == "" { - return nil, nil, errors.New("postgres URI or sqlite file is missing") + return nil, nil, nil, errors.New("postgres URI or sqlite file is missing") } clients := make([]providers.ProviderClient, 0) + accounts := make([]models.Account, 0) if len(config.AWS) > 0 { for _, account := range config.AWS { + cloudAccount := models.Account{ + Provider: "AWS", + Name: account.Name, + Credentials: map[string]string{ + "profile": account.Profile, + "path": account.Path, + "source": account.Source, + }, + } + accounts = append(accounts, cloudAccount) + if account.Source == "CREDENTIALS_FILE" { if len(account.Path) > 0 { cfg, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfig.WithSharedConfigProfile(account.Profile), awsConfig.WithSharedCredentialsFiles( []string{account.Path}, )) if err != nil { - return nil, nil, err + return nil, nil, nil, err } clients = append(clients, providers.ProviderClient{ AWSClient: &cfg, @@ -91,7 +106,7 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config } else { cfg, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfig.WithSharedConfigProfile(account.Profile)) if err != nil { - return nil, nil, err + return nil, nil, nil, err } clients = append(clients, providers.ProviderClient{ AWSClient: &cfg, @@ -119,6 +134,15 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config if len(config.DigitalOcean) > 0 { for _, account := range config.DigitalOcean { + cloudAccount := models.Account{ + Provider: "DigitalOcean", + Name: account.Name, + Credentials: map[string]string{ + "token": account.Token, + }, + } + accounts = append(accounts, cloudAccount) + client := godo.NewFromToken(account.Token) clients = append(clients, providers.ProviderClient{ DigitalOceanClient: client, @@ -135,6 +159,16 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config if len(config.Oci) > 0 { for _, account := range config.Oci { + cloudAccount := models.Account{ + Provider: "OCI", + Name: account.Name, + Credentials: map[string]string{ + "profile": account.Profile, + "source": account.Source, + }, + } + accounts = append(accounts, cloudAccount) + if account.Source == "CREDENTIALS_FILE" { client := common.DefaultConfigProvider() clients = append(clients, providers.ProviderClient{ @@ -153,6 +187,15 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config if len(config.Civo) > 0 { for _, account := range config.Civo { + cloudAccount := models.Account{ + Provider: "Civo", + Name: account.Name, + Credentials: map[string]string{ + "token": account.Token, + }, + } + accounts = append(accounts, cloudAccount) + client, err := civogo.NewClient(account.Token, "LON1") if err != nil { log.Fatal(err) @@ -172,6 +215,17 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config if len(config.Kubernetes) > 0 { for _, account := range config.Kubernetes { + cloudAccount := models.Account{ + Provider: "Kubernetes", + Name: account.Name, + Credentials: map[string]string{ + "path": account.Path, + "contexts": strings.Join(account.Contexts, ";"), + }, + } + + accounts = append(accounts, cloudAccount) + kubeConfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( &clientcmd.ClientConfigLoadingRules{ExplicitPath: account.Path}, &clientcmd.ConfigOverrides{}).ClientConfig() @@ -199,6 +253,16 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config if len(config.Linode) > 0 { for _, account := range config.Linode { + cloudAccount := models.Account{ + Provider: "Linode", + Name: account.Name, + Credentials: map[string]string{ + "token": account.Token, + }, + } + + accounts = append(accounts, cloudAccount) + tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: account.Token}) oauth2Client := &http.Client{ Transport: &oauth2.Transport{ @@ -222,6 +286,17 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config if len(config.Tencent) > 0 { for _, account := range config.Tencent { + cloudAccount := models.Account{ + Provider: "Tencent", + Name: account.Name, + Credentials: map[string]string{ + "secretId": account.SecretID, + "secretKey": account.SecretKey, + }, + } + + accounts = append(accounts, cloudAccount) + credential := tccommon.NewCredential(account.SecretID, account.SecretKey) cpf := profile.NewClientProfile() cpf.Language = "en-US" @@ -245,6 +320,19 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config if len(config.Azure) > 0 { for _, account := range config.Azure { + cloudAccount := models.Account{ + Provider: "Azure", + Name: account.Name, + Credentials: map[string]string{ + "clientId": account.ClientId, + "clientSecret": account.ClientSecret, + "tenantId": account.TenantId, + "subscriptionId": account.SubscriptionId, + }, + } + + accounts = append(accounts, cloudAccount) + creds, err := azidentity.NewClientSecretCredential(account.TenantId, account.ClientId, account.ClientSecret, &azidentity.ClientSecretCredentialOptions{}) if err != nil { log.Fatal(err) @@ -270,6 +358,18 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config if len(config.Scaleway) > 0 { for _, account := range config.Scaleway { + cloudAccount := models.Account{ + Provider: "Scaleway", + Name: account.Name, + Credentials: map[string]string{ + "accessKey": account.AccessKey, + "secretKey": account.SecretKey, + "organizationId": account.OrganizationId, + }, + } + + accounts = append(accounts, cloudAccount) + client, err := scw.NewClient( scw.WithDefaultOrganizationID(account.OrganizationId), scw.WithAuth(account.AccessKey, account.SecretKey), @@ -293,6 +393,18 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config if len(config.MongoDBAtlas) > 0 { for _, account := range config.MongoDBAtlas { + cloudAccount := models.Account{ + Provider: "MongoDB", + Name: account.Name, + Credentials: map[string]string{ + "publicKey": account.PublicApiKey, + "privateKey": account.PrivateApiKey, + "organizationId": account.OrganizationID, + }, + } + + accounts = append(accounts, cloudAccount) + t := digest.NewTransport(account.PublicApiKey, account.PrivateApiKey) tc, err := t.Client() if err != nil { @@ -308,8 +420,17 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config } if len(config.GCP) > 0 { - // Initialize a GCP client for _, account := range config.GCP { + cloudAccount := models.Account{ + Provider: "GCP", + Name: account.Name, + Credentials: map[string]string{ + "accountKey": account.ServiceAccountKeyPath, + }, + } + + accounts = append(accounts, cloudAccount) + data, err := ioutil.ReadFile(account.ServiceAccountKeyPath) if err != nil { log.Fatal(err) @@ -329,5 +450,5 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics) (*Config } } - return config, clients, nil + return config, clients, accounts, nil } diff --git a/internal/internal.go b/internal/internal.go index 236cd8ba2..eb0c7240f 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -61,12 +61,12 @@ func Exec(address string, port int, configPath string, telemetry bool, a utils.A ctx := context.Background() - cfg, clients, err := config.Load(configPath, telemetry, analytics) + cfg, clients, accounts, err := config.Load(configPath, telemetry, analytics, db) if err != nil { return err } - err = setupSchema(cfg) + err = setupSchema(cfg, accounts) if err != nil { return err } @@ -179,7 +179,7 @@ func runServer(address string, port int, telemetry bool, cfg models.Config) erro return nil } -func setupSchema(c *models.Config) error { +func setupSchema(c *models.Config, accounts []models.Account) error { var sqldb *sql.DB var err error @@ -216,6 +216,18 @@ func setupSchema(c *models.Config) error { return err } + _, err = db.NewCreateTable().Model((*models.Account)(nil)).IfNotExists().Exec(context.Background()) + if err != nil { + return err + } + + for _, account := range accounts { + _, err = db.NewInsert().Model(&account).Exec(context.Background()) + if err != nil { + log.Warnf("%s account cannot be inserted to database", account.Provider) + } + } + // Created pre-defined views untaggedResourcesView := models.View{ Name: "Untagged resources", diff --git a/models/account.go b/models/account.go new file mode 100644 index 000000000..4a05c7d50 --- /dev/null +++ b/models/account.go @@ -0,0 +1,8 @@ +package models + +type Account struct { + Id int64 `json:"id" bun:"id,pk,autoincrement"` + Provider string `json:"provider"` + Name string `json:"name"` + Credentials map[string]string `json:"credentials" bun:"credentials,unique"` +} From 70af728370d3c66d2756783105a26da5164d08c8 Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Wed, 20 Sep 2023 09:12:40 +0300 Subject: [PATCH 120/191] feat: expose new cloud account endpoint --- .../onboarding-wizard/DatabasePurplin.tsx | 2 +- .../onboarding-wizard/PurplinCloud.tsx | 2 +- .../onboarding-wizard/SelectInput.tsx | 10 +++---- dashboard/components/select/Select.tsx | 2 +- dashboard/pages/cloud-accounts.tsx | 4 +-- dashboard/pages/onboarding/choose-cloud.tsx | 2 +- handlers/accounts_handler.go | 30 +++++++++++++++++++ internal/api/v1/endpoints.go | 1 + 8 files changed, 42 insertions(+), 11 deletions(-) diff --git a/dashboard/components/onboarding-wizard/DatabasePurplin.tsx b/dashboard/components/onboarding-wizard/DatabasePurplin.tsx index 55f6ade5f..f81391554 100644 --- a/dashboard/components/onboarding-wizard/DatabasePurplin.tsx +++ b/dashboard/components/onboarding-wizard/DatabasePurplin.tsx @@ -7,7 +7,7 @@ interface DatabasePurplinProps { function DatabasePurplin({ database }: DatabasePurplinProps) { return (

-
+
-
+
{`${provider}
{icon}
@@ -49,7 +49,7 @@ function SelectInput({ { 'outline-2 outline-primary': isOpen } )} > -
+
{displayValues[index].icon && displayValues[index].icon} {displayValues[index].label}
@@ -61,7 +61,7 @@ function SelectInput({ onClick={toggle} className="fixed inset-0 z-20 hidden animate-fade-in bg-transparent opacity-0 sm:block" >
-
+
{values.map((item, idx) => { const isActive = value === item; @@ -69,7 +69,7 @@ function SelectInput({
-
+
{values.map((item, idx) => { const isActive = value === item; diff --git a/dashboard/pages/cloud-accounts.tsx b/dashboard/pages/cloud-accounts.tsx index a984703be..acbe5fd4e 100644 --- a/dashboard/pages/cloud-accounts.tsx +++ b/dashboard/pages/cloud-accounts.tsx @@ -51,7 +51,7 @@ function CloudAccounts() {
{status.state} -
+
{status.message}
diff --git a/dashboard/pages/onboarding/choose-cloud.tsx b/dashboard/pages/onboarding/choose-cloud.tsx index 07f2992da..c57b9217e 100644 --- a/dashboard/pages/onboarding/choose-cloud.tsx +++ b/dashboard/pages/onboarding/choose-cloud.tsx @@ -92,7 +92,7 @@ export default function ChooseCloud() { width={500} height={120} /> -
+
{`${provider} Date: Wed, 20 Sep 2023 09:14:19 +0300 Subject: [PATCH 121/191] feat: expose delete cloud account endpoint --- handlers/accounts_handler.go | 13 +++++++++++++ internal/api/v1/endpoints.go | 1 + 2 files changed, 14 insertions(+) diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index d68a3370b..2d9ece821 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -71,3 +71,16 @@ func (handler *ApiHandler) NewCloudAccountHandler(c *gin.Context) { c.JSON(http.StatusCreated, account) } + +func (handler *ApiHandler) DeleteCloudAccountHandler(c *gin.Context) { + accountId := c.Param("id") + + account := new(models.Account) + _, err := handler.db.NewDelete().Model(account).Where("id = ?", accountId).Exec(handler.ctx) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{"message": "account has been deleted"}) +} diff --git a/internal/api/v1/endpoints.go b/internal/api/v1/endpoints.go index e878c5b26..dde45a700 100644 --- a/internal/api/v1/endpoints.go +++ b/internal/api/v1/endpoints.go @@ -60,6 +60,7 @@ func Endpoints(ctx context.Context, telemetry bool, analytics utils.Analytics, d router.GET("/cloud_accounts", api.ListCloudAccountsHandler) router.POST("/cloud_accounts", api.NewCloudAccountHandler) + router.DELETE("/cloud_accounts/:id", api.DeleteCloudAccountHandler) router.NoRoute(gin.WrapH(http.FileServer(assetFS()))) From db94739983ecac1e4721ef6311aaf717a92ec129 Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Wed, 20 Sep 2023 09:16:17 +0300 Subject: [PATCH 122/191] feat: expose update cloud account endpoint --- handlers/accounts_handler.go | 19 +++++++++++++++++++ internal/api/v1/endpoints.go | 1 + 2 files changed, 20 insertions(+) diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index 2d9ece821..936b842ab 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -84,3 +84,22 @@ func (handler *ApiHandler) DeleteCloudAccountHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "account has been deleted"}) } + +func (handler *ApiHandler) UpdateCloudAccountHandler(c *gin.Context) { + accountId := c.Param("id") + + var account models.Account + err := json.NewDecoder(c.Request.Body).Decode(&account) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + _, err = handler.db.NewUpdate().Model(&account).Column("name", "provider", "credentials").Where("id = ?", accountId).Exec(handler.ctx) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, alert) +} diff --git a/internal/api/v1/endpoints.go b/internal/api/v1/endpoints.go index dde45a700..f29f4b106 100644 --- a/internal/api/v1/endpoints.go +++ b/internal/api/v1/endpoints.go @@ -61,6 +61,7 @@ func Endpoints(ctx context.Context, telemetry bool, analytics utils.Analytics, d router.GET("/cloud_accounts", api.ListCloudAccountsHandler) router.POST("/cloud_accounts", api.NewCloudAccountHandler) router.DELETE("/cloud_accounts/:id", api.DeleteCloudAccountHandler) + router.PUT("/cloud_accounts/:id", api.UpdateCloudAccountHandler) router.NoRoute(gin.WrapH(http.FileServer(assetFS()))) From 6c2461ef891fb04ef806e460d5322707095742c6 Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Wed, 20 Sep 2023 09:17:30 +0300 Subject: [PATCH 123/191] fix: remove debug logs --- cmd/start.go | 2 -- handlers/accounts_handler.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/start.go b/cmd/start.go index 4f3f2a57a..830d6ed75 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -2,7 +2,6 @@ package cmd import ( "errors" - "fmt" "time" "github.com/getsentry/sentry-go" @@ -62,7 +61,6 @@ var startCmd = &cobra.Command{ err = internal.Exec(address, port, file, telemetry, analytics, regions, cmd) if err != nil { - fmt.Println(err) return err } diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index 936b842ab..a046468c4 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -101,5 +101,5 @@ func (handler *ApiHandler) UpdateCloudAccountHandler(c *gin.Context) { return } - c.JSON(http.StatusOK, alert) + c.JSON(http.StatusOK, account) } From e1b954adf080a5ddde93bdc4289fd0d0f5b2cef5 Mon Sep 17 00:00:00 2001 From: jakepage91 Date: Wed, 20 Sep 2023 10:55:27 +0100 Subject: [PATCH 124/191] introduction list still required fixes --- docs/getting-started/introduction.mdx | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/getting-started/introduction.mdx b/docs/getting-started/introduction.mdx index 440a4d520..9f4737750 100644 --- a/docs/getting-started/introduction.mdx +++ b/docs/getting-started/introduction.mdx @@ -24,25 +24,27 @@ To start using Komiser, you'll need to install the Komiser Command-Line Interfac Komiser is compatible with various cloud providers and deployment methods. Explore the installation steps for your preferred cloud provider from the list below: -[AWS](/cloud-providers/aws) +[AWS](/configuration/cloud-providers/aws) -[Azure](/cloud-providers/azure) +[Azure](/configuration/cloud-providers/azure) -[Civo](/cloud-providers/civo) +[GCP](/configuration/cloud-providers/gcp) -[DigitalOcean](/cloud-providers/digital-ocean) +[Civo](/configuration/cloud-providers/civo) -[Kubernetes](/cloud-providers/kubernetes) +[DigitalOcean](/configuration/cloud-providers/digital-ocean) -[Linode](/cloud-providers/linode) +[Kubernetes](/configuration/cloud-providers/k8s) -[MongoDB Atlas](/cloud-providers/mongodb-atlas) +[Linode](/configuration/cloud-providers/linode) -[OCI](/cloud-providers/oci) +[MongoDB Atlas](/configuration/cloud-providers/mongodb-atlas) -[Scaleway](/cloud-providers/scaleway) +[OCI](/configuration/cloud-providers/oracle) -[Tencent](/cloud-providers/tencent) +[Scaleway](/configuration/cloud-providers/scaleway) + +[Tencent](/configuration/cloud-providers/tencent) ## Contributing From 1ea3efcddde554f5612b2ddb510b0cd3cca03083 Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Wed, 20 Sep 2023 13:02:23 +0300 Subject: [PATCH 125/191] feat: expose config database endpoint --- handlers/accounts_handler.go | 42 ++++++++++++++++++++++++++++++++++++ internal/api/v1/endpoints.go | 2 ++ models/database.go | 10 +++++++++ 3 files changed, 54 insertions(+) create mode 100644 models/database.go diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index a046468c4..f93739b78 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -2,12 +2,20 @@ package handlers import ( "context" + "database/sql" "encoding/json" + "fmt" + "log" "net/http" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" + "github.com/uptrace/bun" + "github.com/uptrace/bun/dialect/pgdialect" + "github.com/uptrace/bun/dialect/sqlitedialect" + "github.com/uptrace/bun/driver/pgdriver" + "github.com/uptrace/bun/driver/sqliteshim" ) func (handler *ApiHandler) IsOnboardedHandler(c *gin.Context) { @@ -17,6 +25,10 @@ func (handler *ApiHandler) IsOnboardedHandler(c *gin.Context) { Onboarded: false, } + if handler.db != nil { + c.JSON(http.StatusOK, output) + } + accounts := make([]models.Account, 0) err := handler.db.NewRaw("SELECT * FROM accounts").Scan(handler.ctx, &accounts) if err != nil { @@ -103,3 +115,33 @@ func (handler *ApiHandler) UpdateCloudAccountHandler(c *gin.Context) { c.JSON(http.StatusOK, account) } + +func (handler *ApiHandler) ConfigureDatabaseHandler(c *gin.Context) { + var db models.DatabaseConfig + err := json.NewDecoder(c.Request.Body).Decode(&db) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + if db.Type == "SQLITE" { + sqldb, err := sql.Open(sqliteshim.ShimName, fmt.Sprintf("file:%s?cache=shared", db.File)) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + sqldb.SetMaxIdleConns(1000) + sqldb.SetConnMaxLifetime(0) + + handler.db = bun.NewDB(sqldb, sqlitedialect.New()) + log.Println("Data will be stored in SQLite") + } else { + uri := fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=disable", db.Username, db.Password, db.Hostname, db.Database) + sqldb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(uri))) + handler.db = bun.NewDB(sqldb, pgdialect.New()) + + log.Println("Data will be stored in PostgreSQL") + } + + c.JSON(http.StatusOK, map[string]string{"message": "database has been configured"}) +} diff --git a/internal/api/v1/endpoints.go b/internal/api/v1/endpoints.go index f29f4b106..679c5fbe9 100644 --- a/internal/api/v1/endpoints.go +++ b/internal/api/v1/endpoints.go @@ -63,6 +63,8 @@ func Endpoints(ctx context.Context, telemetry bool, analytics utils.Analytics, d router.DELETE("/cloud_accounts/:id", api.DeleteCloudAccountHandler) router.PUT("/cloud_accounts/:id", api.UpdateCloudAccountHandler) + router.POST("/databases", api.ConfigureDatabaseHandler) + router.NoRoute(gin.WrapH(http.FileServer(assetFS()))) return router diff --git a/models/database.go b/models/database.go new file mode 100644 index 000000000..528b9c98c --- /dev/null +++ b/models/database.go @@ -0,0 +1,10 @@ +package models + +type DatabaseConfig struct { + Type string `json:"type"` + Hostname string `json:"hostname"` + Database string `json:"database"` + Username string `json:"username"` + Password string `json:"password"` + File string `json:"file"` +} From 5473f760f043fa8b8950ca7860d7b15c14896c65 Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Wed, 20 Sep 2023 14:52:03 +0300 Subject: [PATCH 126/191] feat: expose status & resources attributes --- handlers/accounts_handler.go | 16 ++++++++++++++++ internal/internal.go | 1 + models/account.go | 2 ++ 3 files changed, 19 insertions(+) diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index f93739b78..849902710 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -53,6 +53,22 @@ func (handler *ApiHandler) ListCloudAccountsHandler(c *gin.Context) { return } + for i, account := range accounts { + output := struct { + Total int `bun:"total" json:"total"` + }{} + err = handler.db.NewRaw(fmt.Sprintf("SELECT COUNT(*) as total FROM resources WHERE provider='%s' AND account='%s'", account.Provider, account.Name)).Scan(handler.ctx, &output) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "scan failed"}) + return + } + accounts[i].Resources = output.Total + + if account.Status == "" { + accounts[i].Status = "CONNECTED" + } + } + c.JSON(http.StatusOK, accounts) } diff --git a/internal/internal.go b/internal/internal.go index eb0c7240f..7ce285c3f 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -222,6 +222,7 @@ func setupSchema(c *models.Config, accounts []models.Account) error { } for _, account := range accounts { + account.Status = "CONNECTED" _, err = db.NewInsert().Model(&account).Exec(context.Background()) if err != nil { log.Warnf("%s account cannot be inserted to database", account.Provider) diff --git a/models/account.go b/models/account.go index 4a05c7d50..3b0e8967a 100644 --- a/models/account.go +++ b/models/account.go @@ -5,4 +5,6 @@ type Account struct { Provider string `json:"provider"` Name string `json:"name"` Credentials map[string]string `json:"credentials" bun:"credentials,unique"` + Status string `json:"status"` + Resources int `json:"resources" bun:",scanonly"` } From bce744e2a56db24cf114738de0ae8d8a71577f89 Mon Sep 17 00:00:00 2001 From: Azanul Date: Thu, 21 Sep 2023 20:36:28 +0530 Subject: [PATCH 127/191] BigQuery table cost calculation Signed-off-by: Azanul --- providers/gcp/bigquery/tables.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/providers/gcp/bigquery/tables.go b/providers/gcp/bigquery/tables.go index 27695772c..08f669a65 100644 --- a/providers/gcp/bigquery/tables.go +++ b/providers/gcp/bigquery/tables.go @@ -13,6 +13,27 @@ import ( "google.golang.org/api/option" ) +const ( + ACTIVE_STORAGE = "ACTIVE" + LONGTERM_STORAGE = "LONGTERM" +) + +func getTableStorageClass(meta *bigquery.TableMetadata) string { + activeThreshold := time.Now().AddDate(0, 0, -90) + lastModified := meta.LastModifiedTime + if lastModified.After(activeThreshold) { + return ACTIVE_STORAGE + } + return LONGTERM_STORAGE +} + +func getStoragePricingForBigQueryTable() map[string]float64 { + return map[string]float64{ + ACTIVE_STORAGE: 0.02, + LONGTERM_STORAGE: 0.01, + } +} + func Tables(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { resources := make([]models.Resource, 0) @@ -59,6 +80,9 @@ func Tables(ctx context.Context, client providers.ProviderClient) ([]models.Reso }) } + storageClass := getTableStorageClass(tableMetadata) + monthlyCost := float64(tableMetadata.NumBytes) / (1024 * 1024 * 1024) * getStoragePricingForBigQueryTable()[storageClass] + resources = append(resources, models.Resource{ Provider: "GCP", Account: client.Name, @@ -68,6 +92,7 @@ func Tables(ctx context.Context, client providers.ProviderClient) ([]models.Reso Name: tableMetadata.Name, FetchedAt: time.Now(), Tags: tags, + Cost: monthlyCost, Link: fmt.Sprintf("https://console.cloud.google.com/bigquery?project=%s&page=dataset&p=%s&d=%s", client.GCPClient.Credentials.ProjectID, client.GCPClient.Credentials.ProjectID, dataset.DatasetID), }) } From bb42342f0dc54d9fa7bc500db142fdfdbf1dec25 Mon Sep 17 00:00:00 2001 From: greghub Date: Thu, 21 Sep 2023 12:50:35 +0200 Subject: [PATCH 128/191] feat: allow user to manage existing cloud accounts from dashboard --- .../account-details/AwsAccountDetails.tsx | 184 ++++++++++++++++ .../components/CloudAccountDeleteContents.tsx | 78 +++++++ .../components/CloudAccountStatus.tsx | 23 ++ .../components/CloudAccountsSidePanel.tsx | 202 ++++++++++++++++++ .../hooks/useCloudAccounts/useCloudAccount.ts | 78 +++++++ .../useCloudAccounts/useCloudAccount.tsx | 58 ----- .../onboarding-wizard/LabelledInput.tsx | 7 +- dashboard/components/sidepanel/Sidepanel.tsx | 2 +- dashboard/pages/cloud-accounts.tsx | 120 ++++------- dashboard/pages/onboarding/provider/aws.tsx | 148 ++----------- dashboard/services/settingsService.ts | 36 ++++ 11 files changed, 669 insertions(+), 267 deletions(-) create mode 100644 dashboard/components/account-details/AwsAccountDetails.tsx create mode 100644 dashboard/components/cloud-account/components/CloudAccountDeleteContents.tsx create mode 100644 dashboard/components/cloud-account/components/CloudAccountStatus.tsx create mode 100644 dashboard/components/cloud-account/components/CloudAccountsSidePanel.tsx create mode 100644 dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.ts delete mode 100644 dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.tsx diff --git a/dashboard/components/account-details/AwsAccountDetails.tsx b/dashboard/components/account-details/AwsAccountDetails.tsx new file mode 100644 index 000000000..146bb808e --- /dev/null +++ b/dashboard/components/account-details/AwsAccountDetails.tsx @@ -0,0 +1,184 @@ +import { ChangeEvent, ReactNode, useRef, useState } from 'react'; +import Folder2Icon from '../icons/Folder2Icon'; +import SelectInput from '../onboarding-wizard/SelectInput'; +import LabelledInput from '../onboarding-wizard/LabelledInput'; +import InputFileSelect from '../onboarding-wizard/InputFileSelect'; +import KeyIcon from '../icons/KeyIcon'; +import VariableIcon from '../icons/VariableIcon'; +import DocumentTextIcon from '../icons/DocumentTextIcon'; +import ShieldSecurityIcon from '../icons/ShieldSecurityIcon'; +import { CloudAccount } from '../cloud-account/hooks/useCloudAccounts/useCloudAccount'; + +interface SelectOptions { + icon: ReactNode; + label: string; + value: string; +} + +interface AwsAccountDetailsProps { + cloudAccountData: CloudAccount; + setCloudAccountData: (formData: CloudAccount) => void; +} + +const options: SelectOptions[] = [ + { + icon: , + label: 'Credentials File', + value: 'credentials-file' + }, + { + icon: , + label: 'Credentials keys', + value: 'credentials-keys' + }, + { + icon: , + label: 'Environment Variables', + value: 'environment-variables' + }, + { + icon: , + label: 'IAM Instance Role', + value: 'iam-instance-role' + } +]; + +function AwsAccountDetails({ + cloudAccountData, + setCloudAccountData +}: AwsAccountDetailsProps) { + const [credentialType, setCredentialType] = useState( + options.find(option => option.value === cloudAccountData.credentials.source) + ?.value ?? options[0].value + ); + + const fileInputRef = useRef(null); + const handleButtonClick = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); + } + }; + + function handleNameChange(event: ChangeEvent) { + setCloudAccountData({ + ...cloudAccountData, + name: event?.target.value + }); + } + + function handleSelectChange(newValue: string) { + setCredentialType(newValue); + + setCloudAccountData({ + ...cloudAccountData, + credentials: { + ...cloudAccountData.credentials, + source: newValue + } + }); + } + + function handleProfileChange(event: ChangeEvent) { + setCloudAccountData({ + ...cloudAccountData, + credentials: { + ...cloudAccountData.credentials, + profile: event?.target.value + } + }); + } + + const handleFileChange = (event: ChangeEvent) => { + const file = event.target.files?.[0]; + + if (!file) return; + + setCloudAccountData({ + ...cloudAccountData, + credentials: { + ...cloudAccountData.credentials, + path: file.name + } + }); + }; + + return ( +
+ + +
+
+ option.value)} + /> + {[options[2].value, options[3].value].includes(credentialType) && ( +
+ {credentialType === options[3].value + ? 'Komiser will fetch the credentials from AWS' + : 'Komiser will load credentials from AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.'} +
+ )} +
+ + {credentialType === options[0].value && ( +
+ } + subLabel="Enter the path or browse the file" + placeholder="C:\Documents\Komiser\credentials" + fileInputRef={fileInputRef} + iconClick={handleButtonClick} + handleFileChange={handleFileChange} + value={cloudAccountData.credentials.path} + /> + +
+ )} + + {credentialType === options[1].value && ( +
+ + +
+ )} +
+
+ ); +} + +export default AwsAccountDetails; diff --git a/dashboard/components/cloud-account/components/CloudAccountDeleteContents.tsx b/dashboard/components/cloud-account/components/CloudAccountDeleteContents.tsx new file mode 100644 index 000000000..f0168966a --- /dev/null +++ b/dashboard/components/cloud-account/components/CloudAccountDeleteContents.tsx @@ -0,0 +1,78 @@ +import { useState } from 'react'; +import AlertCircleIcon from '../../icons/AlertCircleIcon'; +import Button from '../../button/Button'; +import { CloudAccount } from '../hooks/useCloudAccounts/useCloudAccount'; +import settingsService from '../../../services/settingsService'; +import { ToastProps } from '../../toast/hooks/useToast'; + +interface CloudAccountDeleteContentsProps { + cloudAccount: CloudAccount; + onCancel: () => void; + setToast: (toast: ToastProps) => void; +} + +function CloudAccountDeleteContents({ + cloudAccount, + onCancel, + setToast +}: CloudAccountDeleteContentsProps) { + const [loading, setLoading] = useState(false); + + const deleteCloudAccount = () => { + if (!cloudAccount.id) return false; + + setLoading(true); + + settingsService.deleteCloudAccount(cloudAccount.id).then(res => { + setLoading(false); + if (res === Error) { + setToast({ + hasError: true, + title: 'Cloud account was not deleted', + message: + 'There was an error deleting this cloud account. Please try again.' + }); + } else { + setToast({ + hasError: false, + title: 'Cloud account deleted', + message: `The cloud account was successfully deleted!` + }); + } + }); + + return true; + }; + + return ( + <> +
+ +

+ Are you sure you want to +
+ remove this cloud account? +

+

+ All related data (like custom views and tags) will be deleted +
+ and the {cloudAccount.name} account will be disconnected from Komiser. +

+
+
+ + +
+ + ); +} + +export default CloudAccountDeleteContents; diff --git a/dashboard/components/cloud-account/components/CloudAccountStatus.tsx b/dashboard/components/cloud-account/components/CloudAccountStatus.tsx new file mode 100644 index 000000000..9cd078a5f --- /dev/null +++ b/dashboard/components/cloud-account/components/CloudAccountStatus.tsx @@ -0,0 +1,23 @@ +import classNames from 'classnames'; +import { CloudAccount } from '../hooks/useCloudAccounts/useCloudAccount'; + +function CloudAccountStatus({ status }: { status: CloudAccount['status'] }) { + if (!status) return null; + + return ( +
+ {status.charAt(0) + status.slice(1).toLocaleLowerCase()} +
+ ); +} + +export default CloudAccountStatus; diff --git a/dashboard/components/cloud-account/components/CloudAccountsSidePanel.tsx b/dashboard/components/cloud-account/components/CloudAccountsSidePanel.tsx new file mode 100644 index 000000000..586cdb412 --- /dev/null +++ b/dashboard/components/cloud-account/components/CloudAccountsSidePanel.tsx @@ -0,0 +1,202 @@ +import { useState } from 'react'; +import providers from '../../../utils/providerHelper'; +import AwsAccountDetails from '../../account-details/AwsAccountDetails'; +import Button from '../../button/Button'; +import Sidepanel from '../../sidepanel/Sidepanel'; +import SidepanelTabs from '../../sidepanel/SidepanelTabs'; +import CloudAccountStatus from './CloudAccountStatus'; +import CloudAccountDeleteContents from './CloudAccountDeleteContents'; +import { + CloudAccount, + CloudAccountsPage +} from '../hooks/useCloudAccounts/useCloudAccount'; +import { ToastProps } from '../../toast/hooks/useToast'; +import settingsService from '../../../services/settingsService'; + +interface CloudAccountsSidePanelProps { + isOpen: boolean; + closeModal: () => void; + cloudAccount: CloudAccount; + cloudAccounts: CloudAccount[]; + setCloudAccounts: (cloudAccounts: CloudAccount[]) => void; + page: CloudAccountsPage; + goTo: (page: CloudAccountsPage) => void; + setToast: (toast: ToastProps) => void; +} + +function CloudAccountsSidePanel({ + isOpen, + closeModal, + cloudAccount, + cloudAccounts, + setCloudAccounts, + page, + goTo, + setToast +}: CloudAccountsSidePanelProps) { + const [isDeleteOpen, setIsDeleteOpen] = useState(false); + const [loading, setLoading] = useState(false); + const [cloudAccountData, setCloudAccountData] = + useState(cloudAccount); + + const handleEditCloudAccount = () => { + if (!cloudAccountData.id) return false; + + setLoading(true); + const payloadJson = JSON.stringify(cloudAccountData); + settingsService + .editCloudAccount(cloudAccountData.id, payloadJson) + .then(res => { + if (res === Error || res.error) { + setLoading(false); + setToast({ + hasError: true, + title: 'Cloud account not edited', + message: + 'There was an error editing this cloud account. Refer to the logs and try again.' + }); + } else { + setLoading(false); + setToast({ + hasError: false, + title: 'Cloud account edited', + message: `The cloud account was successfully edited!` + }); + setCloudAccounts( + cloudAccounts.map(c => + c.id === cloudAccountData.id ? cloudAccountData : c + ) + ); + closeModal(); + } + }); + + return true; + }; + + return ( + <> + +
+ {/* Modal headers */} +
+ {cloudAccount && ( +
+ + {cloudAccount.provider} + + +
+
+

+ {cloudAccount.name} +

+ {/* + + + + */} +
+

+ {cloudAccount.resources} resources in this cloud account +

+
+
+ )} + +
+ {!isDeleteOpen && ( + + )} + + +
+
+ + {isDeleteOpen ? ( +
+ setIsDeleteOpen(false)} + setToast={setToast} + /> +
+ ) : ( + <> + {/* Tabs */} + + + {/* Cloud account details */} + + {page === 'cloud account details' && ( + <> +
+ + + + +
+
+
+ + +
+ + )} + + )} +
+
+ + ); +} + +export default CloudAccountsSidePanel; diff --git a/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.ts b/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.ts new file mode 100644 index 000000000..defa9b6b4 --- /dev/null +++ b/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.ts @@ -0,0 +1,78 @@ +import { useEffect, useState } from 'react'; +import { useRouter } from 'next/router'; + +import useToast from '../../../toast/hooks/useToast'; +import { Provider } from '../../../../utils/providerHelper'; +import settingsService from '../../../../services/settingsService'; + +export interface CloudAccount { + credentials: { + path: string; + profile: string; + source: string; + }; + id?: number; + name: string; + provider: Provider; + resources?: number; + status?: 'CONNECTED' | 'INTEGRATION_ISSUE' | 'PERMISSION_ISSUE'; +} + +export type CloudAccountsPage = 'cloud account details'; + +function useCloudAccount() { + const router = useRouter(); + const { toast, setToast, dismissToast } = useToast(); + const [page, setPage] = useState('cloud account details'); + const [cloudAccounts, setCloudAccounts] = useState([]); + const [cloudAccountItem, setCloudAccountItem] = useState(); + const isNotCustomView = !router.query.view; + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + + useEffect(() => { + settingsService.getCloudAccounts().then(res => { + if (!loading) { + setLoading(true); + } + + if (error) { + setError(false); + } + + if (res === Error) { + setLoading(false); + setError(true); + } else { + setLoading(false); + setCloudAccounts(res); + } + }); + }, []); + + function openModal(CloudAccountItem: CloudAccount) { + setCloudAccountItem(CloudAccountItem); + } + + /** Handles the page change inside the modal */ + function goTo(newPage: CloudAccountsPage) { + setPage(newPage); + } + + return { + router, + openModal, + page, + cloudAccountItem, + setCloudAccountItem, + goTo, + toast, + setToast, + dismissToast, + cloudAccounts, + setCloudAccounts, + isNotCustomView + }; +} + +export default useCloudAccount; diff --git a/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.tsx b/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.tsx deleted file mode 100644 index 9371f5bbd..000000000 --- a/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { useState } from 'react'; -import { useRouter } from 'next/router'; - -import useToast from '../../../toast/hooks/useToast'; -import { Provider } from '../../../../utils/providerHelper'; - -interface CloudAccounts { - provider: Provider; - name: string; - status: { - state: 'Connected' | 'Permission Issue' | 'Syncing'; - message: string; - }; -} - -function useCloudAccount() { - const router = useRouter(); - const { toast, dismissToast } = useToast(); - - const [cloudAccounts, setCloudAccounts] = useState>([ - { - provider: 'aws', - name: 'Loudy AWS', - status: { - state: 'Connected', - message: 'Your cloud account is connected.' - } - }, - { - provider: 'azure', - name: 'Loudy Azure', - status: { - state: 'Permission Issue', - message: - "We couldn't fetch EC2, S3 and VPC resources.See more details through the cloud account sidepanel." - } - }, - { - provider: 'gcp', - name: 'Loudy GCP', - status: { - state: 'Syncing', - message: 'Your cloud account data is being fetched by Komiser.' - } - } - ]); - const isNotCustomView = !router.query.view; - - return { - router, - toast, - dismissToast, - cloudAccounts, - isNotCustomView - }; -} - -export default useCloudAccount; diff --git a/dashboard/components/onboarding-wizard/LabelledInput.tsx b/dashboard/components/onboarding-wizard/LabelledInput.tsx index 336b25286..2ac06e60d 100644 --- a/dashboard/components/onboarding-wizard/LabelledInput.tsx +++ b/dashboard/components/onboarding-wizard/LabelledInput.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { ReactNode, ChangeEvent } from 'react'; interface LabelledInputProps { id: string; @@ -9,6 +9,7 @@ interface LabelledInputProps { subLabel?: string; disabled?: boolean; placeholder?: string; + onChange?: (e: ChangeEvent) => void; } function LabelledInput({ @@ -19,7 +20,8 @@ function LabelledInput({ value, subLabel, placeholder, - disabled = false + disabled = false, + onChange }: LabelledInputProps) { return (
@@ -49,6 +51,7 @@ function LabelledInput({ className={`block w-full rounded py-[14.5px] text-sm text-black-900 outline outline-black-200 focus:outline-2 focus:outline-primary ${ icon ? 'pl-10' : 'pl-3' }`} + onChange={onChange} />
diff --git a/dashboard/components/sidepanel/Sidepanel.tsx b/dashboard/components/sidepanel/Sidepanel.tsx index 527c531fa..9daf0cbdf 100644 --- a/dashboard/components/sidepanel/Sidepanel.tsx +++ b/dashboard/components/sidepanel/Sidepanel.tsx @@ -32,7 +32,7 @@ function Sidepanel({ isOpen, closeModal, children, noScroll }: SidepanelProps) { className="fixed inset-0 z-30 hidden animate-fade-in bg-black-900/10 opacity-0 sm:block" >
diff --git a/dashboard/pages/cloud-accounts.tsx b/dashboard/pages/cloud-accounts.tsx index 632f7bfa8..26a871b1a 100644 --- a/dashboard/pages/cloud-accounts.tsx +++ b/dashboard/pages/cloud-accounts.tsx @@ -2,36 +2,41 @@ import Head from 'next/head'; import Image from 'next/image'; import { useEffect, useRef, useState } from 'react'; -import classNames from 'classnames'; - import providers from '../utils/providerHelper'; import Toast from '../components/toast/Toast'; import Modal from '../components/modal/Modal'; -import Button from '../components/button/Button'; import EditIcon from '../components/icons/EditIcon'; import More2Icon from '../components/icons/More2Icon'; import DeleteIcon from '../components/icons/DeleteIcon'; -import AlertCircleIcon from '../components/icons/AlertCircleIcon'; import CloudAccountsHeader from '../components/cloud-account/components/CloudAccountsHeader'; import CloudAccountsLayout from '../components/cloud-account/components/CloudAccountsLayout'; import useCloudAccount from '../components/cloud-account/hooks/useCloudAccounts/useCloudAccount'; +import CloudAccountsSidePanel from '../components/cloud-account/components/CloudAccountsSidePanel'; +import CloudAccountStatus from '../components/cloud-account/components/CloudAccountStatus'; +import CloudAccountDeleteContents from '../components/cloud-account/components/CloudAccountDeleteContents'; function CloudAccounts() { const optionsRef = useRef(null); const [clickedItemId, setClickedItemId] = useState(null); const [editCloudAccount, setEditCloudAccount] = useState(false); - const [removeCloudAccount, setRemoveCloudAccount] = useState<{ - state: boolean; - accountName: string; - }>({ - state: false, - accountName: '' - }); - - const { router, cloudAccounts, toast, dismissToast, isNotCustomView } = - useCloudAccount(); + const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); + + const { + router, + cloudAccounts, + setCloudAccounts, + openModal, + cloudAccountItem, + setCloudAccountItem, + page, + goTo, + toast, + setToast, + dismissToast, + isNotCustomView + } = useCloudAccount(); useEffect(() => { const handleOutsideClick = (event: MouseEvent) => { @@ -60,17 +65,10 @@ function CloudAccounts() { }; const closeRemoveModal = () => { - setRemoveCloudAccount({ - state: false, - accountName: '' - }); + setIsDeleteModalOpen(false); }; - const deleteCloudAccount = () => { - const removalName = removeCloudAccount.accountName; - console.log('deleting', removalName); - // TODO: (onboarding-wizard) handle account removal API call here - }; + if (!cloudAccounts) return null; return ( <> @@ -91,6 +89,7 @@ function CloudAccounts() { return (
openModal(account)} className="relative my-5 flex w-full items-center gap-4 rounded-lg border-2 border-black-170 bg-white p-6 text-black-900 transition-colors" >
-
- {status.state} -
- {status.message} -
-
+ { - setRemoveCloudAccount({ - state: true, - accountName: name - }); + setIsDeleteModalOpen(true); + setCloudAccountItem(account); setClickedItemId(null); }} > @@ -168,41 +149,30 @@ function CloudAccounts() { {/* Delete Modal */} - closeRemoveModal()} - > + closeRemoveModal()}>
-
- -

- Are you sure you want to remove this cloud account? -

-

- All related data (like custom views and tags) will be deleted and - the {removeCloudAccount.accountName} account will be disconnected - from Komiser. -

-
-
- - -
+ {cloudAccountItem && ( + + )}
- {/* Edit Drawer */} - setEditCloudAccount(false)} - > -
Editing
-
Replace this with the drawer
-
+ {cloudAccountItem && ( + setEditCloudAccount(false)} + cloudAccount={cloudAccountItem} + cloudAccounts={cloudAccounts} + setCloudAccounts={setCloudAccounts} + setToast={setToast} + page={page} + goTo={goTo} + /> + )} {/* Toast component */} {toast && } diff --git a/dashboard/pages/onboarding/provider/aws.tsx b/dashboard/pages/onboarding/provider/aws.tsx index 920dc3b7c..0236b64ac 100644 --- a/dashboard/pages/onboarding/provider/aws.tsx +++ b/dashboard/pages/onboarding/provider/aws.tsx @@ -1,82 +1,37 @@ import Head from 'next/head'; import { useRouter } from 'next/router'; -import { ReactNode, useRef, useState } from 'react'; +import { useState } from 'react'; import { allProviders } from '../../../utils/providerHelper'; -import KeyIcon from '../../../components/icons/KeyIcon'; -import Folder2Icon from '../../../components/icons/Folder2Icon'; -import VariableIcon from '../../../components/icons/VariableIcon'; -import DocumentTextIcon from '../../../components/icons/DocumentTextIcon'; -import ShieldSecurityIcon from '../../../components/icons/ShieldSecurityIcon'; - import OnboardingWizardLayout, { LeftSideLayout, RightSideLayout } from '../../../components/onboarding-wizard/OnboardingWizardLayout'; -import SelectInput from '../../../components/onboarding-wizard/SelectInput'; import PurplinCloud from '../../../components/onboarding-wizard/PurplinCloud'; -import LabelledInput from '../../../components/onboarding-wizard/LabelledInput'; -import InputFileSelect from '../../../components/onboarding-wizard/InputFileSelect'; import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; - -interface SelectOptions { - icon: ReactNode; - label: string; - value: string; -} - -const options: SelectOptions[] = [ - { - icon: , - label: 'Credentials File', - value: 'credentials-file' - }, - { - icon: , - label: 'Credentials keys', - value: 'credentials-keys' - }, - { - icon: , - label: 'Environment Variables', - value: 'environment-variables' - }, - { - icon: , - label: 'IAM Instance Role', - value: 'iam-instance-role' - } -]; +import AwsAccountDetails from '../../../components/account-details/AwsAccountDetails'; +import { CloudAccount } from '../../../components/cloud-account/hooks/useCloudAccounts/useCloudAccount'; export default function AWSCredentials() { const provider = allProviders.AWS; + const [cloudAccountData, setCloudAccountData] = useState({ + credentials: { + path: '', + profile: '', + source: '' + }, + name: '', + provider: 'aws' + }); + const router = useRouter(); - const [credentialType, setCredentialType] = useState( - options[0].value - ); const handleNext = () => { // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation }; - const fileInputRef = useRef(null); - const handleButtonClick = () => { - if (fileInputRef.current) { - fileInputRef.current.click(); - } - }; - - const handleFileChange = (event: any) => { - const file = event.target.files[0]; - // TODO: (onboarding-wizard) handle file change and naming. Set Input field to file.name and use temporary file path for the upload value - }; - - function handleSelectChange(newValue: string) { - setCredentialType(newValue); - } - return (
-
- -
-
- option.value)} - /> - {[options[2].value, options[3].value].includes( - credentialType - ) && ( -
- {credentialType === options[3].value - ? 'Komiser will fetch the credentials from AWS' - : 'Komiser will load credentials from AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.'} -
- )} -
- - {credentialType === options[0].value && ( -
- } - subLabel="Enter the path or browse the file" - placeholder="C:\Documents\Komiser\credentials" - fileInputRef={fileInputRef} - iconClick={handleButtonClick} - handleFileChange={handleFileChange} - /> - - -
- )} - - {credentialType === options[1].value && ( -
- - - -
- )} -
-
+ diff --git a/dashboard/services/settingsService.ts b/dashboard/services/settingsService.ts index 70b0643a6..8ebd2d28d 100644 --- a/dashboard/services/settingsService.ts +++ b/dashboard/services/settingsService.ts @@ -372,6 +372,42 @@ const settingsService = { return window.location.replace( `${BASE_URL}/resources/export-csv${id ? `/${id}` : ''}` ); + }, + + async getCloudAccounts() { + try { + const res = await fetch(`${BASE_URL}/cloud_accounts`, settings('GET')); + const data = await res.json(); + return data; + } catch (error) { + return Error; + } + }, + + async editCloudAccount(id: number, payload: string) { + try { + const res = await fetch( + `${BASE_URL}/cloud_accounts/${id}`, + settings('PUT', payload) + ); + const data = await res.json(); + return data; + } catch (error) { + return Error; + } + }, + + async deleteCloudAccount(id: number) { + try { + const res = await fetch( + `${BASE_URL}/cloud_accounts/${id}`, + settings('DELETE') + ); + const data = await res.json(); + return data; + } catch (error) { + return Error; + } } }; From 7c68aa7a03fbd07fbb994328d650411fffd5e80b Mon Sep 17 00:00:00 2001 From: AvineshTripathi Date: Fri, 22 Sep 2023 17:45:54 +0530 Subject: [PATCH 129/191] feat: initial --- handlers/feedback_handler.go | 57 ++++++++++++++++++++++++++++++++++++ internal/api/v1/endpoints.go | 2 ++ 2 files changed, 59 insertions(+) create mode 100644 handlers/feedback_handler.go diff --git a/handlers/feedback_handler.go b/handlers/feedback_handler.go new file mode 100644 index 000000000..861aaa8f2 --- /dev/null +++ b/handlers/feedback_handler.go @@ -0,0 +1,57 @@ +package handlers + +import ( + "bytes" + "io" + "mime/multipart" + "net/http" + "path/filepath" + + "github.com/gin-gonic/gin" + "github.com/sirupsen/logrus" +) + +func (handler *ApiHandler) NewFeedbackHandler(c *gin.Context) { + + err := c.Request.ParseMultipartForm(1000 << 20) + if err != nil { + logrus.WithError(err).Error("Unable to parse form") + c.JSON(http.StatusBadRequest, gin.H{"error": "Unable to parse form"}) + return + } + email := c.PostForm("email") + description := c.PostForm("description") + imageFile, _, err := c.Request.FormFile("image") + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Unable to get image file"}) + return + } + defer imageFile.Close() + + var requestBody bytes.Buffer + writer := multipart.NewWriter(&requestBody) + + _ = writer.WriteField("Email", email) + _ = writer.WriteField("Description", description) + + imagePart, err := writer.CreateFormFile("files[0]", filepath.Base("temp-image")) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create form file"}) + return + } + _, _ = io.Copy(imagePart, imageFile) + + writer.Close() + + var url = "" + + resp, err := http.Post(url, writer.FormDataContentType(), &requestBody) + if err != nil { + logrus.WithError(err).Error("scan failed") + c.JSON(http.StatusInternalServerError, gin.H{"error": "scan failed"}) + return + } + defer resp.Body.Close() + + c.JSON(http.StatusOK, resp.Body) +} diff --git a/internal/api/v1/endpoints.go b/internal/api/v1/endpoints.go index 679c5fbe9..fb7e97a6e 100644 --- a/internal/api/v1/endpoints.go +++ b/internal/api/v1/endpoints.go @@ -67,5 +67,7 @@ func Endpoints(ctx context.Context, telemetry bool, analytics utils.Analytics, d router.NoRoute(gin.WrapH(http.FileServer(assetFS()))) + router.POST("/feedback", api.NewFeedbackHandler) + return router } From 78a6422d6abedd3bb23678e2a556794234d5c335 Mon Sep 17 00:00:00 2001 From: Azanul Date: Sat, 23 Sep 2023 00:49:50 +0530 Subject: [PATCH 130/191] Metric Stream cost calculation Signed-off-by: Azanul --- providers/aws/cloudwatch/log_metrics.go | 91 ++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/providers/aws/cloudwatch/log_metrics.go b/providers/aws/cloudwatch/log_metrics.go index 440ce6c45..343032239 100644 --- a/providers/aws/cloudwatch/log_metrics.go +++ b/providers/aws/cloudwatch/log_metrics.go @@ -2,20 +2,92 @@ package cloudwatch import ( "context" + "encoding/json" "fmt" + "strconv" "time" log "github.com/sirupsen/logrus" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/cloudwatch" + cwTypes "github.com/aws/aws-sdk-go-v2/service/cloudwatch/types" + + "github.com/aws/aws-sdk-go-v2/service/pricing" + "github.com/aws/aws-sdk-go-v2/service/pricing/types" + "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" ) +const ( + metricUpdateRateCode = "VJDTMA8S4PDEWU6J.JRTCKXETXF.6YS6EN2CT7" +) + +func getRate(pricingOutput *pricing.GetProductsOutput) (float64, error) { + costPerMonth := 0.0 + + if pricingOutput != nil && len(pricingOutput.PriceList) > 0 { + var priceList interface{} + err := json.Unmarshal([]byte(pricingOutput.PriceList[0]), &priceList) + if err != nil { + return 0, fmt.Errorf("failed to unmarshal JSON: %w", err) + } + + priceListMap := priceList.(map[string]interface{}) + if onDemand, ok := priceListMap["terms"].(map[string]interface{})["OnDemand"]; ok { + for _, details := range onDemand.(map[string]interface{}) { + if priceDetails, ok := details.(map[string]interface{})["priceDimensions"].(map[string]interface{}); ok { + for _, price := range priceDetails { + rateCode := price.(map[string]interface{})["rateCode"].(string) + if rateCode == metricUpdateRateCode { + usdPrice := price.(map[string]interface{})["pricePerUnit"].(map[string]interface{})["USD"].(string) + costPerMonth, err = strconv.ParseFloat(usdPrice, 64) + if err != nil { + return 0, fmt.Errorf("failed to parse cost per month: %w", err) + } + break + } + } + } + } + } + } + + return costPerMonth, nil +} + func MetricStreams(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { resources := make([]models.Resource, 0) cloudWatchMetricsClient := cloudwatch.NewFromConfig(*client.AWSClient) + pricingClient := pricing.NewFromConfig(*client.AWSClient) + + pricingOutput, err := pricingClient.GetProducts(ctx, &pricing.GetProductsInput{ + ServiceCode: aws.String("AmazonCloudWatch"), + Filters: []types.Filter{ + { + Field: aws.String("regionCode"), + Value: aws.String(client.AWSClient.Region), + Type: types.FilterTypeTermMatch, + }, + { + Field: aws.String("operation"), + Value: aws.String("MetricUpdate"), + Type: types.FilterTypeTermMatch, + }, + }, + MaxResults: aws.Int32(1), + }) + if err != nil { + log.Printf("ERROR: Couldn't fetch pricing info for Metric Streams: %v", err) + return resources, err + } + + costPerUpdate, err := getRate(pricingOutput) + if err != nil { + log.Printf("ERROR: Failed to calculate cost per month: %v", err) + return resources, err + } input := &cloudwatch.ListMetricStreamsInput{} for { @@ -42,6 +114,23 @@ func MetricStreams(ctx context.Context, client providers.ProviderClient) ([]mode } } + statisticsOutput, err := cloudWatchMetricsClient.GetMetricStatistics(ctx, &cloudwatch.GetMetricStatisticsInput{ + MetricName: aws.String("MetricUpdate"), + Namespace: aws.String("AWS/CloudWatch/MetricStreams"), + Dimensions: []cwTypes.Dimension{ + { + Name: aws.String("MetricStreamName"), + Value: stream.Name, + }, + }, + }) + if err != nil { + return resources, err + } + + updateCount := *statisticsOutput.Datapoints[0].Sum + monthlyCost := costPerUpdate * updateCount + resources = append(resources, models.Resource{ Provider: "AWS", Account: client.Name, @@ -49,7 +138,7 @@ func MetricStreams(ctx context.Context, client providers.ProviderClient) ([]mode ResourceId: streamArn, Region: client.AWSClient.Region, Name: aws.ToString(stream.Name), - Cost: 0, + Cost: monthlyCost, Tags: tags, FetchedAt: time.Now(), Link: fmt.Sprintf("https://%s.console.aws.amazon.com/cloudwatch/home?region=%s#metric-streams:streamsList/%s", client.AWSClient.Region, client.AWSClient.Region, aws.ToString(stream.Name)), From 48e8f3aa10b647b73a07ffcbe938bb2554dcab22 Mon Sep 17 00:00:00 2001 From: AvineshTripathi Date: Sat, 23 Sep 2023 18:22:04 +0530 Subject: [PATCH 131/191] fix: added templating --- handlers/feedback_handler.go | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/handlers/feedback_handler.go b/handlers/feedback_handler.go index 861aaa8f2..a03f56ae4 100644 --- a/handlers/feedback_handler.go +++ b/handlers/feedback_handler.go @@ -2,20 +2,21 @@ package handlers import ( "bytes" + "fmt" "io" "mime/multipart" "net/http" "path/filepath" "github.com/gin-gonic/gin" - "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" ) func (handler *ApiHandler) NewFeedbackHandler(c *gin.Context) { - err := c.Request.ParseMultipartForm(1000 << 20) + err := c.Request.ParseMultipartForm(100 << 20) if err != nil { - logrus.WithError(err).Error("Unable to parse form") + log.WithError(err).Error("Unable to parse form") c.JSON(http.StatusBadRequest, gin.H{"error": "Unable to parse form"}) return } @@ -31,8 +32,25 @@ func (handler *ApiHandler) NewFeedbackHandler(c *gin.Context) { var requestBody bytes.Buffer writer := multipart.NewWriter(&requestBody) - _ = writer.WriteField("Email", email) - _ = writer.WriteField("Description", description) + payloadField, _ := writer.CreateFormField("payload_json") + payloadJSON := fmt.Sprintf(`{ + "content": "", + "embeds": [ + { + "title": "Feedback", + "description": "%s", + "fields": [ + { + "name": "Email", + "value": "%s", + "inline": true + } + ] + } + ] + }`, description, email) + + payloadField.Write([]byte(payloadJSON)) imagePart, err := writer.CreateFormFile("files[0]", filepath.Base("temp-image")) if err != nil { @@ -47,11 +65,11 @@ func (handler *ApiHandler) NewFeedbackHandler(c *gin.Context) { resp, err := http.Post(url, writer.FormDataContentType(), &requestBody) if err != nil { - logrus.WithError(err).Error("scan failed") - c.JSON(http.StatusInternalServerError, gin.H{"error": "scan failed"}) + log.WithError(err).Error("scan failed") + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed sending data to discord"}) return } defer resp.Body.Close() - c.JSON(http.StatusOK, resp.Body) + c.JSON(http.StatusOK, gin.H{"Response": "Feedback submitted"}) } From c67b29a6d3a6e8ada89162ad49a716b5b5fbffda Mon Sep 17 00:00:00 2001 From: Siddarth Kumar Date: Sat, 23 Sep 2023 22:49:04 +0530 Subject: [PATCH 132/191] feat: support aws iam user --- providers/aws/aws.go | 1 + providers/aws/iam/users.go | 69 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 providers/aws/iam/users.go diff --git a/providers/aws/aws.go b/providers/aws/aws.go index dfb0931ff..6586f19d1 100644 --- a/providers/aws/aws.go +++ b/providers/aws/aws.go @@ -48,6 +48,7 @@ func listOfSupportedServices() []providers.FetchDataFunction { iam.SamlProviders, iam.Groups, iam.Policies, + iam.Users, sqs.Queues, s3.Buckets, ec2.Instances, diff --git a/providers/aws/iam/users.go b/providers/aws/iam/users.go new file mode 100644 index 000000000..5df62ab1d --- /dev/null +++ b/providers/aws/iam/users.go @@ -0,0 +1,69 @@ +package iam + +import ( + "context" + "fmt" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/iam" + log "github.com/sirupsen/logrus" + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/providers" +) + +const ( + iamUserLinkTemplate = "https://%s.console.aws.amazon.com/iamv2/home?region=%s#/users/details/%s" + awsProvider = "AWS" + iamUserService = "IAM User" +) + +func Users(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { + var resources []models.Resource + + iamClient := iam.NewFromConfig(*client.AWSClient) + + paginator := iam.NewListUsersPaginator(iamClient, &iam.ListUsersInput{}) + + for paginator.HasMorePages() { + output, err := paginator.NextPage(ctx) + if err != nil { + log.WithError(err).Error("Failed to list IAM users") + return nil, fmt.Errorf("failed to list IAM users: %w", err) + } + + for _, o := range output.Users { + var tags []models.Tag + for _, t := range o.Tags { + tags = append(tags, models.Tag{ + Key: aws.ToString(t.Key), + Value: aws.ToString(t.Value), + }) + } + + resources = append(resources, models.Resource{ + Provider: awsProvider, + Account: client.Name, + Service: iamUserService, + ResourceId: aws.ToString(o.Arn), + Region: client.AWSClient.Region, + Name: aws.ToString(o.UserName), + Cost: 0, + CreatedAt: *o.CreateDate, + Tags: tags, + FetchedAt: time.Now(), + Link: fmt.Sprintf(iamUserLinkTemplate, client.AWSClient.Region, client.AWSClient.Region, aws.ToString(o.UserName)), + }) + } + } + + log.WithFields(log.Fields{ + "provider": awsProvider, + "account": client.Name, + "region": client.AWSClient.Region, + "service": iamUserService, + "resources": len(resources), + }).Info("Fetched resources") + + return resources, nil +} From a729268864c08996042c3c942c57561a7f203c3e Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 22 Sep 2023 08:32:34 +0530 Subject: [PATCH 133/191] Upgrade next.js 13.5.2 --- dashboard/package-lock.json | 6452 ++++++++++++----------------------- dashboard/package.json | 4 +- 2 files changed, 2164 insertions(+), 4292 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 77dcb2096..b040c98c9 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -15,7 +15,7 @@ "@types/react-dom": "18.2.7", "chart.js": "^4.2.1", "classnames": "^2.3.2", - "next": "^13.4.19", + "next": "^13.5.2", "react": "18.2.0", "react-chartjs-2": "^5.2.0", "react-dom": "18.2.0", @@ -42,7 +42,7 @@ "autoprefixer": "^10.4.13", "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-next": "13.4.19", + "eslint-config-next": "13.5.2", "eslint-config-prettier": "^8.5.0", "eslint-plugin-jest": "^27.4.0", "eslint-plugin-prettier": "^4.2.1", @@ -59,24 +59,21 @@ }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@adobe/css-tools": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", - "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -86,9 +83,8 @@ }, "node_modules/@ampproject/remapping": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -99,9 +95,8 @@ }, "node_modules/@aw-web-design/x-default-browser": { "version": "1.4.126", - "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz", - "integrity": "sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==", "dev": true, + "license": "MIT", "dependencies": { "default-browser-id": "3.0.0" }, @@ -111,9 +106,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -124,9 +118,8 @@ }, "node_modules/@babel/code-frame/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -136,9 +129,8 @@ }, "node_modules/@babel/code-frame/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -150,42 +142,37 @@ }, "node_modules/@babel/code-frame/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/code-frame/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/code-frame/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -195,18 +182,16 @@ }, "node_modules/@babel/compat-data": { "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.19.tgz", - "integrity": "sha512-Q8Yj5X4LHVYTbLCKVz0//2D2aDmHF4xzCdEttYvKOnWvErGsa6geHXD6w46x64n5tP69VfeH+IfSrdyH3MLhwA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", @@ -234,24 +219,21 @@ }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.15", "@jridgewell/gen-mapping": "^0.3.2", @@ -264,9 +246,8 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -276,9 +257,8 @@ }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, @@ -288,9 +268,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.15", @@ -304,18 +283,16 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", @@ -336,18 +313,16 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", @@ -362,18 +337,16 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -387,18 +360,16 @@ }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.22.5", "@babel/types": "^7.22.5" @@ -409,9 +380,8 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -421,9 +391,8 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, @@ -433,9 +402,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, @@ -445,9 +413,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.19.tgz", - "integrity": "sha512-m6h1cJvn+OJ+R3jOHp30faq5xKJ7VbjwDj5RGgHuRlU9hrMeKsGC+JpihkR5w1g7IfseCPPtZ0r7/hB4UKaYlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -464,9 +431,8 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -476,18 +442,16 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", - "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", @@ -502,9 +466,8 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-member-expression-to-functions": "^7.22.5", @@ -519,9 +482,8 @@ }, "node_modules/@babel/helper-simple-access": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -531,9 +493,8 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -543,9 +504,8 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -555,36 +515,32 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.19.tgz", - "integrity": "sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", - "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.15", @@ -596,9 +552,8 @@ }, "node_modules/@babel/helpers": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", "@babel/traverse": "^7.22.15", @@ -610,9 +565,8 @@ }, "node_modules/@babel/highlight": { "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.4.2", @@ -624,9 +578,8 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -636,9 +589,8 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -650,42 +602,37 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -695,9 +642,8 @@ }, "node_modules/@babel/parser": { "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -707,9 +653,8 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -722,9 +667,8 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -739,10 +683,8 @@ }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -756,10 +698,8 @@ }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -773,10 +713,8 @@ }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -790,10 +728,8 @@ }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -807,10 +743,8 @@ }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", @@ -827,10 +761,8 @@ }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -845,9 +777,8 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -857,9 +788,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -869,9 +799,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -881,9 +810,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -893,9 +821,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -908,9 +835,8 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -920,9 +846,8 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -932,9 +857,8 @@ }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", - "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -947,9 +871,8 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -962,9 +885,8 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -977,9 +899,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -989,9 +910,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1001,9 +921,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1016,9 +935,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1028,9 +946,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1040,9 +957,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1052,9 +968,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1064,9 +979,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1076,9 +990,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1088,9 +1001,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1103,9 +1015,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1118,9 +1029,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1133,9 +1043,8 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1149,9 +1058,8 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1164,9 +1072,8 @@ }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", - "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -1182,9 +1089,8 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -1199,9 +1105,8 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1214,9 +1119,8 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", - "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1229,9 +1133,8 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1245,9 +1148,8 @@ }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", @@ -1262,9 +1164,8 @@ }, "node_modules/@babel/plugin-transform-classes": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.15", @@ -1285,9 +1186,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/template": "^7.22.5" @@ -1301,9 +1201,8 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", - "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1316,9 +1215,8 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1332,9 +1230,8 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1347,9 +1244,8 @@ }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1363,9 +1259,8 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1379,9 +1274,8 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -1395,9 +1289,8 @@ }, "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", - "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-flow": "^7.22.5" @@ -1411,9 +1304,8 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1426,9 +1318,8 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.5", "@babel/helper-function-name": "^7.22.5", @@ -1443,9 +1334,8 @@ }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1459,9 +1349,8 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1474,9 +1363,8 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1490,9 +1378,8 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1505,9 +1392,8 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1521,9 +1407,8 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", - "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", @@ -1538,9 +1423,8 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.22.9", @@ -1556,9 +1440,8 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1572,9 +1455,8 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1588,9 +1470,8 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1603,9 +1484,8 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -1619,9 +1499,8 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1635,9 +1514,8 @@ }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-compilation-targets": "^7.22.15", @@ -1654,9 +1532,8 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.5" @@ -1670,9 +1547,8 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1686,9 +1562,8 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", - "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -1703,9 +1578,8 @@ }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1718,9 +1592,8 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1734,9 +1607,8 @@ }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.11", @@ -1752,9 +1624,8 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1767,9 +1638,8 @@ }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", - "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1782,9 +1652,8 @@ }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", - "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -1801,9 +1670,8 @@ }, "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-transform-react-jsx": "^7.22.5" }, @@ -1816,9 +1684,8 @@ }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", - "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1832,9 +1699,8 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "regenerator-transform": "^0.15.2" @@ -1848,9 +1714,8 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1863,9 +1728,8 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", - "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", @@ -1883,18 +1747,16 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1907,9 +1769,8 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" @@ -1923,9 +1784,8 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1938,9 +1798,8 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1953,9 +1812,8 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1968,9 +1826,8 @@ }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.15", @@ -1986,9 +1843,8 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2001,9 +1857,8 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2017,9 +1872,8 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2033,9 +1887,8 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2049,9 +1902,8 @@ }, "node_modules/@babel/preset-env": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.15.tgz", - "integrity": "sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-compilation-targets": "^7.22.15", @@ -2143,18 +1995,16 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-flow": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.15.tgz", - "integrity": "sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -2169,9 +2019,8 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -2183,9 +2032,8 @@ }, "node_modules/@babel/preset-react": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", - "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -2203,9 +2051,8 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz", - "integrity": "sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -2222,9 +2069,8 @@ }, "node_modules/@babel/register": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz", - "integrity": "sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", @@ -2241,9 +2087,8 @@ }, "node_modules/@babel/register/node_modules/find-cache-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -2255,9 +2100,8 @@ }, "node_modules/@babel/register/node_modules/find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -2267,9 +2111,8 @@ }, "node_modules/@babel/register/node_modules/locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -2280,9 +2123,8 @@ }, "node_modules/@babel/register/node_modules/make-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -2293,9 +2135,8 @@ }, "node_modules/@babel/register/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -2308,9 +2149,8 @@ }, "node_modules/@babel/register/node_modules/p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -2320,27 +2160,24 @@ }, "node_modules/@babel/register/node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/register/node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@babel/register/node_modules/pkg-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -2350,27 +2187,24 @@ }, "node_modules/@babel/register/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/@babel/register/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/@babel/register/node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -2378,15 +2212,13 @@ }, "node_modules/@babel/regjsgen": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/runtime": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", "dev": true, + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2396,9 +2228,8 @@ }, "node_modules/@babel/template": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -2410,9 +2241,8 @@ }, "node_modules/@babel/traverse": { "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.19.tgz", - "integrity": "sha512-ZCcpVPK64krfdScRbpxF6xA5fz7IOsfMwx1tcACvCzt6JY+0aHkBk7eIU8FRDSZRU5Zei6Z4JfgAxN1bqXGECg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", @@ -2431,9 +2261,8 @@ }, "node_modules/@babel/types": { "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.19", @@ -2445,21 +2274,18 @@ }, "node_modules/@base2/pretty-print-object": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", - "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@colors/colors": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" @@ -2467,9 +2293,8 @@ }, "node_modules/@commitlint/cli": { "version": "17.7.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.7.1.tgz", - "integrity": "sha512-BCm/AT06SNCQtvFv921iNhudOHuY16LswT0R3OeolVGLk8oP+Rk9TfQfgjH7QPMjhvp76bNqGFEcpKojxUNW1g==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/format": "^17.4.4", "@commitlint/lint": "^17.7.0", @@ -2491,9 +2316,8 @@ }, "node_modules/@commitlint/config-conventional": { "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.7.0.tgz", - "integrity": "sha512-iicqh2o6et+9kWaqsQiEYZzfLbtoWv9uZl8kbI8EGfnc0HeGafQBF7AJ0ylN9D/2kj6txltsdyQs8+2fTMwWEw==", "dev": true, + "license": "MIT", "dependencies": { "conventional-changelog-conventionalcommits": "^6.1.0" }, @@ -2503,9 +2327,8 @@ }, "node_modules/@commitlint/config-validator": { "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.6.7.tgz", - "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", "ajv": "^8.11.0" @@ -2516,9 +2339,8 @@ }, "node_modules/@commitlint/ensure": { "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.6.7.tgz", - "integrity": "sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", "lodash.camelcase": "^4.3.0", @@ -2533,18 +2355,16 @@ }, "node_modules/@commitlint/execute-rule": { "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", - "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=v14" } }, "node_modules/@commitlint/format": { "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", - "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", "chalk": "^4.1.0" @@ -2555,9 +2375,8 @@ }, "node_modules/@commitlint/is-ignored": { "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.7.0.tgz", - "integrity": "sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", "semver": "7.5.4" @@ -2568,9 +2387,8 @@ }, "node_modules/@commitlint/lint": { "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.7.0.tgz", - "integrity": "sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/is-ignored": "^17.7.0", "@commitlint/parse": "^17.7.0", @@ -2583,9 +2401,8 @@ }, "node_modules/@commitlint/load": { "version": "17.7.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.7.1.tgz", - "integrity": "sha512-S/QSOjE1ztdogYj61p6n3UbkUvweR17FQ0zDbNtoTLc+Hz7vvfS7ehoTMQ27hPSjVBpp7SzEcOQu081RLjKHJQ==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/config-validator": "^17.6.7", "@commitlint/execute-rule": "^17.4.0", @@ -2608,24 +2425,21 @@ }, "node_modules/@commitlint/load/node_modules/@types/node": { "version": "20.4.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.7.tgz", - "integrity": "sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@commitlint/message": { "version": "17.4.2", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", - "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=v14" } }, "node_modules/@commitlint/parse": { "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.7.0.tgz", - "integrity": "sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", "conventional-changelog-angular": "^6.0.0", @@ -2637,9 +2451,8 @@ }, "node_modules/@commitlint/read": { "version": "17.5.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", - "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/top-level": "^17.4.0", "@commitlint/types": "^17.4.4", @@ -2653,9 +2466,8 @@ }, "node_modules/@commitlint/resolve-extends": { "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", - "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/config-validator": "^17.6.7", "@commitlint/types": "^17.4.4", @@ -2670,9 +2482,8 @@ }, "node_modules/@commitlint/rules": { "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.7.0.tgz", - "integrity": "sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/ensure": "^17.6.7", "@commitlint/message": "^17.4.2", @@ -2686,18 +2497,16 @@ }, "node_modules/@commitlint/to-lines": { "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", - "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", "dev": true, + "license": "MIT", "engines": { "node": ">=v14" } }, "node_modules/@commitlint/top-level": { "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", - "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^5.0.0" }, @@ -2707,9 +2516,8 @@ }, "node_modules/@commitlint/types": { "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", - "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0" }, @@ -2719,9 +2527,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2731,9 +2538,8 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2741,560 +2547,204 @@ }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", "dev": true, + "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, - "node_modules/@esbuild/android-arm": { + "node_modules/@esbuild/win32-x64": { "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ - "arm" + "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.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" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "license": "Python-2.0" }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.21.0", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], + "node_modules/@eslint/js": { + "version": "8.49.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], + "node_modules/@fal-works/esbuild-plugin-global-externals": { + "version": "2.1.2", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], + "node_modules/@floating-ui/core": { + "version": "1.5.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.1.3" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], + "node_modules/@floating-ui/dom": { + "version": "1.5.3", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], + "node_modules/@floating-ui/react-dom": { + "version": "2.0.2", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], + "node_modules/@floating-ui/utils": { + "version": "0.1.3", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.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" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", - "dev": true - }, - "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", - "dev": true, - "dependencies": { - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "dev": true, - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", - "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", - "dev": true, - "dependencies": { - "@floating-ui/dom": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.3.tgz", - "integrity": "sha512-uvnFKtPgzLnpzzTRfhDlvXX0kLYi9lDRQbcDmT8iXl71Rx+uwSuaUIQl3DNC7w5OweAQ7XQMDObML+KaYDQfng==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" + "node": ">=10.10.0" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -3305,15 +2755,13 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3328,9 +2776,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3340,9 +2787,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3355,9 +2801,8 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -3371,9 +2816,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -3384,9 +2828,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -3396,9 +2839,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -3411,9 +2853,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -3423,18 +2864,16 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/console": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -3449,9 +2888,8 @@ }, "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -3496,9 +2934,8 @@ }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3508,9 +2945,8 @@ }, "node_modules/@jest/core/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -3522,15 +2958,13 @@ }, "node_modules/@jest/core/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -3543,9 +2977,8 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -3556,9 +2989,8 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -3568,9 +3000,8 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -3585,9 +3016,8 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -3600,9 +3030,8 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -3643,9 +3072,8 @@ }, "node_modules/@jest/reporters/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3663,9 +3091,8 @@ }, "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -3679,9 +3106,8 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -3691,9 +3117,8 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -3705,9 +3130,8 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -3720,9 +3144,8 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -3735,9 +3158,8 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -3761,9 +3183,8 @@ }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -3778,9 +3199,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3792,27 +3212,24 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -3820,15 +3237,13 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3836,20 +3251,17 @@ }, "node_modules/@juggle/resize-observer": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@kurkle/color": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + "license": "MIT" }, "node_modules/@mdx-js/react": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz", - "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==", "dev": true, + "license": "MIT", "dependencies": { "@types/mdx": "^2.0.0", "@types/react": ">=16" @@ -3864,9 +3276,8 @@ }, "node_modules/@ndelangen/get-tarball": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz", - "integrity": "sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==", "dev": true, + "license": "MIT", "dependencies": { "gunzip-maybe": "^1.4.2", "pump": "^3.0.0", @@ -3874,24 +3285,21 @@ } }, "node_modules/@next/env": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.19.tgz", - "integrity": "sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==" + "version": "13.5.2", + "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz", - "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==", + "version": "13.5.2", "dev": true, + "license": "MIT", "dependencies": { "glob": "7.1.7" } }, "node_modules/@next/eslint-plugin-next/node_modules/glob": { "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3907,133 +3315,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.19.tgz", - "integrity": "sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.19.tgz", - "integrity": "sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.19.tgz", - "integrity": "sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.19.tgz", - "integrity": "sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.19.tgz", - "integrity": "sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.19.tgz", - "integrity": "sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.19.tgz", - "integrity": "sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.19.tgz", - "integrity": "sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.19.tgz", - "integrity": "sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==", + "version": "13.5.2", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -4044,9 +3331,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -4057,18 +3343,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -4079,9 +3363,8 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -4089,9 +3372,8 @@ }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", @@ -4139,9 +3421,8 @@ }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -4153,27 +3434,24 @@ }, "node_modules/@radix-ui/number": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", - "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" } }, "node_modules/@radix-ui/primitive": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" } }, "node_modules/@radix-ui/react-arrow": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", - "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" @@ -4195,9 +3473,8 @@ }, "node_modules/@radix-ui/react-collection": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", - "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1", @@ -4222,9 +3499,8 @@ }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" }, @@ -4240,9 +3516,8 @@ }, "node_modules/@radix-ui/react-context": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" }, @@ -4258,9 +3533,8 @@ }, "node_modules/@radix-ui/react-direction": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", - "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" }, @@ -4276,9 +3550,8 @@ }, "node_modules/@radix-ui/react-dismissable-layer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", - "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", @@ -4304,9 +3577,8 @@ }, "node_modules/@radix-ui/react-focus-guards": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" }, @@ -4322,9 +3594,8 @@ }, "node_modules/@radix-ui/react-focus-scope": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", - "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1", @@ -4348,9 +3619,8 @@ }, "node_modules/@radix-ui/react-id": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-layout-effect": "1.0.1" @@ -4367,9 +3637,8 @@ }, "node_modules/@radix-ui/react-popper": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", - "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@floating-ui/react-dom": "^2.0.0", @@ -4400,9 +3669,8 @@ }, "node_modules/@radix-ui/react-portal": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", - "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" @@ -4424,9 +3692,8 @@ }, "node_modules/@radix-ui/react-primitive": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-slot": "1.0.2" @@ -4448,9 +3715,8 @@ }, "node_modules/@radix-ui/react-roving-focus": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", - "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", @@ -4480,9 +3746,8 @@ }, "node_modules/@radix-ui/react-select": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", - "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/number": "1.0.1", @@ -4524,9 +3789,8 @@ }, "node_modules/@radix-ui/react-separator": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz", - "integrity": "sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" @@ -4548,9 +3812,8 @@ }, "node_modules/@radix-ui/react-slot": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1" @@ -4567,9 +3830,8 @@ }, "node_modules/@radix-ui/react-toggle": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", - "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", @@ -4593,9 +3855,8 @@ }, "node_modules/@radix-ui/react-toggle-group": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz", - "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", @@ -4623,9 +3884,8 @@ }, "node_modules/@radix-ui/react-toolbar": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz", - "integrity": "sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", @@ -4653,9 +3913,8 @@ }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", - "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" }, @@ -4671,9 +3930,8 @@ }, "node_modules/@radix-ui/react-use-controllable-state": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", - "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-callback-ref": "1.0.1" @@ -4690,9 +3948,8 @@ }, "node_modules/@radix-ui/react-use-escape-keydown": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", - "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-callback-ref": "1.0.1" @@ -4709,9 +3966,8 @@ }, "node_modules/@radix-ui/react-use-layout-effect": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", - "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" }, @@ -4727,9 +3983,8 @@ }, "node_modules/@radix-ui/react-use-previous": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", - "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" }, @@ -4745,9 +4000,8 @@ }, "node_modules/@radix-ui/react-use-rect": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", - "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/rect": "1.0.1" @@ -4764,9 +4018,8 @@ }, "node_modules/@radix-ui/react-use-size": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", - "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-layout-effect": "1.0.1" @@ -4783,9 +4036,8 @@ }, "node_modules/@radix-ui/react-visually-hidden": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", - "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" @@ -4807,23 +4059,20 @@ }, "node_modules/@radix-ui/rect": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", - "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.10" } }, "node_modules/@rushstack/eslint-patch": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.4.0.tgz", - "integrity": "sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sentry-internal/tracing": { "version": "7.69.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.69.0.tgz", - "integrity": "sha512-4BgeWZUj9MO6IgfO93C9ocP3+AdngqujF/+zB2rFdUe+y9S6koDyUC7jr9Knds/0Ta72N/0D6PwhgSCpHK8s0Q==", + "license": "MIT", "dependencies": { "@sentry/core": "7.69.0", "@sentry/types": "7.69.0", @@ -4836,8 +4085,7 @@ }, "node_modules/@sentry/browser": { "version": "7.69.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.69.0.tgz", - "integrity": "sha512-5ls+zu2PrMhHCIIhclKQsWX5u6WH0Ez5/GgrCMZTtZ1d70ukGSRUvpZG9qGf5Cw1ezS1LY+1HCc3whf8x8lyPw==", + "license": "MIT", "dependencies": { "@sentry-internal/tracing": "7.69.0", "@sentry/core": "7.69.0", @@ -4852,8 +4100,7 @@ }, "node_modules/@sentry/core": { "version": "7.69.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.69.0.tgz", - "integrity": "sha512-V6jvK2lS8bhqZDMFUtvwe2XvNstFQf5A+2LMKCNBOV/NN6eSAAd6THwEpginabjet9dHsNRmMk7WNKvrUfQhZw==", + "license": "MIT", "dependencies": { "@sentry/types": "7.69.0", "@sentry/utils": "7.69.0", @@ -4865,8 +4112,7 @@ }, "node_modules/@sentry/react": { "version": "7.69.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.69.0.tgz", - "integrity": "sha512-J+DciRRVuruf1nMmBOi2VeJkOLGeCb4vTOFmHzWTvRJNByZ0flyo8E/fyROL7+23kBq1YbcVY6IloUlH73hneQ==", + "license": "MIT", "dependencies": { "@sentry/browser": "7.69.0", "@sentry/types": "7.69.0", @@ -4883,8 +4129,7 @@ }, "node_modules/@sentry/replay": { "version": "7.69.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.69.0.tgz", - "integrity": "sha512-oUqWyBPFUgShdVvgJtV65EQH9pVDmoYVQMOu59JI6FHVeL3ald7R5Mvz6GaNLXsirvvhp0yAkcAd2hc5Xi6hDw==", + "license": "MIT", "dependencies": { "@sentry/core": "7.69.0", "@sentry/types": "7.69.0", @@ -4896,8 +4141,7 @@ }, "node_modules/@sentry/tracing": { "version": "7.69.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.69.0.tgz", - "integrity": "sha512-nhwJXyLU2KT6ci3YRUCkpFQH7RL9lpEuVDHqaJ9xLql766FJ7A7jKtRGSaefgRzJvvdKHUVboIjZnSvqIu8gWw==", + "license": "MIT", "dependencies": { "@sentry-internal/tracing": "7.69.0" }, @@ -4907,16 +4151,14 @@ }, "node_modules/@sentry/types": { "version": "7.69.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.69.0.tgz", - "integrity": "sha512-zPyCox0mzitzU6SIa1KIbNoJAInYDdUpdiA+PoUmMn2hFMH1llGU/cS7f4w/mAsssTlbtlBi72RMnWUCy578bw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { "version": "7.69.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.69.0.tgz", - "integrity": "sha512-4eBixe5Y+0EGVU95R4NxH3jkkjtkE4/CmSZD4In8SCkWGSauogePtq6hyiLsZuP1QHdpPb9Kt0+zYiBb2LouBA==", + "license": "MIT", "dependencies": { "@sentry/types": "7.69.0", "tslib": "^2.4.1 || ^1.9.3" @@ -4927,33 +4169,29 @@ }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@storybook/addon-actions": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.4.2.tgz", - "integrity": "sha512-aKHyYjxcWaOTf/7B8x4EmUNkDAiYJZyJfGTYg2TDEDs89x7/9slujAA01qIgOp74C9nWkHDUVdm7/J+h3kWJWw==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/components": "7.4.2", @@ -4991,9 +4229,8 @@ }, "node_modules/@storybook/addon-backgrounds": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.4.2.tgz", - "integrity": "sha512-Vl6Vw1NzO5jRqlAEpG017z6N79Drlp7Wpw8O9+69/dKtTNmuLqLnPxWrn4nL2CNvghHToLMpToSAFpRo2fBZBg==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/components": "7.4.2", @@ -5025,9 +4262,8 @@ }, "node_modules/@storybook/addon-controls": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.4.2.tgz", - "integrity": "sha512-qzSac1bulSa7mqkfBfyAqbP9PbIio5CjGJ5VyT055ab50e13gj1eS3I9EJHCupYb19E3f465QatrGhoaTsE4hg==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/blocks": "7.4.2", "@storybook/client-logger": "7.4.2", @@ -5061,9 +4297,8 @@ }, "node_modules/@storybook/addon-docs": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.4.2.tgz", - "integrity": "sha512-MV49/bGTibk2kvufk1+JEkDe2Ii/wfh5s+zO6a7p/FRy9zK0hQy3nEc56VpQ3+KzgDr0uyZI+mYq26OPwBuKRg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", @@ -5096,9 +4331,8 @@ }, "node_modules/@storybook/addon-essentials": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.4.2.tgz", - "integrity": "sha512-9VqVe8pUogA9TIAl9xxNSdqU1zfXXdZW6J3BfT3r0DolU4nLusejs2xIu6smhEjZ1KYD6V30Uy9HDft/GRCSnw==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/addon-actions": "7.4.2", "@storybook/addon-backgrounds": "7.4.2", @@ -5126,9 +4360,8 @@ }, "node_modules/@storybook/addon-highlight": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.4.2.tgz", - "integrity": "sha512-HpwQiYil9RlMz303wQ9+ElW6W+Z0baqBUemlQ1JJZ6Wm47mgVVy8vLPcdH3JQkv7E34f51apPKVKFqq49xDqaA==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", @@ -5141,9 +4374,8 @@ }, "node_modules/@storybook/addon-interactions": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.4.2.tgz", - "integrity": "sha512-Gr3UbrPRgtBmwYctFiIxYlg4pfe07sC5gvMJmMdzHSJo0yAmcw2fSzKe4aEPX4trdAIb+diQKi3TDqIBrOfCLQ==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/components": "7.4.2", @@ -5178,9 +4410,8 @@ }, "node_modules/@storybook/addon-interactions/node_modules/@jest/types": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -5194,18 +4425,16 @@ }, "node_modules/@storybook/addon-interactions/node_modules/@types/yargs": { "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@storybook/addon-interactions/node_modules/jest-mock": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" @@ -5216,9 +4445,8 @@ }, "node_modules/@storybook/addon-links": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.4.2.tgz", - "integrity": "sha512-XAspek8kkfiGq3NVt8SD108m54/dJWo+iDSmW3t/BQj2+sDPW8EpOg93X08YGoGMD8FSLOToeVC2Qi+kmAV0iw==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/core-events": "7.4.2", @@ -5250,9 +4478,8 @@ }, "node_modules/@storybook/addon-measure": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.4.2.tgz", - "integrity": "sha512-fewNqI3mDAGAhFOFh/rdDS3dJ3e1QDmSVMB0KDJ7K22HOF2To/H9QfXHV24osnBRu6QemSIqObry1leF+u5BmQ==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/components": "7.4.2", @@ -5282,9 +4509,8 @@ }, "node_modules/@storybook/addon-outline": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.4.2.tgz", - "integrity": "sha512-C6Zfoa6k2ef55O16GKV29T0wIYaDyiBtyd/fuTzz7hkpusSqKGFNeQyfG6hRmPv5yAib7+Pzl86cH3wGz85oTw==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/components": "7.4.2", @@ -5314,9 +4540,8 @@ }, "node_modules/@storybook/addon-toolbars": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.4.2.tgz", - "integrity": "sha512-zSU8GpyMKo3vGxR7LQdvw5jV/6QUOfUepS3HEYGB88vlIPK7UriV8k9HB0FObEyYZKYU7wuPYBYhXApK4ZBVUA==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/components": "7.4.2", @@ -5343,9 +4568,8 @@ }, "node_modules/@storybook/addon-viewport": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.4.2.tgz", - "integrity": "sha512-0mlqJmHezyZG9lLpj2LKN6HTZI015T3hYuFP4MwZRj579e246DvcBTw/h3n3bjLRGglapmFqkCw9PRVMhsQ/CA==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/components": "7.4.2", @@ -5376,9 +4600,8 @@ }, "node_modules/@storybook/addons": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-7.4.2.tgz", - "integrity": "sha512-3snQVlTIKgzk6apNZc9sHr+0n4riiQkKGUkoHS8B1G90qj/9OyRnkDq55A7mJ9CxskqIjei5Q+hlko87g0jDsA==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/manager-api": "7.4.2", "@storybook/preview-api": "7.4.2", @@ -5395,9 +4618,8 @@ }, "node_modules/@storybook/blocks": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.4.2.tgz", - "integrity": "sha512-ijuZBsYfQBuwMA8Lb1dT6t2PzqhkOtIdc+G5iQ/IgWLX5HT1br+Wq8o3TUWrqACM9VKIASnJk13FMAOeGggD/w==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/channels": "7.4.2", "@storybook/client-logger": "7.4.2", @@ -5434,9 +4656,8 @@ }, "node_modules/@storybook/builder-manager": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.4.2.tgz", - "integrity": "sha512-MgdXr9QJ2sNk0fUshQ7hk4Ec9IkbPWR6alrmDByIOEU9bThx0j4OxU9uTLBy8r5uZsSL6nNtRyCvSP8YSKaQHQ==", "dev": true, + "license": "MIT", "dependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", "@storybook/core-common": "7.4.2", @@ -5462,9 +4683,8 @@ }, "node_modules/@storybook/builder-webpack5": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.4.2.tgz", - "integrity": "sha512-NmlHRU4+jie+9z4cxuXUM49JI2ypIc6JHCiuJIqF7rONrsyCExZvPnzk8mNogox+RK1C7rP60g23rywZdxQNNA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.22.9", "@storybook/addons": "7.4.2", @@ -5527,15 +4747,13 @@ }, "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { "version": "16.18.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.51.tgz", - "integrity": "sha512-LKA7ZhY30I8PiUOzBzhtnIULQTACpiEpPXLiYMWyS+tPAORf+rmXUadHZXB/KFrFyMjeHeKc1GFvLd+3f7LE3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/channels": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", - "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/core-events": "7.4.2", @@ -5551,9 +4769,8 @@ }, "node_modules/@storybook/cli": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.4.2.tgz", - "integrity": "sha512-WleObtC7OU2lT+pI2vTdXZPFMKDGbg3bkUJ+PG8+yqGg53ea5ZkwKWg9qHpXuiMkYDztqhbA8kYrny1GqFuVdg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.22.9", "@babel/preset-env": "^7.22.9", @@ -5608,18 +4825,16 @@ }, "node_modules/@storybook/cli/node_modules/commander": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/@storybook/client-api": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-7.4.2.tgz", - "integrity": "sha512-nmDoEUkUqnHXUKMEs6m59rc4ZPKCVMmHhqccFFIsuLbPtsTqvbWk3Zt+CK6LoI651pafoM4V4zAY5eW0OpApIg==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/preview-api": "7.4.2" @@ -5631,9 +4846,8 @@ }, "node_modules/@storybook/client-logger": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", - "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0" }, @@ -5644,9 +4858,8 @@ }, "node_modules/@storybook/codemod": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.4.2.tgz", - "integrity": "sha512-wU+SLHG/PpLptI0aWEhPxwFPcX7uYe+Id21DKNPg/HvYaLG3N+/DPDef+lm3Vaov9w4OD74iuQ3knT67SSkvmw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.22.9", "@babel/preset-env": "^7.22.9", @@ -5670,9 +4883,8 @@ }, "node_modules/@storybook/components": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.4.2.tgz", - "integrity": "sha512-ecbDzSUd74vf6IwHsbQr+9mVRxKWLmwd9zJ8RHMcR8UejTRAAR/eVvYoCG331TQ8TrhTmHTy5xCVv47pm6ORkQ==", "dev": true, + "license": "MIT", "dependencies": { "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-toolbar": "^1.0.4", @@ -5696,9 +4908,8 @@ }, "node_modules/@storybook/core-client": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.4.2.tgz", - "integrity": "sha512-2K4g8ZaqBUv6oC+1/Bd6XSQ/F7hNyy8OLqnnxjoYsjUQc8DaN5wUckEEgT9WSvLQg88B/FYFtNAX5m17aySWrg==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/preview-api": "7.4.2" @@ -5710,9 +4921,8 @@ }, "node_modules/@storybook/core-common": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.4.2.tgz", - "integrity": "sha512-Qj9S97TYO+jSNdC2+LrMFtZRvTnELeFnRtn/MDWhkM6mpZgRglxlZuXi5enJjqTh0dISAUxPpTtXNAJDfX99JA==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/core-events": "7.4.2", "@storybook/node-logger": "7.4.2", @@ -5745,15 +4955,13 @@ }, "node_modules/@storybook/core-common/node_modules/@types/node": { "version": "16.18.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.51.tgz", - "integrity": "sha512-LKA7ZhY30I8PiUOzBzhtnIULQTACpiEpPXLiYMWyS+tPAORf+rmXUadHZXB/KFrFyMjeHeKc1GFvLd+3f7LE3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/core-events": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", - "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, + "license": "MIT", "dependencies": { "ts-dedent": "^2.0.0" }, @@ -5764,9 +4972,8 @@ }, "node_modules/@storybook/core-server": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.4.2.tgz", - "integrity": "sha512-4aaFQTjb8jsbzJeCs+VTo3gdyK3r3VhQN2sxn6k/lcKjQFeO84+iqGgGmb+oWUVz2TJL+JrNh7SUXkVsMZBXVQ==", "dev": true, + "license": "MIT", "dependencies": { "@aw-web-design/x-default-browser": "1.4.126", "@discoveryjs/json-ext": "^0.5.3", @@ -5818,15 +5025,13 @@ }, "node_modules/@storybook/core-server/node_modules/@types/node": { "version": "16.18.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.51.tgz", - "integrity": "sha512-LKA7ZhY30I8PiUOzBzhtnIULQTACpiEpPXLiYMWyS+tPAORf+rmXUadHZXB/KFrFyMjeHeKc1GFvLd+3f7LE3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/core-webpack": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.4.2.tgz", - "integrity": "sha512-k6YBkExt1XtQSx6E25nE9lCq87hbzkwBlAhzPcFKGeKQia7Uc+l5IG73+9sWXXJ2sbL/7eCaFg4L7payo2aOkw==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/core-common": "7.4.2", "@storybook/node-logger": "7.4.2", @@ -5841,24 +5046,21 @@ }, "node_modules/@storybook/core-webpack/node_modules/@types/node": { "version": "16.18.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.51.tgz", - "integrity": "sha512-LKA7ZhY30I8PiUOzBzhtnIULQTACpiEpPXLiYMWyS+tPAORf+rmXUadHZXB/KFrFyMjeHeKc1GFvLd+3f7LE3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/csf": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.1.tgz", - "integrity": "sha512-4hE3AlNVxR60Wc5KSC68ASYzUobjPqtSKyhV6G+ge0FIXU55N5nTY7dXGRZHQGDBPq+XqchMkIdlkHPRs8nTHg==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^2.19.0" } }, "node_modules/@storybook/csf-plugin": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.4.2.tgz", - "integrity": "sha512-b0yQ8oXEH0s3SGgjhOVrbjkc3C8IYGyTSnDtPwx/Dgmru/rC6LT7ZOdBegmGqBN1+6Ho0+AxFrmAmuuYK8p2rA==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/csf-tools": "7.4.2", "unplugin": "^1.3.1" @@ -5870,9 +5072,8 @@ }, "node_modules/@storybook/csf-tools": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.4.2.tgz", - "integrity": "sha512-5AvF2YRcYHIqQqskb3R8JvsmSWnNwkP0CGmP8Zq7zIfK/C+npKb/onv5YQlbSgh+2UrVxVdIDLc9AepBeXC3uQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/generator": "^7.22.9", "@babel/parser": "^7.22.7", @@ -5891,15 +5092,13 @@ }, "node_modules/@storybook/docs-mdx": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz", - "integrity": "sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/docs-tools": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.4.2.tgz", - "integrity": "sha512-MXW+xaxah+C+aqJ5178oOILqX7dCSwJMKJefIJHHwr9w6UuGRaiPG1NDYK/0N0IEv9H8pNnXPnw3R8S6x7COhQ==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/core-common": "7.4.2", "@storybook/preview-api": "7.4.2", @@ -5915,15 +5114,13 @@ }, "node_modules/@storybook/global": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", - "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/instrumenter": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-7.4.2.tgz", - "integrity": "sha512-g0tYjfv8q6RLl7PK3cyZGcdhad+4BspT1TXHl5Z4DFSo+bqFyHkP6X9tXzrpfQk+3abNrh5EjPaeec4+YHAOEw==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/channels": "7.4.2", "@storybook/client-logger": "7.4.2", @@ -5938,9 +5135,8 @@ }, "node_modules/@storybook/manager": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.4.2.tgz", - "integrity": "sha512-MtjmbAaf4hUObAa2ETQkm0+SzESoPeNm+TyzwZU5qq3Ouj4IOj2Ugd8EJPO3isdHxYt26A255tW/G9mb9v20fQ==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -5948,9 +5144,8 @@ }, "node_modules/@storybook/manager-api": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", - "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/channels": "7.4.2", "@storybook/client-logger": "7.4.2", @@ -5979,15 +5174,13 @@ }, "node_modules/@storybook/mdx2-csf": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz", - "integrity": "sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/nextjs": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-7.4.2.tgz", - "integrity": "sha512-xGZBkp/Z67RhVZJP+eQUApbCliBKYMCGCbt21xCUuoK7ynEuMBL9M3lfOlfV1KI99N/7evQlLkM8gubxhqqZcQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.22.9", "@babel/plugin-proposal-class-properties": "^7.18.6", @@ -6059,15 +5252,13 @@ }, "node_modules/@storybook/nextjs/node_modules/@types/node": { "version": "16.18.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.51.tgz", - "integrity": "sha512-LKA7ZhY30I8PiUOzBzhtnIULQTACpiEpPXLiYMWyS+tPAORf+rmXUadHZXB/KFrFyMjeHeKc1GFvLd+3f7LE3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/node-logger": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.4.2.tgz", - "integrity": "sha512-iSBjhnMpWY9Hs5KGnf/xfHjGtGl740LUg4Gce874DuL773Mdc4hdppSKr4X/Pp1/AD67mNuifSXYx3V7d6XzTQ==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -6075,9 +5266,8 @@ }, "node_modules/@storybook/postinstall": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.4.2.tgz", - "integrity": "sha512-L9r14KqS87HPyXw0S3pK2X29ckel/4sdBSmy9nVF8n/ADafKE0pSLKB935VL0+88eMx06aT32SMcQoqjubGKWw==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -6085,9 +5275,8 @@ }, "node_modules/@storybook/preset-react-webpack": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.4.2.tgz", - "integrity": "sha512-CWWiwZa3/0zHnc6zLvI9Sgj12gJDTktZO87/gfwq2VfbWqAEUYsKs6NE4Pm0Yg9O4/IG8DHoHIB+bTNlLp/lCA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/preset-flow": "^7.22.5", "@babel/preset-react": "^7.22.5", @@ -6129,15 +5318,13 @@ }, "node_modules/@storybook/preset-react-webpack/node_modules/@types/node": { "version": "16.18.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.51.tgz", - "integrity": "sha512-LKA7ZhY30I8PiUOzBzhtnIULQTACpiEpPXLiYMWyS+tPAORf+rmXUadHZXB/KFrFyMjeHeKc1GFvLd+3f7LE3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/preview": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.4.2.tgz", - "integrity": "sha512-T7rAV6qQ7tBeSvgi0RuA5EU8tm1OMhU8PcCqosWGaLhMCR0VMzw1/WGKuR11g1XmzvaAm2xGgMp82nqi4G0i7A==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -6145,9 +5332,8 @@ }, "node_modules/@storybook/preview-api": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", - "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/channels": "7.4.2", "@storybook/client-logger": "7.4.2", @@ -6171,9 +5357,8 @@ }, "node_modules/@storybook/react": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.4.2.tgz", - "integrity": "sha512-8bAnSOpDTiE1c9pSkIKRipvqbuZP6Hu1CYaG1RXWF8AIBsjiV9+SsR919Flj1UiCmcw4BLO/ZIvIDGny4ktHhA==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/core-client": "7.4.2", @@ -6217,9 +5402,8 @@ }, "node_modules/@storybook/react-docgen-typescript-plugin": { "version": "1.0.6--canary.9.0c3f3b7.0", - "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz", - "integrity": "sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "endent": "^2.0.1", @@ -6236,9 +5420,8 @@ }, "node_modules/@storybook/react-dom-shim": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.4.2.tgz", - "integrity": "sha512-9Ae2As3Hf//mdFEAv58VgDbi9R5JRGne8Ai6Vspc5FZMCJIjr5kullckBi3n9uKRg2L8V7wjDRK8Cql2tEr0Yg==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -6250,15 +5433,13 @@ }, "node_modules/@storybook/react/node_modules/@types/node": { "version": "16.18.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.51.tgz", - "integrity": "sha512-LKA7ZhY30I8PiUOzBzhtnIULQTACpiEpPXLiYMWyS+tPAORf+rmXUadHZXB/KFrFyMjeHeKc1GFvLd+3f7LE3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@storybook/router": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", - "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", @@ -6275,9 +5456,8 @@ }, "node_modules/@storybook/store": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/store/-/store-7.4.2.tgz", - "integrity": "sha512-WYwhdyGEtOZlLkbGqfzsTY5IsVuQCz6J00g63bEQwxiCx3ZNco+HXGoQhV/SH3G+em2++1sh6BETFuZ5sbwmkQ==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/preview-api": "7.4.2" @@ -6289,9 +5469,8 @@ }, "node_modules/@storybook/telemetry": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.4.2.tgz", - "integrity": "sha512-ZAh1Bjk9JVpL5j0Aj3PHr3XEDZcOrFeugVyRuuul2gAyu6SbpPhl8Dd2Wr9YJS0ZDWs3u0CgKRCeFPPAi3QosA==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "7.4.2", "@storybook/core-common": "7.4.2", @@ -6309,9 +5488,8 @@ }, "node_modules/@storybook/testing-library": { "version": "0.0.14-next.2", - "resolved": "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.0.14-next.2.tgz", - "integrity": "sha512-i/SLSGm0o978ELok/SB4Qg1sZ3zr+KuuCkzyFqcCD0r/yf+bG35aQGkFqqxfSAdDxuQom0NO02FE+qys5Eapdg==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/client-logger": "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0", "@storybook/instrumenter": "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0", @@ -6322,9 +5500,8 @@ }, "node_modules/@storybook/theming": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", - "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, + "license": "MIT", "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", "@storybook/client-logger": "7.4.2", @@ -6342,9 +5519,8 @@ }, "node_modules/@storybook/types": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", - "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", @@ -6358,10 +5534,9 @@ }, "node_modules/@swc/core": { "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.85.tgz", - "integrity": "sha512-qnoxp+2O0GtvRdYnXgR1v8J7iymGGYpx6f6yCK9KxipOZOjrlKILFANYlghQxZyPUfXwK++TFxfSlX4r9wK+kg==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@swc/types": "^0.1.4" }, @@ -6393,158 +5568,13 @@ } } }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.85.tgz", - "integrity": "sha512-jTikp+i4nO4Ofe6qGm4I3sFeebD1OvueBCHITux5tQKD6umN1c2z4CRGv6K49NIz/qEpUcdr6Qny6K+3yibVFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.85.tgz", - "integrity": "sha512-3uHYkjVU+2F+YbVYtq5rH0uCJIztFTALaS3mQEfQUZKXZ5/8jD5titTCRqFKtSlQg0CzaFZgsYsuqwYBmgN0mA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.85.tgz", - "integrity": "sha512-ouHzAHsFaEOkRuoTAOI/8n2m8BQAAnb4vr/xbMhhDOmix0lp5eNsW5Iac/EcJ2uG6B3n7P2K8oycj9SWkj+pfw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.85.tgz", - "integrity": "sha512-/Z1CZOWiO+NqJEh1J20PIxQFHMH43upQJ1l7FJ5Z7+MyuYF8WkeJ7OSovau729pBR+38vvvccEJrMZIztfv7hQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.85.tgz", - "integrity": "sha512-gfh7CfKavi076dbMBTzfdawSGcYfZ4+1Q+8aRkSesqepKHcIWIJti8Cf3zB4a6CHNhJe+VN0Gb7DEfumydAm1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.85.tgz", - "integrity": "sha512-lWVqjHKzofb9q1qrBM4dLqO7CIisp08/xMS5Hz9DWex1gTc5F2b6yJO6Ceqwa256GMweJcdP6A5EvEFQAiZ5dg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.85.tgz", - "integrity": "sha512-EPJmlfqC05TUetnlErxNRyIp7Nc3B2w9abET6oQ/EgldeAeQnZ3M6svMViET/c2QSomgrU3rdP+Qcozkt62/4A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.85.tgz", - "integrity": "sha512-ibckJDZw8kNosciMexwk0z75ZyUhwtiFMV9rSBpup0opa7NNCUCoERCJ1e9LRyMdhsVUoLpZg/KZiHCdTw96hQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.85.tgz", - "integrity": "sha512-hY4MpHGUVQHL1T2kgRXOigDho4DTIpVPYzJ4uyy8VQRbS7GzN5XtvdGP/fA4zp8+2BQjcig+6J7Y92SY15ouNQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, "node_modules/@swc/core-win32-x64-msvc": { "version": "1.3.85", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.85.tgz", - "integrity": "sha512-ktxWOMFJ0iqKn6WUHtXqi4CS7xkyHmrRtjllGRuGqxmLmDX/HSOfuQ55Tm1KXKk5oHLacJkUbOSF2kBrpZ8dpg==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -6554,24 +5584,21 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.2", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@swc/types": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.4.tgz", - "integrity": "sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@testing-library/dom": { "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -6588,9 +5615,8 @@ }, "node_modules/@testing-library/jest-dom": { "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", "dev": true, + "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.0.1", "@babel/runtime": "^7.9.2", @@ -6610,9 +5636,8 @@ }, "node_modules/@testing-library/jest-dom/node_modules/chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6623,9 +5648,8 @@ }, "node_modules/@testing-library/react": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.0.0.tgz", - "integrity": "sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "@testing-library/dom": "^9.0.0", @@ -6641,9 +5665,8 @@ }, "node_modules/@testing-library/react/node_modules/@testing-library/dom": { "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", - "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -6660,9 +5683,8 @@ }, "node_modules/@testing-library/user-event": { "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -6676,48 +5698,41 @@ }, "node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/aria-query": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -6728,18 +5743,16 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -6747,18 +5760,16 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -6766,57 +5777,50 @@ }, "node_modules/@types/connect": { "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/cross-spawn": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.3.tgz", - "integrity": "sha512-BDAkU7WHHRHnvBf5z89lcvACsvkz/n7Tv+HyD/uW76O29HoH1Tk/W6iQrepaZVbisvlEek4ygwT8IW7ow9XLAA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/d3-color": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.3.tgz", - "integrity": "sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-geo": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-2.0.4.tgz", - "integrity": "sha512-kP0LcPVN6P/42hmFt0kZm93YTscfawZo6tioL9y0Ya2l5rxaGoYrIG4zee+yJoK9cLTOc8E8S5ExqTEYVwjIkw==", "dev": true, + "license": "MIT", "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/d3-interpolate": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz", - "integrity": "sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-color": "^2" } }, "node_modules/@types/d3-selection": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-2.0.1.tgz", - "integrity": "sha512-3mhtPnGE+c71rl/T5HMy+ykg7migAZ4T6gzU0HxpgBFKcasBrSnwRbYV1/UZR6o5fkpySxhWxAhd7yhjj8jL7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-zoom": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-2.0.4.tgz", - "integrity": "sha512-2AiNBuLGScHDORzjsLnnZTlVR+wMVIHWasAGkM6UQI8wKRhpix5njRfO+yysx1FULgaNYV1cby3TttVRo/ZT9A==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-interpolate": "^2", "@types/d3-selection": "^2" @@ -6824,39 +5828,33 @@ }, "node_modules/@types/detect-port": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.3.tgz", - "integrity": "sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/doctrine": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz", - "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ejs": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz", - "integrity": "sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/emscripten": { "version": "1.39.7", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.7.tgz", - "integrity": "sha512-tLqYV94vuqDrXh515F/FOGtBcRMTPGvVV1LzLbtYDcQmmhtpf/gLYf+hikBbQk8MzOHNz37wpFfJbYAuSn8HqA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/escodegen": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz", - "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/eslint": { "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -6864,9 +5862,8 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -6874,15 +5871,13 @@ }, "node_modules/@types/estree": { "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -6892,9 +5887,8 @@ }, "node_modules/@types/express-serve-static-core": { "version": "4.17.36", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", - "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -6904,66 +5898,57 @@ }, "node_modules/@types/find-cache-dir": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz", - "integrity": "sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/geojson": { "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/graceful-fs": { "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { "version": "29.5.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", - "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -6971,9 +5956,8 @@ }, "node_modules/@types/jest/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6983,9 +5967,8 @@ }, "node_modules/@types/jest/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -6997,15 +5980,13 @@ }, "node_modules/@types/jest/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/jsdom": { "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", @@ -7014,56 +5995,47 @@ }, "node_modules/@types/json-schema": { "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.14.198", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", - "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mdx": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.7.tgz", - "integrity": "sha512-BG4tyr+4amr3WsSEmHn/fXPqaCba/AYZ7dsaQTiavihQunHSIxk+uAtqsjvicNpyHN6cm+B9RVrUOtW9VzIKHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime-types": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz", - "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "20.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz", - "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==" + "license": "MIT" }, "node_modules/@types/node-fetch": { "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "form-data": "^4.0.0" @@ -7071,43 +6043,36 @@ }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/pretty-hrtime": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", - "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "license": "MIT" }, "node_modules/@types/qs": { "version": "6.9.8", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/react": { "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", - "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -7116,17 +6081,15 @@ }, "node_modules/@types/react-dom": { "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-simple-maps": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/react-simple-maps/-/react-simple-maps-3.0.0.tgz", - "integrity": "sha512-yj1gBs7R+yq0OaHzQgwcRvzaHQxNBny1myl7NaICeBjToTG2sQK2Tq18lflojtLTm8vOLeFuA3EaYW+L8SkrAQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-geo": "^2", "@types/d3-zoom": "^2", @@ -7136,20 +6099,17 @@ }, "node_modules/@types/scheduler": { "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + "license": "MIT" }, "node_modules/@types/semver": { "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -7157,9 +6117,8 @@ }, "node_modules/@types/serve-static": { "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -7168,51 +6127,44 @@ }, "node_modules/@types/stack-utils": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", - "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", "dev": true, + "license": "MIT", "dependencies": { "@types/jest": "*" } }, "node_modules/@types/tough-cookie": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", - "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/unist": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/parser": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -7237,9 +6189,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" @@ -7254,9 +6205,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -7267,9 +6217,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -7294,9 +6243,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -7320,9 +6268,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -7333,18 +6280,16 @@ }, "node_modules/@typescript-eslint/utils/node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -7359,9 +6304,8 @@ }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -7369,27 +6313,23 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -7398,15 +6338,13 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -7416,33 +6354,29 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -7456,9 +6390,8 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -7469,9 +6402,8 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -7481,9 +6413,8 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -7495,9 +6426,8 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -7505,21 +6435,18 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@yarnpkg/esbuild-plugin-pnp": { "version": "3.0.0-rc.15", - "resolved": "https://registry.npmjs.org/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz", - "integrity": "sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "tslib": "^2.4.0" }, @@ -7532,9 +6459,8 @@ }, "node_modules/@yarnpkg/fslib": { "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz", - "integrity": "sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@yarnpkg/libzip": "^2.3.0", "tslib": "^1.13.0" @@ -7545,15 +6471,13 @@ }, "node_modules/@yarnpkg/fslib/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@yarnpkg/libzip": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz", - "integrity": "sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@types/emscripten": "^1.39.6", "tslib": "^1.13.0" @@ -7564,21 +6488,18 @@ }, "node_modules/@yarnpkg/libzip/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/abab": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -7588,9 +6509,8 @@ }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -7601,9 +6521,8 @@ }, "node_modules/acorn": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -7613,9 +6532,8 @@ }, "node_modules/acorn-globals": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.1.0", "acorn-walk": "^8.0.2" @@ -7623,9 +6541,8 @@ }, "node_modules/acorn-globals/node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -7635,45 +6552,40 @@ }, "node_modules/acorn-globals/node_modules/acorn-walk": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -7684,9 +6596,8 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -7698,9 +6609,8 @@ }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -7710,9 +6620,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -7723,9 +6632,8 @@ }, "node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -7739,9 +6647,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -7756,9 +6663,8 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -7768,9 +6674,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -7783,9 +6688,8 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7795,30 +6699,27 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -7831,15 +6732,13 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -7850,30 +6749,26 @@ }, "node_modules/app-root-dir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/arg": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/aria-hidden": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", - "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -7883,18 +6778,16 @@ }, "node_modules/aria-query": { "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" } }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -7905,21 +6798,18 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/array-ify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/array-includes": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -7936,18 +6826,16 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array.prototype.findlastindex": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -7964,9 +6852,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -7982,9 +6869,8 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -8000,9 +6886,8 @@ }, "node_modules/array.prototype.tosorted": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -8013,9 +6898,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -8034,18 +6918,16 @@ }, "node_modules/arrify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/asn1.js": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -8055,15 +6937,13 @@ }, "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/assert": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", @@ -8074,9 +6954,8 @@ }, "node_modules/ast-types": { "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -8086,41 +6965,34 @@ }, "node_modules/ast-types-flow": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/async": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/async-limiter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/asynciterator.prototype": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" } }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/autoprefixer": { "version": "10.4.15", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", - "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", "dev": true, "funding": [ { @@ -8136,6 +7008,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "browserslist": "^4.21.10", "caniuse-lite": "^1.0.30001520", @@ -8156,9 +7029,8 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8168,36 +7040,32 @@ }, "node_modules/axe-core": { "version": "4.8.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.1.tgz", - "integrity": "sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==", "dev": true, + "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/axobject-query": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" } }, "node_modules/babel-core": { "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", "dev": true, + "license": "MIT", "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -8216,9 +7084,8 @@ }, "node_modules/babel-loader": { "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, + "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -8233,9 +7100,8 @@ }, "node_modules/babel-loader/node_modules/find-cache-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, + "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -8249,9 +7115,8 @@ }, "node_modules/babel-loader/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -8265,9 +7130,8 @@ }, "node_modules/babel-loader/node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -8280,9 +7144,8 @@ }, "node_modules/babel-loader/node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -8295,9 +7158,8 @@ }, "node_modules/babel-loader/node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -8310,18 +7172,16 @@ }, "node_modules/babel-loader/node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/babel-loader/node_modules/pkg-dir": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -8334,9 +7194,8 @@ }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -8353,9 +7212,8 @@ }, "node_modules/babel-loader/node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -8365,15 +7223,13 @@ }, "node_modules/babel-plugin-add-react-displayname": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", - "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -8387,9 +7243,8 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -8402,15 +7257,13 @@ }, "node_modules/babel-plugin-named-exports-order": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-named-exports-order/-/babel-plugin-named-exports-order-0.0.2.tgz", - "integrity": "sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.4.2", @@ -8422,18 +7275,16 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.2", "core-js-compat": "^3.31.0" @@ -8444,9 +7295,8 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.2" }, @@ -8456,9 +7306,8 @@ }, "node_modules/babel-plugin-react-docgen": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz", - "integrity": "sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==", "dev": true, + "license": "MIT", "dependencies": { "ast-types": "^0.14.2", "lodash": "^4.17.15", @@ -8467,9 +7316,8 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -8490,9 +7338,8 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -8506,14 +7353,11 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -8528,13 +7372,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/better-opn": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, + "license": "MIT", "dependencies": { "open": "^8.0.4" }, @@ -8544,36 +7388,32 @@ }, "node_modules/big-integer": { "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "dev": true, + "license": "Unlicense", "engines": { "node": ">=0.6" } }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -8582,8 +7422,6 @@ }, "node_modules/bl/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -8599,6 +7437,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -8606,9 +7445,8 @@ }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8620,15 +7458,13 @@ }, "node_modules/bn.js": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -8650,24 +7486,21 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -8680,15 +7513,13 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/bplist-parser": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "dev": true, + "license": "MIT", "dependencies": { "big-integer": "^1.6.44" }, @@ -8698,9 +7529,8 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8708,9 +7538,8 @@ }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -8720,21 +7549,17 @@ }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/browser-assert": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", - "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", "dev": true }, "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, + "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -8746,9 +7571,8 @@ }, "node_modules/browserify-cipher": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, + "license": "MIT", "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -8757,9 +7581,8 @@ }, "node_modules/browserify-des": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -8769,9 +7592,8 @@ }, "node_modules/browserify-rsa": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -8779,9 +7601,8 @@ }, "node_modules/browserify-sign": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, + "license": "ISC", "dependencies": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -8796,9 +7617,8 @@ }, "node_modules/browserify-sign/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8810,17 +7630,14 @@ }, "node_modules/browserify-zlib": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, + "license": "MIT", "dependencies": { "pako": "~1.0.5" } }, "node_modules/browserslist": { "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -8836,6 +7653,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001517", "electron-to-chromium": "^1.4.477", @@ -8851,17 +7669,14 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -8877,6 +7692,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -8884,35 +7700,29 @@ }, "node_modules/buffer-crc32": { "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/builtin-status-codes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/busboy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -8922,18 +7732,16 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/c8": { "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", "dev": true, + "license": "ISC", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@istanbuljs/schema": "^0.1.3", @@ -8957,9 +7765,8 @@ }, "node_modules/c8/node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -8968,15 +7775,13 @@ }, "node_modules/c8/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/c8/node_modules/foreground-child": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -8987,9 +7792,8 @@ }, "node_modules/c8/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9001,9 +7805,8 @@ }, "node_modules/c8/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9018,9 +7821,8 @@ }, "node_modules/c8/node_modules/yargs": { "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -9036,9 +7838,8 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -9049,18 +7850,16 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -9068,27 +7867,24 @@ }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase-css": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/camelcase-keys": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -9103,8 +7899,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "funding": [ { "type": "opencollective", @@ -9118,22 +7912,21 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9147,17 +7940,15 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/chart.js": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.0.tgz", - "integrity": "sha512-vQEj6d+z0dcsKLlQvbKIMYFHd3t8W/7L2vfJIbYcfyPcRx92CsHqECpueN8qVGNlKyDcr5wBrYAYKnfu/9Q1hQ==", + "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -9167,8 +7958,6 @@ }, "node_modules/chokidar": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "funding": [ { @@ -9176,6 +7965,7 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -9194,9 +7984,8 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -9206,26 +7995,22 @@ }, "node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/chrome-trace-event": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, "funding": [ { @@ -9233,15 +8018,15 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -9249,20 +8034,17 @@ }, "node_modules/cjs-module-lexer": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/classnames": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + "license": "MIT" }, "node_modules/clean-css": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", "dev": true, + "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -9272,27 +8054,24 @@ }, "node_modules/clean-css/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -9302,9 +8081,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -9314,9 +8092,8 @@ }, "node_modules/cli-table3": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -9329,15 +8106,13 @@ }, "node_modules/cli-table3/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cli-table3/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9349,14 +8124,12 @@ }, "node_modules/client-only": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -9368,15 +8141,13 @@ }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9388,9 +8159,8 @@ }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9405,18 +8175,16 @@ }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/clone-deep": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -9428,9 +8196,8 @@ }, "node_modules/clone-deep/node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -9440,9 +8207,8 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -9450,15 +8216,13 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9468,21 +8232,18 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -9492,30 +8253,26 @@ }, "node_modules/commander": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/common-path-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compare-func": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, + "license": "MIT", "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" @@ -9523,9 +8280,8 @@ }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -9535,9 +8291,8 @@ }, "node_modules/compression": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -9553,48 +8308,42 @@ }, "node_modules/compression/node_modules/bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "engines": [ "node >= 0.8" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -9604,15 +8353,13 @@ }, "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9625,42 +8372,35 @@ }, "node_modules/concat-stream/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/confusing-browser-globals": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/console-browserify": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, "node_modules/constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -9670,18 +8410,16 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/conventional-changelog-angular": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz", - "integrity": "sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==", "dev": true, + "license": "ISC", "dependencies": { "compare-func": "^2.0.0" }, @@ -9691,9 +8429,8 @@ }, "node_modules/conventional-changelog-conventionalcommits": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz", - "integrity": "sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==", "dev": true, + "license": "ISC", "dependencies": { "compare-func": "^2.0.0" }, @@ -9703,9 +8440,8 @@ }, "node_modules/conventional-commits-parser": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", - "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", "dev": true, + "license": "MIT", "dependencies": { "is-text-path": "^1.0.1", "JSONStream": "^1.3.5", @@ -9721,30 +8457,26 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/core-js-compat": { "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", - "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.21.10" }, @@ -9755,10 +8487,9 @@ }, "node_modules/core-js-pure": { "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.2.tgz", - "integrity": "sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -9766,15 +8497,13 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, + "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -9798,9 +8527,8 @@ }, "node_modules/cosmiconfig-typescript-loader": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", - "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=v14.21.3" }, @@ -9813,15 +8541,13 @@ }, "node_modules/cosmiconfig/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/cosmiconfig/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -9831,9 +8557,8 @@ }, "node_modules/create-ecdh": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -9841,15 +8566,13 @@ }, "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -9860,9 +8583,8 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -9874,9 +8596,8 @@ }, "node_modules/create-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -9895,15 +8616,13 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -9915,9 +8634,8 @@ }, "node_modules/crypto-browserify": { "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, + "license": "MIT", "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -9937,18 +8655,16 @@ }, "node_modules/crypto-random-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/css-loader": { "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.21", @@ -9972,9 +8688,8 @@ }, "node_modules/css-select": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -9988,9 +8703,8 @@ }, "node_modules/css-what": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -10000,15 +8714,13 @@ }, "node_modules/css.escape": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -10018,15 +8730,13 @@ }, "node_modules/cssom": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cssstyle": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, + "license": "MIT", "dependencies": { "cssom": "~0.3.6" }, @@ -10036,14 +8746,12 @@ }, "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/csstype": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "license": "MIT" }, "node_modules/d3-array": { "version": "2.12.1", @@ -10132,24 +8840,21 @@ }, "node_modules/damerau-levenshtein": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/dargs": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/data-urls": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -10161,9 +8866,8 @@ }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -10178,18 +8882,16 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -10203,30 +8905,26 @@ }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decimal.js": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dedent": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deep-equal": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", - "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -10253,24 +8951,21 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-browser-id": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, + "license": "MIT", "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" @@ -10284,9 +8979,8 @@ }, "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -10296,9 +8990,8 @@ }, "node_modules/define-data-property": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -10310,18 +9003,16 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -10336,15 +9027,13 @@ }, "node_modules/defu": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz", - "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/del": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, + "license": "MIT", "dependencies": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", @@ -10364,36 +9053,32 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/des.js": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -10401,9 +9086,8 @@ }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -10411,33 +9095,29 @@ }, "node_modules/detect-indent": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/detect-node-es": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/detect-package-manager": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", - "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.1.1" }, @@ -10447,9 +9127,8 @@ }, "node_modules/detect-port": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, + "license": "MIT", "dependencies": { "address": "^1.0.1", "debug": "4" @@ -10461,33 +9140,29 @@ }, "node_modules/didyoumean": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -10496,15 +9171,13 @@ }, "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -10514,15 +9187,13 @@ }, "node_modules/dlv": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -10532,24 +9203,21 @@ }, "node_modules/dom-accessibility-api": { "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dom-converter": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, + "license": "MIT", "dependencies": { "utila": "~0.4" } }, "node_modules/dom-serializer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -10561,18 +9229,16 @@ }, "node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/domain-browser": { "version": "4.22.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -10582,21 +9248,19 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domexception": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "dev": true, + "license": "MIT", "dependencies": { "webidl-conversions": "^7.0.0" }, @@ -10606,9 +9270,8 @@ }, "node_modules/domhandler": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -10621,9 +9284,8 @@ }, "node_modules/domutils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -10635,9 +9297,8 @@ }, "node_modules/dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -10645,9 +9306,8 @@ }, "node_modules/dot-prop": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -10657,9 +9317,8 @@ }, "node_modules/dotenv": { "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -10669,18 +9328,16 @@ }, "node_modules/dotenv-expand": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, "node_modules/duplexify": { "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -10690,15 +9347,13 @@ }, "node_modules/duplexify/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/duplexify/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -10711,36 +9366,31 @@ }, "node_modules/duplexify/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/duplexify/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ejs": { "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -10753,15 +9403,13 @@ }, "node_modules/electron-to-chromium": { "version": "1.4.522", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.522.tgz", - "integrity": "sha512-KGKjcafTpOxda0kqwQ72M0tDmX6RsGhUJTy0Hr7slt0+CgHh9Oex8JdjY9Og68dUkTLUlBOJC0A5W5Mw3QSGCg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/elliptic": { "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -10774,15 +9422,13 @@ }, "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -10792,42 +9438,37 @@ }, "node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/endent": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", - "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", "dev": true, + "license": "MIT", "dependencies": { "dedent": "^0.7.0", "fast-json-parse": "^1.0.3", @@ -10836,9 +9477,8 @@ }, "node_modules/enhanced-resolve": { "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -10849,9 +9489,8 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -10861,9 +9500,8 @@ }, "node_modules/envinfo": { "version": "7.10.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", - "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -10873,27 +9511,24 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/error-stack-parser": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/es-abstract": { "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", @@ -10944,9 +9579,8 @@ }, "node_modules/es-get-iterator": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -10964,9 +9598,8 @@ }, "node_modules/es-iterator-helpers": { "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, + "license": "MIT", "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", @@ -10986,15 +9619,13 @@ }, "node_modules/es-module-lexer": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-set-tostringtag": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -11006,18 +9637,16 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, + "license": "MIT", "dependencies": { "has": "^1.0.3" } }, "node_modules/es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -11032,10 +9661,9 @@ }, "node_modules/esbuild": { "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -11069,15 +9697,13 @@ }, "node_modules/esbuild-plugin-alias": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz", - "integrity": "sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esbuild-register": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", - "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -11087,24 +9713,21 @@ }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -11114,9 +9737,8 @@ }, "node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -11135,9 +9757,8 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -11145,9 +9766,8 @@ }, "node_modules/eslint": { "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -11199,9 +9819,8 @@ }, "node_modules/eslint-config-airbnb-base": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, + "license": "MIT", "dependencies": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", @@ -11218,27 +9837,25 @@ }, "node_modules/eslint-config-airbnb-base/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-config-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz", - "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==", + "version": "13.5.2", "dev": true, + "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "13.4.19", - "@rushstack/eslint-patch": "^1.1.3", + "@next/eslint-plugin-next": "13.5.2", + "@rushstack/eslint-patch": "^1.3.3", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { @@ -11253,9 +9870,8 @@ }, "node_modules/eslint-config-prettier": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -11265,9 +9881,8 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -11276,18 +9891,16 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", - "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", "dev": true, + "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -11310,9 +9923,8 @@ }, "node_modules/eslint-module-utils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -11327,18 +9939,16 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.findlastindex": "^1.2.2", @@ -11367,18 +9977,16 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -11388,9 +9996,8 @@ }, "node_modules/eslint-plugin-import/node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -11400,27 +10007,24 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-import/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -11430,9 +10034,8 @@ }, "node_modules/eslint-plugin-jest": { "version": "27.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.4.0.tgz", - "integrity": "sha512-ukVeKmMPAUA5SWjHenvyyXnirKfHKMdOsTZdn5tZx5EW05HGVQwBohigjFZGGj3zuv1cV6hc82FvWv6LdIbkgg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^5.10.0" }, @@ -11455,9 +10058,8 @@ }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", "aria-query": "^5.1.3", @@ -11485,18 +10087,16 @@ }, "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-prettier": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0" }, @@ -11515,9 +10115,8 @@ }, "node_modules/eslint-plugin-react": { "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", @@ -11545,9 +10144,8 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -11557,9 +10155,8 @@ }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -11569,9 +10166,8 @@ }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -11586,18 +10182,16 @@ }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-storybook": { "version": "0.6.13", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.13.tgz", - "integrity": "sha512-smd+CS0WH1jBqUEJ3znGS7DU4ayBE9z6lkQAK2yrSUv1+rq8BT/tiI5C/rKE7rmiqiAfojtNYZRhzo5HrulccQ==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/csf": "^0.0.1", "@typescript-eslint/utils": "^5.45.0", @@ -11613,18 +10207,16 @@ }, "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", - "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.15" } }, "node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -11638,9 +10230,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -11650,9 +10241,8 @@ }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -11666,15 +10256,13 @@ }, "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/eslint/node_modules/globals": { "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -11687,9 +10275,8 @@ }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -11699,15 +10286,13 @@ }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -11717,9 +10302,8 @@ }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -11734,9 +10318,8 @@ }, "node_modules/espree/node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -11746,9 +10329,8 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -11759,9 +10341,8 @@ }, "node_modules/esquery": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -11771,9 +10352,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -11783,18 +10363,16 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-to-babel": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz", - "integrity": "sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.1.6", "@babel/types": "^7.2.0", @@ -11806,45 +10384,40 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, + "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -11852,9 +10425,8 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -11875,8 +10447,6 @@ }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -11884,9 +10454,8 @@ }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -11900,9 +10469,8 @@ }, "node_modules/express": { "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -11942,24 +10510,21 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -11972,15 +10537,13 @@ }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/extract-zip": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "concat-stream": "^1.6.2", "debug": "^2.6.9", @@ -11993,36 +10556,31 @@ }, "node_modules/extract-zip/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/extract-zip/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -12036,9 +10594,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -12048,60 +10605,52 @@ }, "node_modules/fast-json-parse": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", - "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, "node_modules/fd-slicer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, + "license": "MIT", "dependencies": { "pend": "~1.2.0" } }, "node_modules/fetch-retry": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz", - "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -12111,9 +10660,8 @@ }, "node_modules/file-system-cache": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz", - "integrity": "sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==", "dev": true, + "license": "MIT", "dependencies": { "fs-extra": "11.1.1", "ramda": "0.29.0" @@ -12121,27 +10669,24 @@ }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12151,9 +10696,8 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -12163,18 +10707,16 @@ }, "node_modules/filter-obj": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", - "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -12190,24 +10732,21 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -12222,9 +10761,8 @@ }, "node_modules/find-cache-dir/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -12235,9 +10773,8 @@ }, "node_modules/find-cache-dir/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -12247,9 +10784,8 @@ }, "node_modules/find-cache-dir/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -12262,9 +10798,8 @@ }, "node_modules/find-cache-dir/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -12274,9 +10809,8 @@ }, "node_modules/find-cache-dir/node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -12286,9 +10820,8 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -12302,9 +10835,8 @@ }, "node_modules/flat-cache": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.7", "keyv": "^4.5.3", @@ -12316,33 +10848,29 @@ }, "node_modules/flatted": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/flow-parser": { "version": "0.216.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.216.1.tgz", - "integrity": "sha512-wstw46/C/8bRv/8RySCl15lK376j8DHxm41xFjD9eVL+jSS1UmVpbdLdA0LzGuS2v5uGgQiBLEj6mgSJQwW+MA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/for-each": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -12356,9 +10884,8 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -12368,9 +10895,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", - "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", @@ -12396,9 +10922,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -12412,9 +10937,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -12426,18 +10950,16 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/form-data": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -12449,18 +10971,16 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, @@ -12471,24 +10991,21 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fs-extra": { "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -12500,9 +11017,8 @@ }, "node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -12512,9 +11028,8 @@ }, "node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -12524,47 +11039,28 @@ }, "node_modules/fs-minipass/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fs-monkey": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/function.prototype.name": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -12580,36 +11076,32 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -12622,36 +11114,32 @@ }, "node_modules/get-nonce": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/get-npm-tarball-url": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.0.3.tgz", - "integrity": "sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.17" } }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-port": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -12661,9 +11149,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -12673,9 +11160,8 @@ }, "node_modules/get-symbol-description": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -12689,9 +11175,8 @@ }, "node_modules/get-tsconfig": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", - "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", "dev": true, + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -12701,9 +11186,8 @@ }, "node_modules/giget": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", - "integrity": "sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.19", "defu": "^6.1.2", @@ -12719,9 +11203,8 @@ }, "node_modules/git-raw-commits": { "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, + "license": "MIT", "dependencies": { "dargs": "^7.0.0", "lodash": "^4.17.15", @@ -12738,15 +11221,13 @@ }, "node_modules/github-slugger": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/glob": { "version": "10.3.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", - "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", @@ -12766,9 +11247,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -12778,23 +11258,20 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12807,9 +11284,8 @@ }, "node_modules/global-dirs": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.4" }, @@ -12819,18 +11295,16 @@ }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globalthis": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -12843,9 +11317,8 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -12863,9 +11336,8 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -12875,20 +11347,17 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gunzip-maybe": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", - "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", "dev": true, + "license": "MIT", "dependencies": { "browserify-zlib": "^0.1.4", "is-deflate": "^1.0.0", @@ -12903,30 +11372,26 @@ }, "node_modules/gunzip-maybe/node_modules/browserify-zlib": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", "dev": true, + "license": "MIT", "dependencies": { "pako": "~0.2.0" } }, "node_modules/gunzip-maybe/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gunzip-maybe/node_modules/pako": { "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gunzip-maybe/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -12939,24 +11404,21 @@ }, "node_modules/gunzip-maybe/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gunzip-maybe/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/gunzip-maybe/node_modules/through2": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -12964,9 +11426,8 @@ }, "node_modules/handlebars": { "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -12985,27 +11446,24 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/hard-rejection": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1" }, @@ -13015,27 +11473,24 @@ }, "node_modules/has-bigints": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -13045,9 +11500,8 @@ }, "node_modules/has-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13057,9 +11511,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13069,9 +11522,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -13084,9 +11536,8 @@ }, "node_modules/hash-base": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -13098,9 +11549,8 @@ }, "node_modules/hash-base/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -13112,9 +11562,8 @@ }, "node_modules/hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -13122,18 +11571,16 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -13142,17 +11589,15 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, "node_modules/hosted-git-info": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -13162,9 +11607,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -13174,15 +11618,13 @@ }, "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-encoding": "^2.0.0" }, @@ -13192,8 +11634,6 @@ }, "node_modules/html-entities": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", "dev": true, "funding": [ { @@ -13204,19 +11644,18 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ] + ], + "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -13235,9 +11674,8 @@ }, "node_modules/html-tags": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -13247,9 +11685,8 @@ }, "node_modules/html-webpack-plugin": { "version": "5.5.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", - "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", "dev": true, + "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -13270,8 +11707,6 @@ }, "node_modules/htmlparser2": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -13280,6 +11715,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -13289,18 +11725,16 @@ }, "node_modules/htmlparser2/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -13314,9 +11748,8 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -13328,15 +11761,13 @@ }, "node_modules/https-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -13347,18 +11778,16 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/husky": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true, + "license": "MIT", "bin": { "husky": "lib/bin.js" }, @@ -13371,9 +11800,8 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -13383,9 +11811,8 @@ }, "node_modules/icss-utils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -13395,8 +11822,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, "funding": [ { @@ -13411,22 +11836,21 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/image-size": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", "dev": true, + "license": "MIT", "dependencies": { "queue": "6.0.2" }, @@ -13439,9 +11863,8 @@ }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -13455,18 +11878,16 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/import-local": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -13483,9 +11904,8 @@ }, "node_modules/import-local/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -13496,9 +11916,8 @@ }, "node_modules/import-local/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -13508,9 +11927,8 @@ }, "node_modules/import-local/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -13523,9 +11941,8 @@ }, "node_modules/import-local/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -13535,9 +11952,8 @@ }, "node_modules/import-local/node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -13547,27 +11963,24 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -13575,21 +11988,18 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -13606,42 +12016,37 @@ }, "node_modules/invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/ip": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/is-absolute-url": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-arguments": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -13655,9 +12060,8 @@ }, "node_modules/is-array-buffer": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -13669,15 +12073,13 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-async-function": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -13690,9 +12092,8 @@ }, "node_modules/is-bigint": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -13702,9 +12103,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -13714,9 +12114,8 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -13730,9 +12129,8 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13742,9 +12140,8 @@ }, "node_modules/is-core-module": { "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, + "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -13754,9 +12151,8 @@ }, "node_modules/is-date-object": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -13769,15 +12165,13 @@ }, "node_modules/is-deflate": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -13790,18 +12184,16 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -13811,27 +12203,24 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-generator-function": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -13844,9 +12233,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -13856,36 +12244,32 @@ }, "node_modules/is-gzip": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-map": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-nan": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -13899,9 +12283,8 @@ }, "node_modules/is-negative-zero": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13911,18 +12294,16 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -13935,60 +12316,53 @@ }, "node_modules/is-obj": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-path-cwd": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-regex": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -14002,18 +12376,16 @@ }, "node_modules/is-set": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -14023,9 +12395,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -14035,9 +12406,8 @@ }, "node_modules/is-string": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -14050,9 +12420,8 @@ }, "node_modules/is-symbol": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -14065,9 +12434,8 @@ }, "node_modules/is-text-path": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, + "license": "MIT", "dependencies": { "text-extensions": "^1.0.0" }, @@ -14077,9 +12445,8 @@ }, "node_modules/is-typed-array": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.11" }, @@ -14092,9 +12459,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14104,18 +12470,16 @@ }, "node_modules/is-weakmap": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -14125,9 +12489,8 @@ }, "node_modules/is-weakset": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -14138,9 +12501,8 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -14150,39 +12512,34 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -14196,18 +12553,16 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -14219,9 +12574,8 @@ }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -14234,9 +12588,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -14248,18 +12601,16 @@ }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -14270,9 +12621,8 @@ }, "node_modules/iterator.prototype": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", @@ -14283,9 +12633,8 @@ }, "node_modules/jackspeak": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.3.tgz", - "integrity": "sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -14301,9 +12650,8 @@ }, "node_modules/jake": { "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -14319,9 +12667,8 @@ }, "node_modules/jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -14345,9 +12692,8 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -14359,9 +12705,8 @@ }, "node_modules/jest-circus": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -14390,9 +12735,8 @@ }, "node_modules/jest-circus/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14402,9 +12746,8 @@ }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -14416,9 +12759,8 @@ }, "node_modules/jest-circus/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -14430,15 +12772,13 @@ }, "node_modules/jest-circus/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-cli": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -14469,9 +12809,8 @@ }, "node_modules/jest-config": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -14514,9 +12853,8 @@ }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14526,9 +12864,8 @@ }, "node_modules/jest-config/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14546,9 +12883,8 @@ }, "node_modules/jest-config/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -14560,15 +12896,13 @@ }, "node_modules/jest-config/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -14581,9 +12915,8 @@ }, "node_modules/jest-diff/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14593,9 +12926,8 @@ }, "node_modules/jest-diff/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -14607,15 +12939,13 @@ }, "node_modules/jest-diff/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-docblock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -14625,9 +12955,8 @@ }, "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -14641,9 +12970,8 @@ }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14653,9 +12981,8 @@ }, "node_modules/jest-each/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -14667,15 +12994,13 @@ }, "node_modules/jest-each/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-environment-jsdom": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -14700,9 +13025,8 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -14717,18 +13041,16 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -14751,9 +13073,8 @@ }, "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -14764,9 +13085,8 @@ }, "node_modules/jest-leak-detector/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14776,9 +13096,8 @@ }, "node_modules/jest-leak-detector/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -14790,15 +13109,13 @@ }, "node_modules/jest-leak-detector/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -14811,9 +13128,8 @@ }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14823,9 +13139,8 @@ }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -14837,15 +13152,13 @@ }, "node_modules/jest-matcher-utils/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -14863,9 +13176,8 @@ }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14875,9 +13187,8 @@ }, "node_modules/jest-message-util/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -14889,15 +13200,13 @@ }, "node_modules/jest-message-util/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -14909,9 +13218,8 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -14926,18 +13234,16 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -14955,9 +13261,8 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -14968,9 +13273,8 @@ }, "node_modules/jest-runner": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -15000,9 +13304,8 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -15033,9 +13336,8 @@ }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15053,9 +13355,8 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -15084,9 +13385,8 @@ }, "node_modules/jest-snapshot/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15096,9 +13396,8 @@ }, "node_modules/jest-snapshot/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -15110,15 +13409,13 @@ }, "node_modules/jest-snapshot/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -15133,9 +13430,8 @@ }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -15150,9 +13446,8 @@ }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15162,9 +13457,8 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15174,9 +13468,8 @@ }, "node_modules/jest-validate/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -15188,15 +13481,13 @@ }, "node_modules/jest-validate/node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -15213,9 +13504,8 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -15228,9 +13518,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -15243,23 +13532,20 @@ }, "node_modules/jiti": { "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", "dev": true, + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -15270,9 +13556,8 @@ }, "node_modules/jscodeshift": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", - "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.13.16", "@babel/parser": "^7.13.16", @@ -15303,9 +13588,8 @@ }, "node_modules/jscodeshift/node_modules/ast-types": { "version": "0.15.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", - "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -15315,9 +13599,8 @@ }, "node_modules/jscodeshift/node_modules/recast": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", - "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", "dev": true, + "license": "MIT", "dependencies": { "ast-types": "0.15.2", "esprima": "~4.0.0", @@ -15330,18 +13613,16 @@ }, "node_modules/jscodeshift/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/jscodeshift/node_modules/write-file-atomic": { "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, + "license": "ISC", "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -15350,9 +13631,8 @@ }, "node_modules/jsdom": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.6", "acorn": "^8.8.1", @@ -15395,9 +13675,8 @@ }, "node_modules/jsdom/node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -15407,9 +13686,8 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -15419,33 +13697,28 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -15455,9 +13728,8 @@ }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -15467,18 +13739,16 @@ }, "node_modules/jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" - ] + ], + "license": "MIT" }, "node_modules/JSONStream": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, + "license": "(MIT OR Apache-2.0)", "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -15492,9 +13762,8 @@ }, "node_modules/jsx-ast-utils": { "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -15507,60 +13776,53 @@ }, "node_modules/keyv": { "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/klona": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/language-subtag-registry": { "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/language-tags": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", "dev": true, + "license": "MIT", "dependencies": { "language-subtag-registry": "~0.3.2" } }, "node_modules/lazy-universal-dotenv": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz", - "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "app-root-dir": "^1.0.2", "dotenv": "^16.0.0", @@ -15572,18 +13834,16 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -15594,42 +13854,37 @@ }, "node_modules/lilconfig": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loader-runner": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -15642,81 +13897,68 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isfunction": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.kebabcase": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.mergewith": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.snakecase": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.startcase": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.upperfirst": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -15730,8 +13972,7 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -15741,36 +13982,32 @@ }, "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/lz-string": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, + "license": "MIT", "bin": { "lz-string": "bin/bin.js" } }, "node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -15783,33 +14020,29 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/map-obj": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -15819,15 +14052,13 @@ }, "node_modules/map-or-similar": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/markdown-to-jsx": { "version": "7.3.2", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz", - "integrity": "sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" }, @@ -15837,9 +14068,8 @@ }, "node_modules/md5.js": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -15848,9 +14078,8 @@ }, "node_modules/mdast-util-definitions": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", "dev": true, + "license": "MIT", "dependencies": { "unist-util-visit": "^2.0.0" }, @@ -15861,9 +14090,8 @@ }, "node_modules/mdast-util-to-string": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", - "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -15871,18 +14099,16 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, + "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" }, @@ -15892,18 +14118,16 @@ }, "node_modules/memoizerific": { "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", "dev": true, + "license": "MIT", "dependencies": { "map-or-similar": "^1.5.0" } }, "node_modules/meow": { "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -15926,9 +14150,8 @@ }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -15938,39 +14161,34 @@ }, "node_modules/merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -15981,9 +14199,8 @@ }, "node_modules/miller-rabin": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -15994,15 +14211,13 @@ }, "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -16012,18 +14227,16 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -16033,39 +14246,34 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/min-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -16075,18 +14283,16 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -16098,18 +14304,16 @@ }, "node_modules/minipass": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -16120,9 +14324,8 @@ }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -16132,15 +14335,13 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -16150,30 +14351,26 @@ }, "node_modules/mkdirp-classic": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mz": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -16182,14 +14379,13 @@ }, "node_modules/nanoid": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -16199,32 +14395,28 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.19.tgz", - "integrity": "sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==", + "version": "13.5.2", + "license": "MIT", "dependencies": { - "@next/env": "13.4.19", - "@swc/helpers": "0.5.1", + "@next/env": "13.5.2", + "@swc/helpers": "0.5.2", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", @@ -16236,18 +14428,18 @@ "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=16.14.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.19", - "@next/swc-darwin-x64": "13.4.19", - "@next/swc-linux-arm64-gnu": "13.4.19", - "@next/swc-linux-arm64-musl": "13.4.19", - "@next/swc-linux-x64-gnu": "13.4.19", - "@next/swc-linux-x64-musl": "13.4.19", - "@next/swc-win32-arm64-msvc": "13.4.19", - "@next/swc-win32-ia32-msvc": "13.4.19", - "@next/swc-win32-x64-msvc": "13.4.19" + "@next/swc-darwin-arm64": "13.5.2", + "@next/swc-darwin-x64": "13.5.2", + "@next/swc-linux-arm64-gnu": "13.5.2", + "@next/swc-linux-arm64-musl": "13.5.2", + "@next/swc-linux-x64-gnu": "13.5.2", + "@next/swc-linux-x64-musl": "13.5.2", + "@next/swc-win32-arm64-msvc": "13.5.2", + "@next/swc-win32-ia32-msvc": "13.5.2", + "@next/swc-win32-x64-msvc": "13.5.2" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -16266,8 +14458,6 @@ }, "node_modules/next/node_modules/postcss": { "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "funding": [ { "type": "opencollective", @@ -16278,6 +14468,7 @@ "url": "https://tidelift.com/funding/github/npm/postcss" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -16289,9 +14480,8 @@ }, "node_modules/no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -16299,15 +14489,13 @@ }, "node_modules/node-abort-controller": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-dir": { "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", "dev": true, + "license": "MIT", "dependencies": { "minimatch": "^3.0.2" }, @@ -16317,9 +14505,8 @@ }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -16337,27 +14524,23 @@ }, "node_modules/node-fetch-native": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.4.0.tgz", - "integrity": "sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -16365,15 +14548,13 @@ }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-polyfill-webpack-plugin": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", - "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", "dev": true, + "license": "MIT", "dependencies": { "assert": "^2.0.0", "browserify-zlib": "^0.2.0", @@ -16410,15 +14591,13 @@ }, "node_modules/node-releases": { "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -16431,27 +14610,24 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -16461,9 +14637,8 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -16473,41 +14648,37 @@ }, "node_modules/nwsapi": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-is": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -16521,18 +14692,16 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -16548,9 +14717,8 @@ }, "node_modules/object.entries": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -16562,9 +14730,8 @@ }, "node_modules/object.fromentries": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -16579,9 +14746,8 @@ }, "node_modules/object.groupby": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -16591,9 +14757,8 @@ }, "node_modules/object.hasown": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.0", "es-abstract": "^1.22.1" @@ -16604,9 +14769,8 @@ }, "node_modules/object.values": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -16621,15 +14785,13 @@ }, "node_modules/objectorarray": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", - "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -16639,27 +14801,24 @@ }, "node_modules/on-headers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -16672,9 +14831,8 @@ }, "node_modules/open": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -16689,9 +14847,8 @@ }, "node_modules/optionator": { "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, + "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -16706,9 +14863,8 @@ }, "node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -16729,15 +14885,13 @@ }, "node_modules/os-browserify": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -16750,9 +14904,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -16765,9 +14918,8 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -16780,24 +14932,21 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "dev": true, + "license": "(MIT AND Zlib)" }, "node_modules/param-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -16805,9 +14954,8 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -16817,9 +14965,8 @@ }, "node_modules/parse-asn1": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, + "license": "ISC", "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -16830,9 +14977,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -16848,9 +14994,8 @@ }, "node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -16860,18 +15005,16 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/pascal-case": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -16879,48 +15022,42 @@ }, "node_modules/path-browserify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -16934,39 +15071,34 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pathe": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, + "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -16980,9 +15112,8 @@ }, "node_modules/peek-stream": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "duplexify": "^3.5.0", @@ -16991,15 +15122,13 @@ }, "node_modules/peek-stream/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/peek-stream/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -17012,24 +15141,21 @@ }, "node_modules/peek-stream/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/peek-stream/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/peek-stream/node_modules/through2": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -17037,20 +15163,17 @@ }, "node_modules/pend": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -17060,27 +15183,24 @@ }, "node_modules/pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/pirates": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^5.0.0" }, @@ -17090,9 +15210,8 @@ }, "node_modules/pnp-webpack-plugin": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", - "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", "dev": true, + "license": "MIT", "dependencies": { "ts-pnp": "^1.1.6" }, @@ -17102,9 +15221,8 @@ }, "node_modules/polished": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", - "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.8" }, @@ -17114,8 +15232,6 @@ }, "node_modules/postcss": { "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", "dev": true, "funding": [ { @@ -17131,6 +15247,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -17142,9 +15259,8 @@ }, "node_modules/postcss-import": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -17159,9 +15275,8 @@ }, "node_modules/postcss-js": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, + "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -17178,9 +15293,8 @@ }, "node_modules/postcss-load-config": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, + "license": "MIT", "dependencies": { "lilconfig": "^2.0.5", "yaml": "^2.1.1" @@ -17207,9 +15321,8 @@ }, "node_modules/postcss-loader": { "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, + "license": "MIT", "dependencies": { "cosmiconfig": "^8.2.0", "jiti": "^1.18.2", @@ -17229,9 +15342,8 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -17241,9 +15353,8 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -17258,9 +15369,8 @@ }, "node_modules/postcss-modules-scope": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, + "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -17273,9 +15383,8 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -17288,9 +15397,8 @@ }, "node_modules/postcss-nested": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -17307,9 +15415,8 @@ }, "node_modules/postcss-selector-parser": { "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17320,24 +15427,21 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -17350,9 +15454,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -17362,9 +15465,8 @@ }, "node_modules/prettier-plugin-tailwindcss": { "version": "0.2.8", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.8.tgz", - "integrity": "sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.17.0" }, @@ -17432,9 +15534,8 @@ }, "node_modules/pretty-error": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -17442,9 +15543,8 @@ }, "node_modules/pretty-format": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -17456,9 +15556,8 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -17468,48 +15567,42 @@ }, "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pretty-hrtime": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -17520,8 +15613,8 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -17530,9 +15623,8 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -17543,21 +15635,18 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/psl": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/public-encrypt": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -17569,15 +15658,13 @@ }, "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -17585,9 +15672,8 @@ }, "node_modules/pumpify": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, + "license": "MIT", "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -17596,9 +15682,8 @@ }, "node_modules/pumpify/node_modules/pump": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -17606,18 +15691,16 @@ }, "node_modules/punycode": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/puppeteer-core": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-2.1.1.tgz", - "integrity": "sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/mime-types": "^2.1.0", "debug": "^4.1.0", @@ -17636,18 +15719,16 @@ }, "node_modules/puppeteer-core/node_modules/agent-base": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0" } }, "node_modules/puppeteer-core/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17665,9 +15746,8 @@ }, "node_modules/puppeteer-core/node_modules/https-proxy-agent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "5", "debug": "4" @@ -17678,9 +15758,8 @@ }, "node_modules/puppeteer-core/node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -17690,9 +15769,8 @@ }, "node_modules/puppeteer-core/node_modules/rimraf": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -17702,17 +15780,14 @@ }, "node_modules/puppeteer-core/node_modules/ws": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, + "license": "MIT", "dependencies": { "async-limiter": "~1.0.0" } }, "node_modules/pure-rand": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz", - "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==", "dev": true, "funding": [ { @@ -17723,13 +15798,13 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/qs": { "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -17742,8 +15817,6 @@ }, "node_modules/querystring-es3": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", "dev": true, "engines": { "node": ">=0.4.x" @@ -17751,23 +15824,19 @@ }, "node_modules/querystringify": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/queue": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "~2.0.3" } }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -17782,22 +15851,21 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ramda": { "version": "0.29.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", - "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" @@ -17805,18 +15873,16 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/randomfill": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, + "license": "MIT", "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -17824,18 +15890,16 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -17848,8 +15912,7 @@ }, "node_modules/react": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -17859,8 +15922,7 @@ }, "node_modules/react-chartjs-2": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", - "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "license": "MIT", "peerDependencies": { "chart.js": "^4.1.1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -17868,9 +15930,8 @@ }, "node_modules/react-colorful": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", "dev": true, + "license": "MIT", "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" @@ -17878,9 +15939,8 @@ }, "node_modules/react-docgen": { "version": "5.4.3", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.3.tgz", - "integrity": "sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.7.5", "@babel/generator": "^7.12.11", @@ -17902,23 +15962,20 @@ }, "node_modules/react-docgen-typescript": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", - "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", "dev": true, + "license": "MIT", "peerDependencies": { "typescript": ">= 4.3.x" } }, "node_modules/react-docgen/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/react-dom": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -17929,9 +15986,8 @@ }, "node_modules/react-element-to-jsx-string": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", - "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", "dev": true, + "license": "MIT", "dependencies": { "@base2/pretty-print-object": "1.0.1", "is-plain-object": "5.0.0", @@ -17944,38 +16000,33 @@ }, "node_modules/react-element-to-jsx-string/node_modules/react-is": { "version": "18.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", - "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/react-inspector": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.2.tgz", - "integrity": "sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==", "dev": true, + "license": "MIT", "peerDependencies": { "react": "^16.8.4 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "license": "MIT" }, "node_modules/react-refresh": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-remove-scroll": { "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", "dev": true, + "license": "MIT", "dependencies": { "react-remove-scroll-bar": "^2.3.3", "react-style-singleton": "^2.2.1", @@ -17998,9 +16049,8 @@ }, "node_modules/react-remove-scroll-bar": { "version": "2.3.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", - "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", "dev": true, + "license": "MIT", "dependencies": { "react-style-singleton": "^2.2.1", "tslib": "^2.0.0" @@ -18036,9 +16086,8 @@ }, "node_modules/react-style-singleton": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", "dev": true, + "license": "MIT", "dependencies": { "get-nonce": "^1.0.0", "invariant": "^2.2.4", @@ -18059,18 +16108,16 @@ }, "node_modules/read-cache": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^2.3.0" } }, "node_modules/read-pkg": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -18083,9 +16130,8 @@ }, "node_modules/read-pkg-up": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -18100,9 +16146,8 @@ }, "node_modules/read-pkg-up/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -18113,9 +16158,8 @@ }, "node_modules/read-pkg-up/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -18125,9 +16169,8 @@ }, "node_modules/read-pkg-up/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -18140,9 +16183,8 @@ }, "node_modules/read-pkg-up/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -18152,24 +16194,21 @@ }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -18179,27 +16218,24 @@ }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/readable-stream": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -18213,9 +16249,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -18225,9 +16260,8 @@ }, "node_modules/recast": { "version": "0.23.4", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", - "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", "dev": true, + "license": "MIT", "dependencies": { "assert": "^2.0.0", "ast-types": "^0.16.1", @@ -18241,9 +16275,8 @@ }, "node_modules/recast/node_modules/ast-types": { "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -18253,18 +16286,16 @@ }, "node_modules/recast/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/redent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -18275,9 +16306,8 @@ }, "node_modules/reflect.getprototypeof": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -18295,15 +16325,13 @@ }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -18313,30 +16341,26 @@ }, "node_modules/regenerator-runtime": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regex-parser": { "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -18351,9 +16375,8 @@ }, "node_modules/regexpu-core": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -18368,9 +16391,8 @@ }, "node_modules/regjsparser": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, @@ -18380,8 +16402,6 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -18389,18 +16409,16 @@ }, "node_modules/relateurl": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/remark-external-links": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", - "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==", "dev": true, + "license": "MIT", "dependencies": { "extend": "^3.0.0", "is-absolute-url": "^3.0.0", @@ -18415,9 +16433,8 @@ }, "node_modules/remark-slug": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", - "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==", "dev": true, + "license": "MIT", "dependencies": { "github-slugger": "^1.0.0", "mdast-util-to-string": "^1.0.0", @@ -18430,9 +16447,8 @@ }, "node_modules/renderkid": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, + "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -18443,42 +16459,37 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/requireindex": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.5" } }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.5.tgz", - "integrity": "sha512-qWhv7PF1V95QPvRoUGHxOtnAlEvlXBylMZcjUR9pAumMmveFtcHJRXGIr+TkjfNJVQypqv2qcDiiars2y1PsSg==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -18493,9 +16504,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -18505,18 +16515,16 @@ }, "node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-global": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, + "license": "MIT", "dependencies": { "global-dirs": "^0.1.1" }, @@ -18526,18 +16534,16 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/resolve-url-loader": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, + "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -18551,15 +16557,13 @@ }, "node_modules/resolve-url-loader/node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -18571,27 +16575,24 @@ }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve.exports": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/restore-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -18602,9 +16603,8 @@ }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -18612,9 +16612,8 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -18627,9 +16626,8 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -18647,9 +16645,8 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -18657,8 +16654,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -18674,15 +16669,15 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -18698,8 +16693,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -18714,13 +16707,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -18732,15 +16725,13 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sass-loader": { "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", "dev": true, + "license": "MIT", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -18776,9 +16767,8 @@ }, "node_modules/saxes": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -18788,17 +16778,15 @@ }, "node_modules/scheduler": { "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -18814,9 +16802,8 @@ }, "node_modules/schema-utils/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -18830,24 +16817,21 @@ }, "node_modules/schema-utils/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -18860,9 +16844,8 @@ }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -18872,15 +16855,13 @@ }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/send": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -18902,39 +16883,34 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-favicon": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", "dev": true, + "license": "MIT", "dependencies": { "etag": "~1.8.1", "fresh": "0.5.2", @@ -18948,21 +16924,18 @@ }, "node_modules/serve-favicon/node_modules/ms": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serve-favicon/node_modules/safe-buffer": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serve-static": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -18975,9 +16948,8 @@ }, "node_modules/set-function-name": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "functions-have-names": "^1.2.3", @@ -18989,21 +16961,18 @@ }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -19014,9 +16983,8 @@ }, "node_modules/shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -19026,9 +16994,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -19038,18 +17005,16 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -19061,15 +17026,13 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/simple-update-notifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -19079,41 +17042,36 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -19121,18 +17079,16 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/space-separated-tokens": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -19140,9 +17096,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -19150,15 +17105,13 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -19166,24 +17119,21 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/split2": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, + "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/split2/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -19195,15 +17145,13 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -19213,33 +17161,29 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/stackframe": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", "dev": true, + "license": "MIT", "dependencies": { "internal-slot": "^1.0.4" }, @@ -19249,15 +17193,13 @@ }, "node_modules/store2": { "version": "2.14.2", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", - "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==", - "dev": true + "dev": true, + "license": "(MIT OR GPL-3.0)" }, "node_modules/storybook": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.4.2.tgz", - "integrity": "sha512-UuYmdxEWEQAepfjgQFbbHTq47Xxpw16naAvJ9n/nsjMnOhYupm1ZIdWYaeNjz4LOfz+1WzgU7us0IvaBrxzl4g==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/cli": "7.4.2" }, @@ -19272,9 +17214,8 @@ }, "node_modules/stream-browserify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -19282,9 +17223,8 @@ }, "node_modules/stream-browserify/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -19296,9 +17236,8 @@ }, "node_modules/stream-http": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dev": true, + "license": "MIT", "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -19308,9 +17247,8 @@ }, "node_modules/stream-http/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -19322,32 +17260,27 @@ }, "node_modules/stream-shift": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/streamsearch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -19358,9 +17291,8 @@ }, "node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -19376,9 +17308,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -19390,15 +17321,13 @@ }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -19408,9 +17337,8 @@ }, "node_modules/string-width/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -19423,9 +17351,8 @@ }, "node_modules/string.prototype.matchall": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -19443,9 +17370,8 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -19460,9 +17386,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -19474,9 +17399,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -19488,9 +17412,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -19501,9 +17424,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -19513,27 +17435,24 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strip-indent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -19543,9 +17462,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -19555,9 +17473,8 @@ }, "node_modules/style-loader": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" }, @@ -19571,8 +17488,7 @@ }, "node_modules/styled-jsx": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "license": "MIT", "dependencies": { "client-only": "0.0.1" }, @@ -19593,9 +17509,8 @@ }, "node_modules/sucrase": { "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -19615,18 +17530,16 @@ }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/sucrase/node_modules/glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -19644,9 +17557,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19656,9 +17568,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -19668,9 +17579,8 @@ }, "node_modules/swc-loader": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.3.tgz", - "integrity": "sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==", "dev": true, + "license": "MIT", "peerDependencies": { "@swc/core": "^1.2.147", "webpack": ">=2" @@ -19678,21 +17588,18 @@ }, "node_modules/symbol-tree": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/synchronous-promise": { "version": "2.0.17", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", - "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/tailwindcss": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", "dev": true, + "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -19727,18 +17634,16 @@ }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -19753,9 +17658,8 @@ }, "node_modules/tar-fs": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -19765,15 +17669,13 @@ }, "node_modules/tar-fs/node_modules/chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/tar-stream": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -19787,9 +17689,8 @@ }, "node_modules/tar-stream/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -19801,18 +17702,16 @@ }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -19822,24 +17721,21 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/telejson": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", - "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", "dev": true, + "license": "MIT", "dependencies": { "memoizerific": "^1.11.3" } }, "node_modules/temp": { "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", "dev": true, + "license": "MIT", "dependencies": { "rimraf": "~2.6.2" }, @@ -19849,18 +17745,16 @@ }, "node_modules/temp-dir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/temp/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -19878,9 +17772,8 @@ }, "node_modules/temp/node_modules/rimraf": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -19890,9 +17783,8 @@ }, "node_modules/tempy": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", "dev": true, + "license": "MIT", "dependencies": { "del": "^6.0.0", "is-stream": "^2.0.0", @@ -19909,9 +17801,8 @@ }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -19921,9 +17812,8 @@ }, "node_modules/terser": { "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -19939,9 +17829,8 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", @@ -19973,9 +17862,8 @@ }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -19987,9 +17875,8 @@ }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -20002,9 +17889,8 @@ }, "node_modules/terser/node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -20014,24 +17900,21 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -20039,9 +17922,8 @@ }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -20053,9 +17935,8 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -20073,33 +17954,29 @@ }, "node_modules/text-extensions": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/thenify": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } }, "node_modules/thenify-all": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, + "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -20109,24 +17986,21 @@ }, "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/through2": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "3" } }, "node_modules/through2/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -20138,9 +18012,8 @@ }, "node_modules/timers-browserify": { "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, + "license": "MIT", "dependencies": { "setimmediate": "^1.0.4" }, @@ -20150,30 +18023,26 @@ }, "node_modules/tiny-invariant": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -20183,23 +18052,20 @@ }, "node_modules/tocbot": { "version": "4.21.1", - "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.21.1.tgz", - "integrity": "sha512-IfajhBTeg0HlMXu1f+VMbPef05QpDTsZ9X2Yn1+8npdaXsXg/+wrm9Ze1WG5OS1UDC3qJ5EQN/XOZ3gfXjPFCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/topojson-client": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", - "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "license": "ISC", "dependencies": { "commander": "2" }, @@ -20211,14 +18077,12 @@ }, "node_modules/topojson-client/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "license": "MIT" }, "node_modules/tough-cookie": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -20231,18 +18095,16 @@ }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/tr46": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -20252,33 +18114,29 @@ }, "node_modules/trim-newlines": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ts-dedent": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.10" } }, "node_modules/ts-interface-checker": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/ts-node": { "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -20319,9 +18177,8 @@ }, "node_modules/ts-node/node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -20331,24 +18188,21 @@ }, "node_modules/ts-node/node_modules/acorn-walk": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/ts-node/node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ts-pnp": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -20360,9 +18214,8 @@ }, "node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, + "license": "MIT", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -20374,9 +18227,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", @@ -20388,23 +18240,20 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -20417,21 +18266,18 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/tty-browserify": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -20441,18 +18287,16 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -20462,9 +18306,8 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -20475,9 +18318,8 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -20489,9 +18331,8 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -20507,9 +18348,8 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -20526,9 +18366,8 @@ }, "node_modules/typed-array-length": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -20540,14 +18379,12 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/typescript": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -20558,9 +18395,8 @@ }, "node_modules/uglify-js": { "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -20571,9 +18407,8 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -20586,18 +18421,16 @@ }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -20608,27 +18441,24 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unique-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -20638,9 +18468,8 @@ }, "node_modules/unist-util-is": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -20648,9 +18477,8 @@ }, "node_modules/unist-util-visit": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", @@ -20663,9 +18491,8 @@ }, "node_modules/unist-util-visit-parents": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" @@ -20677,27 +18504,24 @@ }, "node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/unplugin": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz", - "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.9.0", "chokidar": "^3.5.3", @@ -20707,9 +18531,8 @@ }, "node_modules/unplugin/node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -20719,17 +18542,14 @@ }, "node_modules/untildify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/update-browserslist-db": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -20745,6 +18565,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -20758,18 +18579,16 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url": { "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^1.4.1", "qs": "^6.11.2" @@ -20777,9 +18596,8 @@ }, "node_modules/url-parse": { "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, + "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -20787,15 +18605,13 @@ }, "node_modules/url/node_modules/punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/use-callback-ref": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", - "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -20814,9 +18630,8 @@ }, "node_modules/use-resize-observer": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", - "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==", "dev": true, + "license": "MIT", "dependencies": { "@juggle/resize-observer": "^3.3.1" }, @@ -20827,9 +18642,8 @@ }, "node_modules/use-sidecar": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", "dev": true, + "license": "MIT", "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -20849,9 +18663,8 @@ }, "node_modules/util": { "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -20862,49 +18675,43 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -20916,15 +18723,13 @@ }, "node_modules/v8-to-istanbul/node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -20932,24 +18737,21 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vm-browserify": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, + "license": "MIT", "dependencies": { "xml-name-validator": "^4.0.0" }, @@ -20959,17 +18761,15 @@ }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } }, "node_modules/watchpack": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -20980,27 +18780,24 @@ }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, "node_modules/webpack": { "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -21045,9 +18842,8 @@ }, "node_modules/webpack-dev-middleware": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", - "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.12", @@ -21073,9 +18869,8 @@ }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -21092,9 +18887,8 @@ }, "node_modules/webpack-hot-middleware": { "version": "2.25.4", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.4.tgz", - "integrity": "sha512-IRmTspuHM06aZh98OhBJtqLpeWFM8FXJS5UYpKYxCJzyFoyWj1w6VGFfomZU7OPA55dMLrQK0pRT1eQ3PACr4w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-html-community": "0.0.8", "html-entities": "^2.1.0", @@ -21103,30 +18897,26 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/webpack-virtual-modules": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", - "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack/node_modules/@types/estree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack/node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -21136,18 +18926,16 @@ }, "node_modules/webpack/node_modules/acorn-import-assertions": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -21158,18 +18946,16 @@ }, "node_modules/webpack/node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/whatwg-encoding": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, @@ -21179,9 +18965,8 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -21191,18 +18976,16 @@ }, "node_modules/whatwg-mimetype": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/whatwg-url": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -21213,9 +18996,8 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -21228,9 +19010,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -21244,9 +19025,8 @@ }, "node_modules/which-builtin-type": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", "dev": true, + "license": "MIT", "dependencies": { "function.prototype.name": "^1.1.5", "has-tostringtag": "^1.0.0", @@ -21270,9 +19050,8 @@ }, "node_modules/which-collection": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "dev": true, + "license": "MIT", "dependencies": { "is-map": "^2.0.1", "is-set": "^2.0.1", @@ -21285,9 +19064,8 @@ }, "node_modules/which-typed-array": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -21304,15 +19082,13 @@ }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -21328,9 +19104,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -21345,15 +19120,13 @@ }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -21365,9 +19138,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -21377,9 +19149,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -21389,9 +19160,8 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -21404,15 +19174,13 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -21423,9 +19191,8 @@ }, "node_modules/ws": { "version": "8.14.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -21444,57 +19211,50 @@ }, "node_modules/xml-name-validator": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12" } }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 14" } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -21510,24 +19270,21 @@ }, "node_modules/yargs-parser": { "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -21539,18 +19296,16 @@ }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yauzl": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -21558,18 +19313,16 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -21579,11 +19332,130 @@ }, "node_modules/zod": { "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.2.tgz", + "integrity": "sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.2.tgz", + "integrity": "sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.2.tgz", + "integrity": "sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.2.tgz", + "integrity": "sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.2.tgz", + "integrity": "sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.2.tgz", + "integrity": "sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.2.tgz", + "integrity": "sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.2.tgz", + "integrity": "sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } } } diff --git a/dashboard/package.json b/dashboard/package.json index 95c6a3754..f3b64ebdd 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -21,7 +21,7 @@ "@types/react-dom": "18.2.7", "chart.js": "^4.2.1", "classnames": "^2.3.2", - "next": "^13.4.19", + "next": "^13.5.2", "react": "18.2.0", "react-chartjs-2": "^5.2.0", "react-dom": "18.2.0", @@ -48,7 +48,7 @@ "autoprefixer": "^10.4.13", "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-next": "13.4.19", + "eslint-config-next": "13.5.2", "eslint-config-prettier": "^8.5.0", "eslint-plugin-jest": "^27.4.0", "eslint-plugin-prettier": "^4.2.1", From 114d54531c02c3768cfc6fb09824dc5d8b2addba Mon Sep 17 00:00:00 2001 From: LABOUARDY Mohamed Date: Sun, 24 Sep 2023 16:56:51 +0200 Subject: [PATCH 134/191] set dark mode by default --- docs/mint.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/mint.json b/docs/mint.json index c12638f95..ba6c1ada4 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -18,6 +18,10 @@ "to": "#33CCCC" } }, + "modeToggle": { + "default": "dark", + "isHidden": false + }, "topbarCtaButton": { "type": "github", "url": "https://github.com/tailwarden/komiser" @@ -84,12 +88,10 @@ "linkedin": "https://www.linkedin.com/company/tailwarden", "youtube": "https://www.youtube.com/@tailwarden" }, - "backgroundImage": "/images/background-image.png", - "analytics": { "ga4": { "measurementId": "G-PVLRSMWSFG" } } -} \ No newline at end of file +} From d349ac48a13b572dda46e1ecbaca12a98d4cf309 Mon Sep 17 00:00:00 2001 From: Azanul Date: Sun, 24 Sep 2023 21:34:26 +0530 Subject: [PATCH 135/191] Metric Stream dynamic rate code Signed-off-by: Azanul --- providers/aws/cloudwatch/log_metrics.go | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/providers/aws/cloudwatch/log_metrics.go b/providers/aws/cloudwatch/log_metrics.go index 343032239..a261614f4 100644 --- a/providers/aws/cloudwatch/log_metrics.go +++ b/providers/aws/cloudwatch/log_metrics.go @@ -20,10 +20,6 @@ import ( "github.com/tailwarden/komiser/providers" ) -const ( - metricUpdateRateCode = "VJDTMA8S4PDEWU6J.JRTCKXETXF.6YS6EN2CT7" -) - func getRate(pricingOutput *pricing.GetProductsOutput) (float64, error) { costPerMonth := 0.0 @@ -39,15 +35,12 @@ func getRate(pricingOutput *pricing.GetProductsOutput) (float64, error) { for _, details := range onDemand.(map[string]interface{}) { if priceDetails, ok := details.(map[string]interface{})["priceDimensions"].(map[string]interface{}); ok { for _, price := range priceDetails { - rateCode := price.(map[string]interface{})["rateCode"].(string) - if rateCode == metricUpdateRateCode { - usdPrice := price.(map[string]interface{})["pricePerUnit"].(map[string]interface{})["USD"].(string) - costPerMonth, err = strconv.ParseFloat(usdPrice, 64) - if err != nil { - return 0, fmt.Errorf("failed to parse cost per month: %w", err) - } - break + usdPrice := price.(map[string]interface{})["pricePerUnit"].(map[string]interface{})["USD"].(string) + costPerMonth, err = strconv.ParseFloat(usdPrice, 64) + if err != nil { + return 0, fmt.Errorf("failed to parse cost per month: %w", err) } + break } } } From 01968b2c866fbaac3a735ea4e297cbf83825b7b5 Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Mon, 25 Sep 2023 13:38:24 +0200 Subject: [PATCH 136/191] feat: add onboarding status --- handlers/accounts_handler.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index 849902710..479e2cab8 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -20,9 +20,11 @@ import ( func (handler *ApiHandler) IsOnboardedHandler(c *gin.Context) { output := struct { - Onboarded bool `json:"onboarded"` + Onboarded bool `json:"onboarded"` + Status string `json:"status"` }{ Onboarded: false, + Status: "COMPLETE", } if handler.db != nil { From 78dac707ee036b80f2b085ecf619780302bead75 Mon Sep 17 00:00:00 2001 From: Azanul Date: Mon, 25 Sep 2023 18:26:35 +0530 Subject: [PATCH 137/191] Alarms dynamic rate code Signed-off-by: Azanul --- providers/aws/cloudwatch/alarms.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/providers/aws/cloudwatch/alarms.go b/providers/aws/cloudwatch/alarms.go index 7b9b6a82f..bddf753d1 100644 --- a/providers/aws/cloudwatch/alarms.go +++ b/providers/aws/cloudwatch/alarms.go @@ -4,11 +4,12 @@ import ( "context" "encoding/json" "fmt" - "github.com/aws/aws-sdk-go-v2/service/pricing" - "github.com/aws/aws-sdk-go-v2/service/pricing/types" "strconv" "time" + "github.com/aws/aws-sdk-go-v2/service/pricing" + "github.com/aws/aws-sdk-go-v2/service/pricing/types" + log "github.com/sirupsen/logrus" "github.com/aws/aws-sdk-go-v2/aws" @@ -18,7 +19,6 @@ import ( ) const ( - RateCode = "JRTCKXETXF.6YS6EN2CT7" AverageHoursPerMonth = 730 ) @@ -127,16 +127,14 @@ func calculateCostPerMonth(pricingOutput *pricing.GetProductsOutput) (float64, e for _, details := range onDemand.(map[string]interface{}) { if priceDetails, ok := details.(map[string]interface{})["priceDimensions"].(map[string]interface{}); ok { for _, price := range priceDetails { - rateCode := price.(map[string]interface{})["rateCode"].(string) - if rateCode == RateCode { - usdPrice := price.(map[string]interface{})["pricePerUnit"].(map[string]interface{})["USD"].(string) - cost, err := strconv.ParseFloat(usdPrice, 64) - if err != nil { - return 0, fmt.Errorf("failed to parse cost per month: %w", err) - } - costPerMonth = cost * AverageHoursPerMonth - break + usdPrice := price.(map[string]interface{})["pricePerUnit"].(map[string]interface{})["USD"].(string) + cost, err := strconv.ParseFloat(usdPrice, 64) + if err != nil { + return 0, fmt.Errorf("failed to parse cost per month: %w", err) } + costPerMonth = cost * AverageHoursPerMonth + break + } } } From 6dcac825d0c0c9fcbb84d8ab552941687ff26757 Mon Sep 17 00:00:00 2001 From: Azanul Date: Mon, 25 Sep 2023 18:59:53 +0530 Subject: [PATCH 138/191] go mod tidy Signed-off-by: Azanul --- go.mod | 2 +- go.sum | 42 ++++++++++++++++++++---------------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index de9bc15c2..1275883b9 100644 --- a/go.mod +++ b/go.mod @@ -39,6 +39,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/lambda v1.23.4 github.com/aws/aws-sdk-go-v2/service/pricing v1.20.0 github.com/aws/aws-sdk-go-v2/service/rds v1.30.1 + github.com/aws/aws-sdk-go-v2/service/redshift v1.29.5 github.com/aws/aws-sdk-go-v2/service/s3 v1.27.1 github.com/aws/aws-sdk-go-v2/service/sns v1.18.3 github.com/aws/aws-sdk-go-v2/service/sqs v1.19.12 @@ -81,7 +82,6 @@ require ( require ( cloud.google.com/go/longrunning v0.4.1 // indirect github.com/apache/arrow/go/v11 v11.0.0 // indirect - github.com/aws/aws-sdk-go-v2/service/redshift v1.29.5 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect ) diff --git a/go.sum b/go.sum index b2023ae3f..cd8486610 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,7 @@ cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2Aawl cloud.google.com/go/container v1.16.0 h1:dALHCKAYowNhUeENL4pf3+5ToHuSiE2emTDnuzwn4kc= cloud.google.com/go/container v1.16.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/datacatalog v1.13.0 h1:4H5IJiyUE0X6ShQBqgFFZvGGcrwGVndTwUSLP4c52gw= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/kms v1.10.0 h1:Imrtp8792uqNP9bdfPrjtUkjjqOMBcAJ2bdFaAnLhnk= @@ -31,14 +32,17 @@ github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 h1:+5VZ72z0Qan5Bog5C+ZkgSqUbeVUd9wgtHOrIKuc5b8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1 h1:H3g2mkmu105ON0c/Gqx3Bm+bzoIijLom8LmV9Gjn7X0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1/go.mod h1:EAc3kjhZf9soch7yLID8PeKcE6VfKvQTllSBHYVdXd8= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.1.0 h1:Vjq3Uy3JAU1DTxbA+uX6BegIhgO2pyFltbfbmDa9KdI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.1.0/go.mod h1:Q3u+T/qw3Kb1Wf3DFKiFwEZlyaAyPb4yBgWm9wq7yh8= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databox/armdatabox v1.0.0 h1:s55dRuEFkOZTkZNbaiwkTa7qv8un39PTo/YPUpciQY0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databox/armdatabox v1.0.0/go.mod h1:43obBGNGAM/4TLKn6H25WZgNyASDm7CgnTfTDlibyvI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0 h1:lMW1lD/17LUA5z1XTURo7LcVG2ICBPlyMHjIUrcFZNQ= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0/go.mod h1:243D9iHbcQXoFUtgHJwL7gl2zx1aDuDMjvBZVGr2uW0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.0.0 h1:rycGPpUtVFwM9uLUL2ux8EL8kGfl3qF1u76aEHvB4Qw= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.0.0/go.mod h1:lirt6L2DmxromyM4w5Vd2QPz4PrWRV38Izy43xgkBVI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8= @@ -49,6 +53,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/apache/arrow/go/v11 v11.0.0 h1:hqauxvFQxww+0mEU/2XHG6LT7eZternCZq+A5Yly2uM= @@ -61,25 +66,17 @@ github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3eP github.com/aws/aws-sdk-go-v2 v1.17.5/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.18.1 h1:+tefE750oAb7ZQGzla6bLkOwfcQCEtC5y2RqoqCeqKo= github.com/aws/aws-sdk-go-v2 v1.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3/go.mod h1:gNsR5CaXKmQSSzrmGxmwmct/r+ZBfbxorAuXYsj/M5Y= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= -github.com/aws/aws-sdk-go-v2/config v1.15.14 h1:+BqpqlydTq4c2et9Daury7gE+o67P4lbk7eybiCBNc4= -github.com/aws/aws-sdk-go-v2/config v1.15.14/go.mod h1:CQBv+VVv8rR5z2xE+Chdh5m+rFfsqeY4k0veEZeq6QM= github.com/aws/aws-sdk-go-v2/config v1.18.27 h1:Az9uLwmssTE6OGTpsFqOnaGpLnKDqNYOJzWuC6UAYzA= github.com/aws/aws-sdk-go-v2/config v1.18.27/go.mod h1:0My+YgmkGxeqjXZb5BYme5pc4drjTnM+x1GJ3zv42Nw= -github.com/aws/aws-sdk-go-v2/credentials v1.12.9 h1:DloAJr0/jbvm0iVRFDFh8GlWxrOd9XKyX82U+dfVeZs= -github.com/aws/aws-sdk-go-v2/credentials v1.12.9/go.mod h1:2Vavxl1qqQXJ8MUcQZTsIEW8cwenFCWYXtLRPba3L/o= github.com/aws/aws-sdk-go-v2/credentials v1.13.26 h1:qmU+yhKmOCyujmuPY7tf5MxR/RKyZrOPO3V4DobiTUk= github.com/aws/aws-sdk-go-v2/credentials v1.13.26/go.mod h1:GoXt2YC8jHUBbA4jr+W3JiemnIbkXOfxSXcisUsZ3os= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.8 h1:VfBdn2AxwMbFyJN/lF/xuT3SakomJ86PZu3rCxb5K0s= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.8/go.mod h1:oL1Q3KuCq1D4NykQnIvtRiBGLUXhcpY5pl6QZB2XEPU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 h1:LxK/bitrAr4lnh9LnIS6i7zWbCOdMsfzKFBI6LUCS0I= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4/go.mod h1:E1hLXN/BL2e6YizK1zFlYd8vsfi2GTjbjBazinMmeaM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14/go.mod h1:kdjrMwHwrC3+FsKhNcCMJ7tUVj/8uSD5CZXeQ4wV6fM= @@ -88,9 +85,7 @@ github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBB github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29/go.mod h1:Dip3sIGv485+xerzVv24emnjX5Sg88utCL8fwGmCeWg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32/go.mod h1:RudqOgadTWdcS3t/erPQo24pcVEoYyqj/kKW5Vya21I= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 h1:A5UqQEmPaCFpedKouS4v+dHCTUo2sKqhoKO9U5kxyWo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34/go.mod h1:wZpTEecJe0Btj3IYnDx/VlUzor9wm3fJHyvLpQF0VwY= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= @@ -100,14 +95,10 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23/go.mod h1:mr6c4cHC+S/MMkrjtSlG4QA36kOznDep+0fga5L/fGQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7imKOMsjdQLuN9CPi+k44F/OFVsk= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 h1:srIVS45eQuewqz6fKKu6ZGXaq6FuFg5NzgQBAM6g8Y4= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 h1:SijA0mgjV8E+8G45ltVHs0fvKpTj8xmZJ3VwhGKtUSI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15 h1:QquxR7NH3ULBsKC+NoTpilzbKKS+5AELfNREInbhvas= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15/go.mod h1:Tkrthp/0sNBShQQsamR7j/zY4p19tVTAs+nnqhH6R3c= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.5 h1:tEEHn+PGAxRVqMPEhtU8oCSW/1Ge3zP5nUgPrGQNUPs= @@ -150,7 +141,6 @@ github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.9/go.mod h1:EF5RLnD9 github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.19 h1:V03dAtcAN4Qtly7H3/0B6m3t/cyl4FgyKFqK738fyJw= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.19/go.mod h1:2WpVWFC5n4DYhjNXzObtge8xfgId9UP6GWca46KJFLo= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.8/go.mod h1:rDVhIMAX9N2r8nWxDUlbubvvaFMnfsm+3jAV7q+rpM4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 h1:GE25AWCdNUPh9AOJzI9KIJnja7IwUc1WyUqz/JTyJ/I= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19/go.mod h1:02CP6iuYP+IVnBX5HULVdSAku/85eHB2Y9EsFhrkEwU= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28/go.mod h1:jj7znCIg05jXlaGBlFMGP8+7UN3VtCkRBG2spnmRQkU= @@ -164,8 +154,6 @@ github.com/aws/aws-sdk-go-v2/service/lambda v1.23.4 h1:d1Olp+josNRAlrrtacghtos74 github.com/aws/aws-sdk-go-v2/service/lambda v1.23.4/go.mod h1:XiSHsT7z5ScD2AsTgfa1UEFQaAr53dHP1oWvaqSW6jQ= github.com/aws/aws-sdk-go-v2/service/opensearch v1.15.4 h1:56esBN+m4kQrGPHZfE60PqfXDryuv8oYbSAc0aU1F10= github.com/aws/aws-sdk-go-v2/service/opensearch v1.15.4/go.mod h1:2Azx9xDn2nuX+yv4wTR7MO5EYqJNXt2fUC/axUV67qI= -github.com/aws/aws-sdk-go-v2/service/pricing v1.17.5 h1:89yKwg+Kn3jgjcpxzmbZYH0O+I2+HjEcILIQrLkj8ik= -github.com/aws/aws-sdk-go-v2/service/pricing v1.17.5/go.mod h1:1YtXjD073MNbQvowCxfSsdhGUCJQOt04FVDcs8uYCmI= github.com/aws/aws-sdk-go-v2/service/pricing v1.20.0 h1:x5gKeerbKIQ/tdhmaAGNpivSfmb+p2rdt0wyjCGz+4Q= github.com/aws/aws-sdk-go-v2/service/pricing v1.20.0/go.mod h1:JjpnqJdEW/5An429Ou+5Kb3UkwjXv16gRD2ZdGA2Gw8= github.com/aws/aws-sdk-go-v2/service/rds v1.30.1 h1:/B3GswjV+ScqZSZnhs3NMLwvVFXb1/aQL/elQwo0CMM= @@ -182,19 +170,14 @@ github.com/aws/aws-sdk-go-v2/service/sqs v1.19.12 h1:uiG0JUqcL9w3IUu+tLG/BWJSUUh github.com/aws/aws-sdk-go-v2/service/sqs v1.19.12/go.mod h1:DKX/7/ZiAzHO6p6AhArnGdrV4r+d461weby8KeVtvC4= github.com/aws/aws-sdk-go-v2/service/ssm v1.36.2 h1:+5UPNk83hM6HZiHOhZa4hbFIzkVPVsSeaPGWE4lmodk= github.com/aws/aws-sdk-go-v2/service/ssm v1.36.2/go.mod h1:bE/ToM6K9X5ETp8zaLZf+4JxzXrnk2fNcDoYil4aetg= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.12 h1:760bUnTX/+d693FT6T6Oa7PZHfEQT9XMFZeM5IQIB0A= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.12/go.mod h1:MO4qguFjs3wPGcCSpQ7kOFTwRvb+eu+fn+1vKleGHUk= github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 h1:nneMBM2p79PGWBQovYO/6Xnc2ryRMw3InnDJq1FHkSY= github.com/aws/aws-sdk-go-v2/service/sso v1.12.12/go.mod h1:HuCOxYsF21eKrerARYO6HapNeh9GBNq7fius2AcwodY= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 h1:2qTR7IFk7/0IN/adSFhYu9Xthr0zVFTgBrmPldILn80= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12/go.mod h1:E4VrHCPzmVB/KFXtqBGKb3c8zpbNBgKe3fisDNLAW5w= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.9 h1:yOfILxyjmtr2ubRkRJldlHDFBhf5vw4CzhbwWIBmimQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.9/go.mod h1:O1IvkYxr+39hRf960Us6j0x1P8pDqhTX+oXM5kQNl/Y= github.com/aws/aws-sdk-go-v2/service/sts v1.19.2 h1:XFJ2Z6sNUUcAz9poj+245DMkrHE4h2j5I9/xD50RHfE= github.com/aws/aws-sdk-go-v2/service/sts v1.19.2/go.mod h1:dp0yLPsLBOi++WTxzCjA/oZqi6NPIhoR+uF7GeMU9eg= github.com/aws/smithy-go v1.12.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.13.4/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= @@ -222,6 +205,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/digitalocean/godo v1.97.0 h1:p9w1yCcWMZcxFSLPToNGXA96WfUVLXqoHti6GzVomL4= github.com/digitalocean/godo v1.97.0/go.mod h1:NRpFznZFvhHjBoqZAaOD3khVzsJ3EibzKqFL4R60dmA= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -249,6 +233,7 @@ github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SU github.com/go-co-op/gocron v1.18.0 h1:SxTyJ5xnSN4byCq7b10LmmszFdxQlSQJod8s3gbnXxA= github.com/go-co-op/gocron v1.18.0/go.mod h1:sD/a0Aadtw5CpflUJ/lpP9Vfdk979Wl1Sg33HPHg0FY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -262,6 +247,7 @@ github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5F github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= @@ -276,6 +262,7 @@ github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSM github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= +github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= @@ -328,6 +315,7 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -417,11 +405,13 @@ github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= +github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/openlyinc/pointy v1.2.0 h1:vbb/WoPbshyTH8j3/XYu3enlZfv+NHxAD15qTm1zbk0= github.com/openlyinc/pointy v1.2.0/go.mod h1:JodZOTJoBNaAQHeU0F/SwA4PL0lg4pKF7fYFpX291P0= github.com/oracle/oci-go-sdk v24.3.0+incompatible h1:x4mcfb4agelf1O4/1/auGlZ1lr97jXRSSN5MxTgG/zU= @@ -432,10 +422,12 @@ github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNc github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -446,6 +438,7 @@ github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzG github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -512,6 +505,7 @@ github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63M github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.mongodb.org/atlas v0.23.1 h1:nQjqIzAizf4uaD7lECpVF6kldnZvJnmCTDrqkS4hVyc= @@ -529,6 +523,7 @@ golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20220827204233-334a2380cb91 h1:tnebWN09GYg9OLPss1KXj8txwZc6X6uMr6VFdcGNbHw= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -622,6 +617,7 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -727,10 +723,12 @@ modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.13.1 h1:npxzTwFTZYM8ghWicVIX1cRWzj7Nd8i6AqqX2p+IYao= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1 h1:RTNHdsrOpeoSeOF4FbzTo8gBYByaJ5xT7NgZ9ZqRiJM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= From 2b8d55bbbed2652ee577889a06454c68174ae1f3 Mon Sep 17 00:00:00 2001 From: Azanul Date: Mon, 25 Sep 2023 19:04:32 +0530 Subject: [PATCH 139/191] opencost integration Signed-off-by: Azanul --- providers/k8s/opencost/opencost.go | 111 +++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 providers/k8s/opencost/opencost.go diff --git a/providers/k8s/opencost/opencost.go b/providers/k8s/opencost/opencost.go new file mode 100644 index 000000000..5add707af --- /dev/null +++ b/providers/k8s/opencost/opencost.go @@ -0,0 +1,111 @@ +package k8s + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "time" +) + +type OpenCostResponse struct { + Code int `json:"code"` + Status string `json:"status"` + Data []map[string]costData `json:"data"` +} + +type costData struct { + Properties struct { + Cluster string `json:"cluster"` + Node string `json:"node"` + } `json:"properties"` + Start time.Time `json:"start"` + End time.Time `json:"end"` + Minutes int `json:"minutes"` + CPUCores float64 `json:"cpuCores"` + CPUCoreRequestAvg float64 `json:"cpuCoreRequestAverage"` + CPUCoreUsageAvg float64 `json:"cpuCoreUsageAverage"` + CPUCoreHours float64 `json:"cpuCoreHours"` + CPUCost float64 `json:"cpuCost"` + CPUCostAdjustment float64 `json:"cpuCostAdjustment"` + CPUEfficiency float64 `json:"cpuEfficiency"` + GPUCount int `json:"gpuCount"` + GPUHours int `json:"gpuHours"` + GPUCost float64 `json:"gpuCost"` + GPUCostAdjustment float64 `json:"gpuCostAdjustment"` + NetworkTransfer int64 `json:"networkTransferBytes"` + NetworkReceive int64 `json:"networkReceiveBytes"` + NetworkCost float64 `json:"networkCost"` + NetworkCrossZone float64 `json:"networkCrossZoneCost"` + NetworkCrossRegion float64 `json:"networkCrossRegionCost"` + NetworkInternet float64 `json:"networkInternetCost"` + NetworkAdjustment float64 `json:"networkCostAdjustment"` + LoadBalancerCost float64 `json:"loadBalancerCost"` + LBCostAdjustment float64 `json:"loadBalancerCostAdjustment"` + PVBytes int64 `json:"pvBytes"` + PVByteHours float64 `json:"pvByteHours"` + PVCost float64 `json:"pvCost"` + PVs map[string]pvInfo `json:"pvs"` + PVCostAdjustment float64 `json:"pvCostAdjustment"` + RAMBytes int64 `json:"ramBytes"` + RAMByteRequestAvg int64 `json:"ramByteRequestAverage"` + RAMByteUsageAvg int64 `json:"ramByteUsageAverage"` + RAMByteHours float64 `json:"ramByteHours"` + RAMCost float64 `json:"ramCost"` + RAMCostAdjustment float64 `json:"ramCostAdjustment"` + RAMEfficiency float64 `json:"ramEfficiency"` + ExternalCost float64 `json:"externalCost"` + SharedCost float64 `json:"sharedCost"` + TotalCost float64 `json:"totalCost"` + TotalEfficiency float64 `json:"totalEfficiency"` +} + +type pvInfo struct { + ByteHours float64 `json:"byteHours"` + Cost float64 `json:"cost"` +} + +func GetOpencostInfo(aggregate string) (map[string]costData, error) { + apiURL := fmt.Sprintf("http://%s:%d/allocation/compute", "127.0.0.1", 9003) + + httpClient := &http.Client{} + req, err := http.NewRequest("GET", apiURL, nil) + if err != nil { + return nil, fmt.Errorf("ERROR: Couldn't build request: %v", err) + } + + query := req.URL.Query() + query.Add("window", "month") + query.Add("aggregate", aggregate) + req.URL.RawQuery = query.Encode() + + resp, err := httpClient.Do(req) + if err != nil { + return nil, fmt.Errorf("ERROR: Couldn't send request: %v", err) + } + defer resp.Body.Close() + + var ocResp OpenCostResponse + if resp.StatusCode == http.StatusOK { + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("ERROR: Couldn't read response body: %v", err) + } + err = json.Unmarshal(bodyBytes, &ocResp) + if err != nil { + return nil, fmt.Errorf("ERROR: Couldn't unmarshal json: %v", err) + } + } + + return FlattenMapSlice(ocResp.Data), nil +} + +func FlattenMapSlice(mapSlice []map[string]costData) map[string]costData { + res := make(map[string]costData) + for _, data := range mapSlice { + for key, value := range data { + res[key] = value + } + } + return res +} From 02a5a5d71ddecf77612b485957f66ad38981077d Mon Sep 17 00:00:00 2001 From: AvineshTripathi Date: Mon, 25 Sep 2023 22:03:05 +0530 Subject: [PATCH 140/191] fix: url fixed --- handlers/feedback_handler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/handlers/feedback_handler.go b/handlers/feedback_handler.go index a03f56ae4..190de3c14 100644 --- a/handlers/feedback_handler.go +++ b/handlers/feedback_handler.go @@ -6,6 +6,7 @@ import ( "io" "mime/multipart" "net/http" + "os" "path/filepath" "github.com/gin-gonic/gin" @@ -14,6 +15,7 @@ import ( func (handler *ApiHandler) NewFeedbackHandler(c *gin.Context) { + url := os.Getenv("DISCORD_FEEDBACK_URL") err := c.Request.ParseMultipartForm(100 << 20) if err != nil { log.WithError(err).Error("Unable to parse form") @@ -61,8 +63,6 @@ func (handler *ApiHandler) NewFeedbackHandler(c *gin.Context) { writer.Close() - var url = "" - resp, err := http.Post(url, writer.FormDataContentType(), &requestBody) if err != nil { log.WithError(err).Error("scan failed") From 2f628ff6b53d8e9fe03d98f8280e6b9c58a8ed66 Mon Sep 17 00:00:00 2001 From: Azanul Date: Mon, 25 Sep 2023 22:51:09 +0530 Subject: [PATCH 141/191] opencost url through config Signed-off-by: Azanul --- internal/config/load.go | 9 +++++++-- models/config.go | 7 ++++--- providers/k8s/core/deployments.go | 2 +- providers/k8s/core/ingress.go | 2 +- providers/k8s/core/pods.go | 2 +- providers/k8s/core/pv.go | 2 +- providers/k8s/core/pvc.go | 2 +- providers/k8s/core/sa.go | 2 +- providers/k8s/core/services.go | 2 +- providers/k8s/opencost/opencost.go | 4 ++-- providers/providers.go | 7 ++++++- 11 files changed, 26 insertions(+), 15 deletions(-) diff --git a/internal/config/load.go b/internal/config/load.go index feaee4d56..9d3d25fcb 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -233,13 +233,18 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics, db *bun. log.Fatal(err) } - client, err := kubernetes.NewForConfig(kubeConfig) + k8sClient, err := kubernetes.NewForConfig(kubeConfig) if err != nil { log.Fatal(err) } + client := providers.K8sClient{ + Client: k8sClient, + OpencostBaseUrl: account.OpencostBaseUrl, + } + clients = append(clients, providers.ProviderClient{ - K8sClient: client, + K8sClient: &client, Name: account.Name, }) } diff --git a/models/config.go b/models/config.go index 4b44312be..528bfe7fd 100644 --- a/models/config.go +++ b/models/config.go @@ -45,9 +45,10 @@ type ScalewayConfig struct { } type KubernetesConfig struct { - Name string `toml:"name"` - Path string `toml:"path"` - Contexts []string `toml:"contexts"` + Name string `toml:"name"` + Path string `toml:"path"` + Contexts []string `toml:"contexts"` + OpencostBaseUrl string `toml:"opencostBaseUrl"` } type LinodeConfig struct { diff --git a/providers/k8s/core/deployments.go b/providers/k8s/core/deployments.go index 1701704ff..df2d951f3 100644 --- a/providers/k8s/core/deployments.go +++ b/providers/k8s/core/deployments.go @@ -16,7 +16,7 @@ func Deployments(ctx context.Context, client providers.ProviderClient) ([]Resour var config metav1.ListOptions for { - res, err := client.K8sClient.AppsV1().Deployments("").List(ctx, config) + res, err := client.K8sClient.Client.AppsV1().Deployments("").List(ctx, config) if err != nil { return nil, err } diff --git a/providers/k8s/core/ingress.go b/providers/k8s/core/ingress.go index 45e74d522..d7d2db2b4 100644 --- a/providers/k8s/core/ingress.go +++ b/providers/k8s/core/ingress.go @@ -17,7 +17,7 @@ func Ingress(ctx context.Context, client providers.ProviderClient) ([]Resource, var config metav1.ListOptions for { - res, err := client.K8sClient.NetworkingV1().Ingresses("").List(ctx, config) + res, err := client.K8sClient.Client.NetworkingV1().Ingresses("").List(ctx, config) if err != nil { return nil, err } diff --git a/providers/k8s/core/pods.go b/providers/k8s/core/pods.go index 97706a97c..8153c8f46 100644 --- a/providers/k8s/core/pods.go +++ b/providers/k8s/core/pods.go @@ -17,7 +17,7 @@ func Pods(ctx context.Context, client providers.ProviderClient) ([]Resource, err var config metav1.ListOptions for { - res, err := client.K8sClient.CoreV1().Pods("").List(ctx, config) + res, err := client.K8sClient.Client.CoreV1().Pods("").List(ctx, config) if err != nil { return nil, err } diff --git a/providers/k8s/core/pv.go b/providers/k8s/core/pv.go index 78b4d8ce2..e7ec06cc5 100644 --- a/providers/k8s/core/pv.go +++ b/providers/k8s/core/pv.go @@ -17,7 +17,7 @@ func PersistentVolumes(ctx context.Context, client providers.ProviderClient) ([] var config metav1.ListOptions for { - res, err := client.K8sClient.CoreV1().PersistentVolumes().List(ctx, config) + res, err := client.K8sClient.Client.CoreV1().PersistentVolumes().List(ctx, config) if err != nil { return nil, err } diff --git a/providers/k8s/core/pvc.go b/providers/k8s/core/pvc.go index 3877d3d60..9328640ee 100644 --- a/providers/k8s/core/pvc.go +++ b/providers/k8s/core/pvc.go @@ -17,7 +17,7 @@ func PersistentVolumeClaims(ctx context.Context, client providers.ProviderClient var config metav1.ListOptions for { - res, err := client.K8sClient.CoreV1().PersistentVolumeClaims("").List(ctx, config) + res, err := client.K8sClient.Client.CoreV1().PersistentVolumeClaims("").List(ctx, config) if err != nil { return nil, err } diff --git a/providers/k8s/core/sa.go b/providers/k8s/core/sa.go index 7922c9426..0c1fcba3e 100644 --- a/providers/k8s/core/sa.go +++ b/providers/k8s/core/sa.go @@ -17,7 +17,7 @@ func ServiceAccounts(ctx context.Context, client providers.ProviderClient) ([]Re var config metav1.ListOptions for { - res, err := client.K8sClient.CoreV1().ServiceAccounts("").List(ctx, config) + res, err := client.K8sClient.Client.CoreV1().ServiceAccounts("").List(ctx, config) if err != nil { return nil, err } diff --git a/providers/k8s/core/services.go b/providers/k8s/core/services.go index 5a507b22a..f4b1a7ce7 100644 --- a/providers/k8s/core/services.go +++ b/providers/k8s/core/services.go @@ -17,7 +17,7 @@ func Services(ctx context.Context, client providers.ProviderClient) ([]Resource, var config metav1.ListOptions for { - res, err := client.K8sClient.CoreV1().Services("").List(ctx, config) + res, err := client.K8sClient.Client.CoreV1().Services("").List(ctx, config) if err != nil { return nil, err } diff --git a/providers/k8s/opencost/opencost.go b/providers/k8s/opencost/opencost.go index 5add707af..177826147 100644 --- a/providers/k8s/opencost/opencost.go +++ b/providers/k8s/opencost/opencost.go @@ -65,8 +65,8 @@ type pvInfo struct { Cost float64 `json:"cost"` } -func GetOpencostInfo(aggregate string) (map[string]costData, error) { - apiURL := fmt.Sprintf("http://%s:%d/allocation/compute", "127.0.0.1", 9003) +func GetOpencostInfo(ocBaseUrl string, aggregate string) (map[string]costData, error) { + apiURL := fmt.Sprintf("http://%s/allocation/compute", ocBaseUrl) httpClient := &http.Client{} req, err := http.NewRequest("GET", apiURL, nil) diff --git a/providers/providers.go b/providers/providers.go index 75b53e50e..138fa34da 100644 --- a/providers/providers.go +++ b/providers/providers.go @@ -24,7 +24,7 @@ type ProviderClient struct { DigitalOceanClient *godo.Client OciClient common.ConfigurationProvider CivoClient *civogo.Client - K8sClient *kubernetes.Clientset + K8sClient *K8sClient LinodeClient *linodego.Client TencentClient *tccvm.Client AzureClient *AzureClient @@ -42,3 +42,8 @@ type AzureClient struct { type GCPClient struct { Credentials *google.Credentials } + +type K8sClient struct { + Client *kubernetes.Clientset + OpencostBaseUrl string +} From aa1ad26dfffcddc89afea43c6b41c1ca8f504260 Mon Sep 17 00:00:00 2001 From: Azanul Date: Mon, 25 Sep 2023 22:52:50 +0530 Subject: [PATCH 142/191] k8s pod cost calculation Signed-off-by: Azanul --- providers/k8s/core/pods.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/providers/k8s/core/pods.go b/providers/k8s/core/pods.go index 8153c8f46..87e904fc9 100644 --- a/providers/k8s/core/pods.go +++ b/providers/k8s/core/pods.go @@ -6,16 +6,23 @@ import ( log "github.com/sirupsen/logrus" - . "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" + oc "github.com/tailwarden/komiser/providers/k8s/opencost" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func Pods(ctx context.Context, client providers.ProviderClient) ([]Resource, error) { - resources := make([]Resource, 0) +func Pods(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { + resources := make([]models.Resource, 0) var config metav1.ListOptions + podsCost, err := oc.GetOpencostInfo(client.K8sClient.OpencostBaseUrl, "pod") + if err != nil { + log.Printf("ERROR: Couldn't get pods info from OpenCost: %v", err) + return resources, err + } + for { res, err := client.K8sClient.Client.CoreV1().Pods("").List(ctx, config) if err != nil { @@ -23,23 +30,23 @@ func Pods(ctx context.Context, client providers.ProviderClient) ([]Resource, err } for _, pod := range res.Items { - tags := make([]Tag, 0) + tags := make([]models.Tag, 0) for key, value := range pod.Labels { - tags = append(tags, Tag{ + tags = append(tags, models.Tag{ Key: key, Value: value, }) } - resources = append(resources, Resource{ + resources = append(resources, models.Resource{ Provider: "Kubernetes", Account: client.Name, Service: "Pod", ResourceId: string(pod.UID), Name: pod.Name, Region: pod.Namespace, - Cost: 0, + Cost: podsCost[pod.Name].TotalCost, CreatedAt: pod.CreationTimestamp.Time, FetchedAt: time.Now(), Tags: tags, From 283e2a25be5006672db01818e37772625984d7a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 23:49:38 +0000 Subject: [PATCH 143/191] chore(deps-dev): bump @storybook/blocks in /dashboard Bumps [@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/ui/blocks) from 7.4.2 to 7.4.5. - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v7.4.5/code/ui/blocks) --- updated-dependencies: - dependency-name: "@storybook/blocks" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 596 ++++++++++++++++++++++++++++-------- dashboard/package.json | 2 +- 2 files changed, 463 insertions(+), 135 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index b040c98c9..95f2e18c3 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -30,7 +30,7 @@ "@storybook/addon-interactions": "^7.0.0-beta.52", "@storybook/addon-links": "^7.0.0-beta.52", "@storybook/addons": "^7.0.0-beta.52", - "@storybook/blocks": "^7.4.0", + "@storybook/blocks": "^7.4.5", "@storybook/nextjs": "^7.0.0-alpha.41", "@storybook/react": "^7.0.0-beta.52", "@storybook/testing-library": "^0.0.14-next.1", @@ -3315,6 +3315,126 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.2.tgz", + "integrity": "sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.2.tgz", + "integrity": "sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.2.tgz", + "integrity": "sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.2.tgz", + "integrity": "sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.2.tgz", + "integrity": "sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.2.tgz", + "integrity": "sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.2.tgz", + "integrity": "sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.2.tgz", + "integrity": "sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@next/swc-win32-x64-msvc": { "version": "13.5.2", "cpu": [ @@ -4295,6 +4415,45 @@ } } }, + "node_modules/@storybook/addon-controls/node_modules/@storybook/blocks": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.4.2.tgz", + "integrity": "sha512-ijuZBsYfQBuwMA8Lb1dT6t2PzqhkOtIdc+G5iQ/IgWLX5HT1br+Wq8o3TUWrqACM9VKIASnJk13FMAOeGggD/w==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/core-events": "7.4.2", + "@storybook/csf": "^0.1.0", + "@storybook/docs-tools": "7.4.2", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.8", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.2.0", + "tocbot": "^4.20.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@storybook/addon-docs": { "version": "7.4.2", "dev": true, @@ -4329,6 +4488,45 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/blocks": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.4.2.tgz", + "integrity": "sha512-ijuZBsYfQBuwMA8Lb1dT6t2PzqhkOtIdc+G5iQ/IgWLX5HT1br+Wq8o3TUWrqACM9VKIASnJk13FMAOeGggD/w==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/core-events": "7.4.2", + "@storybook/csf": "^0.1.0", + "@storybook/docs-tools": "7.4.2", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.8", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.2.0", + "tocbot": "^4.20.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@storybook/addon-essentials": { "version": "7.4.2", "dev": true, @@ -4617,21 +4815,22 @@ } }, "node_modules/@storybook/blocks": { - "version": "7.4.2", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.4.5.tgz", + "integrity": "sha512-FhAIkCT2HrzJcKsC3mL5+uG3GrbS23mYAT1h3iyPjCliZzxfCCI9UCMUXqYx4Z/FmAGJgpsQQXiBFZuoTHO9aQ==", "dev": true, - "license": "MIT", "dependencies": { - "@storybook/channels": "7.4.2", - "@storybook/client-logger": "7.4.2", - "@storybook/components": "7.4.2", - "@storybook/core-events": "7.4.2", + "@storybook/channels": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/csf": "^0.1.0", - "@storybook/docs-tools": "7.4.2", + "@storybook/docs-tools": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.4.2", - "@storybook/preview-api": "7.4.2", - "@storybook/theming": "7.4.2", - "@storybook/types": "7.4.2", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", @@ -4654,6 +4853,257 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@storybook/blocks/node_modules/@storybook/channels": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.5.tgz", + "integrity": "sha512-zWPZn4CxPFXsrrSRQ9JD8GmTeWeFYgr3sTBpe23hnhYookCXVNJ6AcaXogrT9b2ALfbB6MiFDbZIHHTgIgbWpg==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.4.5", + "@storybook/core-events": "7.4.5", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/client-logger": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.5.tgz", + "integrity": "sha512-Bn6eTAjhPDUfLpvuxhKkpDpOtkadfkSmkBNBZRu3r0Dzk2J1nNyKV5K6D8dOU4PFVof4z/gXYj5bktT29jKsmw==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/components": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.4.5.tgz", + "integrity": "sha512-boskkfvMBB8CFYY9+1ofFNyKrdWXTY/ghzt7oK80dz6f2Eseo/WXK3OsCdCq5vWbLRCdbgJ8zXG8pAFi4yBsxA==", + "dev": true, + "dependencies": { + "@radix-ui/react-select": "^1.2.2", + "@radix-ui/react-toolbar": "^1.0.4", + "@storybook/client-logger": "7.4.5", + "@storybook/csf": "^0.1.0", + "@storybook/global": "^5.0.0", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", + "memoizerific": "^1.11.3", + "use-resize-observer": "^9.1.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/core-common": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.4.5.tgz", + "integrity": "sha512-c4pBuILMD4YhSpJ+QpKtsUZpK+/rfolwOvzXfJwlN5EpYzMz6FjVR/LyX0cCT2YLI3X5YWRoCdvMxy5Aeryb8g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.4.5", + "@storybook/node-logger": "7.4.5", + "@storybook/types": "7.4.5", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^16.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.4.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/core-events": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.5.tgz", + "integrity": "sha512-Jzy/adSC95saYCZlgXE5j7jmiMLAXYpnBFBxEtBdXwSWEBb0zt21n1nyWBEAv9s/k2gqDXlPHKHeL5Mn6y40zA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/docs-tools": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.4.5.tgz", + "integrity": "sha512-ctK+yGb2nvWISSvCCzj3ZhDaAb7I2BLjbxuBGTyNPvl4V9UQ9LBYzdJwR50q+DfscxdwSHMSOE/0OnzmJdaSJA==", + "dev": true, + "dependencies": { + "@storybook/core-common": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/types": "7.4.5", + "@types/doctrine": "^0.0.3", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/manager-api": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.5.tgz", + "integrity": "sha512-8Hdh5Tutet8xRy2fAknczfvpshz09eVnLd8m34vcFceUOYvEnvDbWerufhlEzovsF4v7U32uqbDHKdKTamWEQQ==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/core-events": "7.4.5", + "@storybook/csf": "^0.1.0", + "@storybook/global": "^5.0.0", + "@storybook/router": "7.4.5", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "semver": "^7.3.7", + "store2": "^2.14.2", + "telejson": "^7.2.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/node-logger": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.4.5.tgz", + "integrity": "sha512-fJSykphbryuEYj1qihbaTH5oOzD4NkptRxyf2uyBrpgkr5tCTq9d7GHheqaBuIdi513dsjlcIR7z5iHxW7ZD+Q==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/preview-api": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.5.tgz", + "integrity": "sha512-6xXQZPyilkGVddfZBI7tMbMMgOyIoZTYgTnwSPTMsXxO0f0TvtNDmGdwhn0I1nREHKfiQGpcQe6gwddEMnGtSg==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/core-events": "7.4.5", + "@storybook/csf": "^0.1.0", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.4.5", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/router": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.5.tgz", + "integrity": "sha512-IM4IhiPiXsx3FAUeUOAB47uiuUS8Yd37VQcNlXLBO28GgHoTSYOrjS+VTGLIV5cAGKr8+H5pFB+q35BnlFUpkQ==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.4.5", + "memoizerific": "^1.11.3", + "qs": "^6.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/theming": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.5.tgz", + "integrity": "sha512-QSIJDIMzOegzlhubIBaYIovf4mlf+AVL0SmQOskPS8GZ6s9t77yUUI6gZTEjO+S4eB3djXRsfTTijQ8+z4XmRA==", + "dev": true, + "dependencies": { + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@storybook/client-logger": "7.4.5", + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/types": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.5.tgz", + "integrity": "sha512-DTWFNjfRTpncjufDoUs0QnNkgHG2qThGKWL1D6sO18cYI02zWPyHWD8/cbqlvtT7XIGe3s1iUEfCTdU5GcwWBA==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.4.5", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@types/node": { + "version": "16.18.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.54.tgz", + "integrity": "sha512-oTmGy68gxZZ21FhTJVVvZBYpQHEBZxHKTsGshobMqm9qWpbqdZsA5jvsuPZcHu0KwpmLrOHWPdEfg7XDpNT9UA==", + "dev": true + }, "node_modules/@storybook/builder-manager": { "version": "7.4.2", "dev": true, @@ -14653,7 +15103,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -15613,7 +16062,6 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -19336,126 +19784,6 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.2.tgz", - "integrity": "sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.2.tgz", - "integrity": "sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.2.tgz", - "integrity": "sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.2.tgz", - "integrity": "sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.2.tgz", - "integrity": "sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.2.tgz", - "integrity": "sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.2.tgz", - "integrity": "sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.2.tgz", - "integrity": "sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } } } } diff --git a/dashboard/package.json b/dashboard/package.json index f3b64ebdd..97e4160c8 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -36,7 +36,7 @@ "@storybook/addon-interactions": "^7.0.0-beta.52", "@storybook/addon-links": "^7.0.0-beta.52", "@storybook/addons": "^7.0.0-beta.52", - "@storybook/blocks": "^7.4.0", + "@storybook/blocks": "^7.4.5", "@storybook/nextjs": "^7.0.0-alpha.41", "@storybook/react": "^7.0.0-beta.52", "@storybook/testing-library": "^0.0.14-next.1", From 000430e1fa048302de9f191477bba056cb887daa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 23:49:49 +0000 Subject: [PATCH 144/191] chore(deps-dev): bump postcss from 8.4.29 to 8.4.30 in /dashboard Bumps [postcss](https://github.com/postcss/postcss) from 8.4.29 to 8.4.30. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.29...8.4.30) --- updated-dependencies: - dependency-name: postcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 249 ++++++++++++++++++------------------ dashboard/package.json | 2 +- 2 files changed, 125 insertions(+), 126 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index b040c98c9..5364a1b20 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -50,7 +50,7 @@ "husky": "^8.0.0", "jest": "^29.5.0", "jest-environment-jsdom": "^29.6.4", - "postcss": "^8.4.18", + "postcss": "^8.4.30", "prettier": "^2.7.1", "prettier-plugin-tailwindcss": "^0.2.2", "storybook": "^7.0.0-beta.52", @@ -3315,6 +3315,126 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.2.tgz", + "integrity": "sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.2.tgz", + "integrity": "sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.2.tgz", + "integrity": "sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.2.tgz", + "integrity": "sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.2.tgz", + "integrity": "sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.2.tgz", + "integrity": "sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.2.tgz", + "integrity": "sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.2.tgz", + "integrity": "sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@next/swc-win32-x64-msvc": { "version": "13.5.2", "cpu": [ @@ -14653,7 +14773,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -15231,7 +15350,9 @@ } }, "node_modules/postcss": { - "version": "8.4.29", + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", "dev": true, "funding": [ { @@ -15247,7 +15368,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -15613,7 +15733,6 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -19336,126 +19455,6 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.2.tgz", - "integrity": "sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.2.tgz", - "integrity": "sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.2.tgz", - "integrity": "sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.2.tgz", - "integrity": "sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.2.tgz", - "integrity": "sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.2.tgz", - "integrity": "sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.2.tgz", - "integrity": "sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.2.tgz", - "integrity": "sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } } } } diff --git a/dashboard/package.json b/dashboard/package.json index f3b64ebdd..c6d4d9417 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -56,7 +56,7 @@ "husky": "^8.0.0", "jest": "^29.5.0", "jest-environment-jsdom": "^29.6.4", - "postcss": "^8.4.18", + "postcss": "^8.4.30", "prettier": "^2.7.1", "prettier-plugin-tailwindcss": "^0.2.2", "storybook": "^7.0.0-beta.52", From b2b3f343c77f6a36c0d462fa516090c4e01376c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 08:14:07 +0000 Subject: [PATCH 145/191] chore(deps-dev): bump eslint-config-prettier in /dashboard Bumps [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) from 8.10.0 to 9.0.0. - [Changelog](https://github.com/prettier/eslint-config-prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-config-prettier/compare/v8.10.0...v9.0.0) --- updated-dependencies: - dependency-name: eslint-config-prettier dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 7 ++++--- dashboard/package.json | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 95f2e18c3..4c53d995a 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -43,7 +43,7 @@ "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-next": "13.5.2", - "eslint-config-prettier": "^8.5.0", + "eslint-config-prettier": "^9.0.0", "eslint-plugin-jest": "^27.4.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-storybook": "^0.6.13", @@ -10319,9 +10319,10 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.10.0", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, diff --git a/dashboard/package.json b/dashboard/package.json index 97e4160c8..313faf5f8 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -49,7 +49,7 @@ "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-next": "13.5.2", - "eslint-config-prettier": "^8.5.0", + "eslint-config-prettier": "^9.0.0", "eslint-plugin-jest": "^27.4.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-storybook": "^0.6.13", From b6c1f51b00addae4196c7207f19db47ad1faac6b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 08:28:06 +0000 Subject: [PATCH 146/191] chore(deps): bump @types/node from 20.6.2 to 20.7.0 in /dashboard Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.6.2 to 20.7.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 7 ++++--- dashboard/package.json | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 7112b7857..ef90b859a 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@sentry/react": "^7.41.0", "@sentry/tracing": "^7.41.0", - "@types/node": "20.6.2", + "@types/node": "20.7.0", "@types/react": "18.2.22", "@types/react-dom": "18.2.7", "chart.js": "^4.2.1", @@ -6479,8 +6479,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.6.2", - "license": "MIT" + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" }, "node_modules/@types/node-fetch": { "version": "2.6.5", diff --git a/dashboard/package.json b/dashboard/package.json index 4e9cf1f5b..3ece00ff1 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -16,7 +16,7 @@ "dependencies": { "@sentry/react": "^7.41.0", "@sentry/tracing": "^7.41.0", - "@types/node": "20.6.2", + "@types/node": "20.7.0", "@types/react": "18.2.22", "@types/react-dom": "18.2.7", "chart.js": "^4.2.1", From a5f944f2c3cb8fe743dbf29531ef5e668d1fdead Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 08:28:20 +0000 Subject: [PATCH 147/191] chore(deps): bump next from 13.5.2 to 13.5.3 in /dashboard Bumps [next](https://github.com/vercel/next.js) from 13.5.2 to 13.5.3. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v13.5.2...v13.5.3) --- updated-dependencies: - dependency-name: next dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 85 +++++++++++++++++++------------------ dashboard/package.json | 2 +- 2 files changed, 45 insertions(+), 42 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 7112b7857..f3074bddc 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -15,7 +15,7 @@ "@types/react-dom": "18.2.7", "chart.js": "^4.2.1", "classnames": "^2.3.2", - "next": "^13.5.2", + "next": "^13.5.3", "react": "18.2.0", "react-chartjs-2": "^5.2.0", "react-dom": "18.2.0", @@ -3285,8 +3285,9 @@ } }, "node_modules/@next/env": { - "version": "13.5.2", - "license": "MIT" + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.3.tgz", + "integrity": "sha512-X4te86vsbjsB7iO4usY9jLPtZ827Mbx+WcwNBGUOIuswuTAKQtzsuoxc/6KLxCMvogKG795MhrR1LDhYgDvasg==" }, "node_modules/@next/eslint-plugin-next": { "version": "13.5.2", @@ -3316,9 +3317,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.2.tgz", - "integrity": "sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.3.tgz", + "integrity": "sha512-6hiYNJxJmyYvvKGrVThzo4nTcqvqUTA/JvKim7Auaj33NexDqSNwN5YrrQu+QhZJCIpv2tULSHt+lf+rUflLSw==", "cpu": [ "arm64" ], @@ -3331,9 +3332,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.2.tgz", - "integrity": "sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.3.tgz", + "integrity": "sha512-UpBKxu2ob9scbpJyEq/xPgpdrgBgN3aLYlxyGqlYX5/KnwpJpFuIHU2lx8upQQ7L+MEmz+fA1XSgesoK92ppwQ==", "cpu": [ "x64" ], @@ -3346,9 +3347,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.2.tgz", - "integrity": "sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.3.tgz", + "integrity": "sha512-5AzM7Yx1Ky+oLY6pHs7tjONTF22JirDPd5Jw/3/NazJ73uGB05NqhGhB4SbeCchg7SlVYVBeRMrMSZwJwq/xoA==", "cpu": [ "arm64" ], @@ -3361,9 +3362,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.2.tgz", - "integrity": "sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.3.tgz", + "integrity": "sha512-A/C1shbyUhj7wRtokmn73eBksjTM7fFQoY2v/0rTM5wehpkjQRLOXI8WJsag2uLhnZ4ii5OzR1rFPwoD9cvOgA==", "cpu": [ "arm64" ], @@ -3376,9 +3377,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.2.tgz", - "integrity": "sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.3.tgz", + "integrity": "sha512-FubPuw/Boz8tKkk+5eOuDHOpk36F80rbgxlx4+xty/U71e3wZZxVYHfZXmf0IRToBn1Crb8WvLM9OYj/Ur815g==", "cpu": [ "x64" ], @@ -3391,9 +3392,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.2.tgz", - "integrity": "sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.3.tgz", + "integrity": "sha512-DPw8nFuM1uEpbX47tM3wiXIR0Qa+atSzs9Q3peY1urkhofx44o7E1svnq+a5Q0r8lAcssLrwiM+OyJJgV/oj7g==", "cpu": [ "x64" ], @@ -3406,9 +3407,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.2.tgz", - "integrity": "sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.3.tgz", + "integrity": "sha512-zBPSP8cHL51Gub/YV8UUePW7AVGukp2D8JU93IHbVDu2qmhFAn9LWXiOOLKplZQKxnIPUkJTQAJDCWBWU4UWUA==", "cpu": [ "arm64" ], @@ -3421,9 +3422,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.2.tgz", - "integrity": "sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.3.tgz", + "integrity": "sha512-ONcL/lYyGUj4W37D4I2I450SZtSenmFAvapkJQNIJhrPMhzDU/AdfLkW98NvH1D2+7FXwe7yclf3+B7v28uzBQ==", "cpu": [ "ia32" ], @@ -3436,11 +3437,12 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.5.2", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.3.tgz", + "integrity": "sha512-2Vz2tYWaLqJvLcWbbTlJ5k9AN6JD7a5CN2pAeIzpbecK8ZF/yobA39cXtv6e+Z8c5UJuVOmaTldEAIxvsIux/Q==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -14863,10 +14865,11 @@ "license": "MIT" }, "node_modules/next": { - "version": "13.5.2", - "license": "MIT", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/next/-/next-13.5.3.tgz", + "integrity": "sha512-4Nt4HRLYDW/yRpJ/QR2t1v63UOMS55A38dnWv3UDOWGezuY0ZyFO1ABNbD7mulVzs9qVhgy2+ppjdsANpKP1mg==", "dependencies": { - "@next/env": "13.5.2", + "@next/env": "13.5.3", "@swc/helpers": "0.5.2", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -14882,15 +14885,15 @@ "node": ">=16.14.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.5.2", - "@next/swc-darwin-x64": "13.5.2", - "@next/swc-linux-arm64-gnu": "13.5.2", - "@next/swc-linux-arm64-musl": "13.5.2", - "@next/swc-linux-x64-gnu": "13.5.2", - "@next/swc-linux-x64-musl": "13.5.2", - "@next/swc-win32-arm64-msvc": "13.5.2", - "@next/swc-win32-ia32-msvc": "13.5.2", - "@next/swc-win32-x64-msvc": "13.5.2" + "@next/swc-darwin-arm64": "13.5.3", + "@next/swc-darwin-x64": "13.5.3", + "@next/swc-linux-arm64-gnu": "13.5.3", + "@next/swc-linux-arm64-musl": "13.5.3", + "@next/swc-linux-x64-gnu": "13.5.3", + "@next/swc-linux-x64-musl": "13.5.3", + "@next/swc-win32-arm64-msvc": "13.5.3", + "@next/swc-win32-ia32-msvc": "13.5.3", + "@next/swc-win32-x64-msvc": "13.5.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", diff --git a/dashboard/package.json b/dashboard/package.json index 4e9cf1f5b..e35dc89c3 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -21,7 +21,7 @@ "@types/react-dom": "18.2.7", "chart.js": "^4.2.1", "classnames": "^2.3.2", - "next": "^13.5.2", + "next": "^13.5.3", "react": "18.2.0", "react-chartjs-2": "^5.2.0", "react-dom": "18.2.0", From 9e03b0e076d0f68d6a7cb3b45f2b3e922c63b5c9 Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Tue, 26 Sep 2023 10:36:30 +0200 Subject: [PATCH 148/191] fix: return onboarding status --- handlers/accounts_handler.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index 479e2cab8..1fe1a1709 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -28,7 +28,9 @@ func (handler *ApiHandler) IsOnboardedHandler(c *gin.Context) { } if handler.db != nil { + output.Status = "PENDING_DATABASE" c.JSON(http.StatusOK, output) + return } accounts := make([]models.Account, 0) @@ -41,6 +43,8 @@ func (handler *ApiHandler) IsOnboardedHandler(c *gin.Context) { if len(accounts) > 0 { output.Onboarded = true + } else { + output.Status = "PENDING_ACCOUNTS" } c.JSON(http.StatusOK, output) From 248fc9744b9462b93c405149c09df8c33f2f7b35 Mon Sep 17 00:00:00 2001 From: Azanul Date: Tue, 26 Sep 2023 14:32:04 +0530 Subject: [PATCH 149/191] opencost made optional Signed-off-by: Azanul --- providers/k8s/core/pods.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/providers/k8s/core/pods.go b/providers/k8s/core/pods.go index 87e904fc9..180d8ee12 100644 --- a/providers/k8s/core/pods.go +++ b/providers/k8s/core/pods.go @@ -17,10 +17,12 @@ func Pods(ctx context.Context, client providers.ProviderClient) ([]models.Resour var config metav1.ListOptions + opencostEnabled := true podsCost, err := oc.GetOpencostInfo(client.K8sClient.OpencostBaseUrl, "pod") if err != nil { - log.Printf("ERROR: Couldn't get pods info from OpenCost: %v", err) - return resources, err + log.Errorf("ERROR: Couldn't get pods info from OpenCost: %v", err) + log.Warn("Opencost disabled") + opencostEnabled = false } for { @@ -39,6 +41,11 @@ func Pods(ctx context.Context, client providers.ProviderClient) ([]models.Resour }) } + cost := 0.0 + if opencostEnabled { + cost = podsCost[pod.Name].TotalCost + } + resources = append(resources, models.Resource{ Provider: "Kubernetes", Account: client.Name, @@ -46,7 +53,7 @@ func Pods(ctx context.Context, client providers.ProviderClient) ([]models.Resour ResourceId: string(pod.UID), Name: pod.Name, Region: pod.Namespace, - Cost: podsCost[pod.Name].TotalCost, + Cost: cost, CreatedAt: pod.CreationTimestamp.Time, FetchedAt: time.Now(), Tags: tags, From 785cba4d870c868141a2369550ca5876c934027c Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Tue, 26 Sep 2023 11:02:52 +0200 Subject: [PATCH 150/191] fix: place goroutine error under error scope --- internal/internal.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/internal.go b/internal/internal.go index 7ce285c3f..6d2f2f892 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -293,8 +293,8 @@ func triggerFetchingWorfklow(ctx context.Context, client providers.ProviderClien defer func() { err := recover() - log.WithField("err", err).Error(fmt.Sprintf("error fetching %s resources", provider)) if err != nil { + log.WithField("err", err).Error(fmt.Sprintf("error fetching %s resources", provider)) localHub.CaptureException(err.(error)) localHub.Flush(2 * time.Second) } From dd93376b4d0a639eff16233f5d175dcbae83d4ae Mon Sep 17 00:00:00 2001 From: LABOUARDY Mohamed Date: Tue, 26 Sep 2023 11:09:09 +0200 Subject: [PATCH 151/191] chore: added tw team to reviewers list --- .github/CODEOWNERS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f0288d55d..9ef48c933 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,4 @@ -* @mlabouardy @ShubhamPalriwala @AvineshTripathi +* @mlabouardy @ShubhamPalriwala @AvineshTripathi @greghub @Traxmaxx +docs @jakepage91 README.md @jakepage91 CONTRIBUTING.md @jakepage91 From b79693a6a5310013a8eca64bc559e1afe753e93b Mon Sep 17 00:00:00 2001 From: Aswath S Date: Tue, 26 Sep 2023 18:32:26 +0000 Subject: [PATCH 152/191] Fix. Analytics provider to Civo instead of Azure --- providers/civo/civo.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/civo/civo.go b/providers/civo/civo.go index 22d083d56..e658ecb79 100644 --- a/providers/civo/civo.go +++ b/providers/civo/civo.go @@ -56,7 +56,7 @@ func FetchResources(ctx context.Context, client providers.ProviderClient, db *bu } if telemetry { analytics.TrackEvent("discovered_resources", map[string]interface{}{ - "provider": "Azure", + "provider": "Civo", "resources": len(resources), }) } From ee652a84bb9ff4cef1b2c5ddf6305ea27e821d82 Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 27 Sep 2023 13:08:23 +0530 Subject: [PATCH 153/191] opencost struct types update Signed-off-by: Azanul --- providers/k8s/opencost/opencost.go | 33 ++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/providers/k8s/opencost/opencost.go b/providers/k8s/opencost/opencost.go index 177826147..0bb3aaa05 100644 --- a/providers/k8s/opencost/opencost.go +++ b/providers/k8s/opencost/opencost.go @@ -16,12 +16,18 @@ type OpenCostResponse struct { type costData struct { Properties struct { - Cluster string `json:"cluster"` - Node string `json:"node"` + Cluster string `json:"cluster"` + Node string `json:"node"` + Controller string `json:"controller"` + Pod string `json:"pod"` + ProviderID string `json:"providerID"` + Namespace string `json:"namespace"` + ControllerKind string `json:"controllerKind"` } `json:"properties"` + Window Window `json:"window"` Start time.Time `json:"start"` End time.Time `json:"end"` - Minutes int `json:"minutes"` + Minutes float64 `json:"minutes"` CPUCores float64 `json:"cpuCores"` CPUCoreRequestAvg float64 `json:"cpuCoreRequestAverage"` CPUCoreUsageAvg float64 `json:"cpuCoreUsageAverage"` @@ -29,12 +35,12 @@ type costData struct { CPUCost float64 `json:"cpuCost"` CPUCostAdjustment float64 `json:"cpuCostAdjustment"` CPUEfficiency float64 `json:"cpuEfficiency"` - GPUCount int `json:"gpuCount"` - GPUHours int `json:"gpuHours"` + GPUCount float64 `json:"gpuCount"` + GPUHours float64 `json:"gpuHours"` GPUCost float64 `json:"gpuCost"` GPUCostAdjustment float64 `json:"gpuCostAdjustment"` - NetworkTransfer int64 `json:"networkTransferBytes"` - NetworkReceive int64 `json:"networkReceiveBytes"` + NetworkTransfer float64 `json:"networkTransferBytes"` + NetworkReceive float64 `json:"networkReceiveBytes"` NetworkCost float64 `json:"networkCost"` NetworkCrossZone float64 `json:"networkCrossZoneCost"` NetworkCrossRegion float64 `json:"networkCrossRegionCost"` @@ -42,14 +48,14 @@ type costData struct { NetworkAdjustment float64 `json:"networkCostAdjustment"` LoadBalancerCost float64 `json:"loadBalancerCost"` LBCostAdjustment float64 `json:"loadBalancerCostAdjustment"` - PVBytes int64 `json:"pvBytes"` + PVBytes float64 `json:"pvBytes"` PVByteHours float64 `json:"pvByteHours"` PVCost float64 `json:"pvCost"` PVs map[string]pvInfo `json:"pvs"` PVCostAdjustment float64 `json:"pvCostAdjustment"` - RAMBytes int64 `json:"ramBytes"` - RAMByteRequestAvg int64 `json:"ramByteRequestAverage"` - RAMByteUsageAvg int64 `json:"ramByteUsageAverage"` + RAMBytes float64 `json:"ramBytes"` + RAMByteRequestAvg float64 `json:"ramByteRequestAverage"` + RAMByteUsageAvg float64 `json:"ramByteUsageAverage"` RAMByteHours float64 `json:"ramByteHours"` RAMCost float64 `json:"ramCost"` RAMCostAdjustment float64 `json:"ramCostAdjustment"` @@ -60,6 +66,11 @@ type costData struct { TotalEfficiency float64 `json:"totalEfficiency"` } +type Window struct { + Start string `json:"start"` + End string `json:"end"` +} + type pvInfo struct { ByteHours float64 `json:"byteHours"` Cost float64 `json:"cost"` From be35e037f83c48c62fded147681c3abe1e5a23b7 Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 27 Sep 2023 15:24:44 +0530 Subject: [PATCH 154/191] cost explorer this month period Signed-off-by: Azanul --- .../cost-explorer/hooks/useCostExplorer.tsx | 5 +++++ .../cost-explorer/hooks/useCostExplorerChart.tsx | 2 ++ .../components/cost-explorer/utils/dateHelper.ts | 11 ++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dashboard/components/dashboard/components/cost-explorer/hooks/useCostExplorer.tsx b/dashboard/components/dashboard/components/cost-explorer/hooks/useCostExplorer.tsx index 43deb402c..7b8eba919 100644 --- a/dashboard/components/dashboard/components/cost-explorer/hooks/useCostExplorer.tsx +++ b/dashboard/components/dashboard/components/cost-explorer/hooks/useCostExplorer.tsx @@ -1,6 +1,7 @@ import { useEffect, useRef, useState } from 'react'; import settingsService from '../../../../../services/settingsService'; import dateHelper, { + thisMonth, lastMonth, lastSixMonths, lastThreeMonths, @@ -23,6 +24,7 @@ export type CostExplorerQueryGroupProps = | 'view'; export type CostExplorerQueryGranularityProps = 'monthly' | 'daily'; export type CostExplorerQueryDateProps = + | 'thisMonth' | 'lastMonth' | 'lastThreeMonths' | 'lastSixMonths' @@ -58,6 +60,9 @@ function useCostExplorer() { let startDate = ''; let endDate = ''; + if (queryDate === 'thisMonth') { + [startDate, endDate] = thisMonth; + } if (queryDate === 'lastMonth') { [startDate, endDate] = lastMonth; } diff --git a/dashboard/components/dashboard/components/cost-explorer/hooks/useCostExplorerChart.tsx b/dashboard/components/dashboard/components/cost-explorer/hooks/useCostExplorerChart.tsx index 9ced0b164..5baff1201 100644 --- a/dashboard/components/dashboard/components/cost-explorer/hooks/useCostExplorerChart.tsx +++ b/dashboard/components/dashboard/components/cost-explorer/hooks/useCostExplorerChart.tsx @@ -100,12 +100,14 @@ function useCostExplorerChart({ const dateSelect = { values: [ + 'thisMonth', 'lastMonth', 'lastThreeMonths', 'lastSixMonths', 'lastTwelveMonths' ], displayValues: [ + 'This month', 'Last month', 'Last 3 months', 'Last 6 months', diff --git a/dashboard/components/dashboard/components/cost-explorer/utils/dateHelper.ts b/dashboard/components/dashboard/components/cost-explorer/utils/dateHelper.ts index 178dbfc4e..a4b5d7436 100644 --- a/dashboard/components/dashboard/components/cost-explorer/utils/dateHelper.ts +++ b/dashboard/components/dashboard/components/cost-explorer/utils/dateHelper.ts @@ -4,6 +4,12 @@ const dateHelper = { return date.toJSON().slice(0, 10); }, + getFirstDayOfThisMonth() { + const date = new Date(); + date.setDate(1); + return date.toJSON().slice(0, 10); + }, + getLastMonth() { const date = new Date(); date.setDate(1); @@ -71,7 +77,10 @@ export function dateFormatter(dateParam: string, granularity: string) { } return formattedDate; } - +export const thisMonth = [ + dateHelper.getFirstDayOfThisMonth(), + dateHelper.getToday() +]; export const lastMonth = [ dateHelper.getLastMonth(), dateHelper.getLastDayOfLastMonth() From 597b76a350225e014aa85be07756cb67446bd68b Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 27 Sep 2023 15:25:26 +0530 Subject: [PATCH 155/191] cost explorer last 6 months fix Signed-off-by: Azanul --- .../dashboard/components/cost-explorer/utils/dateHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/components/dashboard/components/cost-explorer/utils/dateHelper.ts b/dashboard/components/dashboard/components/cost-explorer/utils/dateHelper.ts index a4b5d7436..d02cb56c8 100644 --- a/dashboard/components/dashboard/components/cost-explorer/utils/dateHelper.ts +++ b/dashboard/components/dashboard/components/cost-explorer/utils/dateHelper.ts @@ -91,7 +91,7 @@ export const lastThreeMonths = [ ]; export const lastSixMonths = [ dateHelper.getLastSixMonths(), - dateHelper.getToday() + dateHelper.getLastDayOfLastMonth() ]; export const lastTwelveMonths = [ dateHelper.getLastTwelveMonths(), From 8a411564874c09ac57a49d8c2dbde1f20ae7b775 Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 27 Sep 2023 15:57:48 +0530 Subject: [PATCH 156/191] added references Signed-off-by: Azanul --- providers/k8s/opencost/opencost.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/providers/k8s/opencost/opencost.go b/providers/k8s/opencost/opencost.go index 0bb3aaa05..dcc477ff2 100644 --- a/providers/k8s/opencost/opencost.go +++ b/providers/k8s/opencost/opencost.go @@ -8,6 +8,12 @@ import ( "time" ) +// Opencost reference for the structs defined here +// +// Swagger: https://github.com/opencost/opencost/blob/develop/docs/swagger.json +// Go struct: https://github.com/opencost/opencost/blob/6a7d9ada3cd0422701c90b5df214b8bf322b0e62/pkg/kubecost/allocation_json.go#L13 +// + type OpenCostResponse struct { Code int `json:"code"` Status string `json:"status"` From cf79e2f9216e4865b40e5fa6f67b57083bf54e7d Mon Sep 17 00:00:00 2001 From: greghub Date: Thu, 21 Sep 2023 20:42:48 +0200 Subject: [PATCH 157/191] feat: allow user to configure a database --- .../icons/AlertCircleIconFilled.tsx | 24 ++++ .../onboarding-wizard/CredentialsButton.tsx | 10 +- .../DatabaseErrorMessage.tsx | 20 +++ .../onboarding-wizard/InputFileSelect.tsx | 27 +++- .../onboarding-wizard/LabelledInput.tsx | 3 + .../pages/onboarding/choose-database.tsx | 6 +- .../pages/onboarding/database/postgres.tsx | 128 +++++++++++++----- .../pages/onboarding/database/sqlite.tsx | 105 +++++++++++--- dashboard/services/settingsService.ts | 13 ++ 9 files changed, 264 insertions(+), 72 deletions(-) create mode 100644 dashboard/components/icons/AlertCircleIconFilled.tsx create mode 100644 dashboard/components/onboarding-wizard/DatabaseErrorMessage.tsx diff --git a/dashboard/components/icons/AlertCircleIconFilled.tsx b/dashboard/components/icons/AlertCircleIconFilled.tsx new file mode 100644 index 000000000..5e9559412 --- /dev/null +++ b/dashboard/components/icons/AlertCircleIconFilled.tsx @@ -0,0 +1,24 @@ +import { SVGProps } from 'react'; + +const AlertCircleIconFilled = (props: SVGProps) => ( + + + + +); + +export default AlertCircleIconFilled; diff --git a/dashboard/components/onboarding-wizard/CredentialsButton.tsx b/dashboard/components/onboarding-wizard/CredentialsButton.tsx index e561a66eb..d45950174 100644 --- a/dashboard/components/onboarding-wizard/CredentialsButton.tsx +++ b/dashboard/components/onboarding-wizard/CredentialsButton.tsx @@ -16,20 +16,14 @@ function CredentialsButton({ return (
-
diff --git a/dashboard/components/onboarding-wizard/DatabaseErrorMessage.tsx b/dashboard/components/onboarding-wizard/DatabaseErrorMessage.tsx new file mode 100644 index 000000000..8939b9b76 --- /dev/null +++ b/dashboard/components/onboarding-wizard/DatabaseErrorMessage.tsx @@ -0,0 +1,20 @@ +function DatabaseErrorMessage() { + return ( +
+ We're sorry, but we were unable to connect to your database using the + information provided. Please ensure that the information are correct and + try again. If you continue to experience issues, please{' '} + + contact our support + {' '} + team for assistance. +
+ ); +} + +export default DatabaseErrorMessage; diff --git a/dashboard/components/onboarding-wizard/InputFileSelect.tsx b/dashboard/components/onboarding-wizard/InputFileSelect.tsx index cd3b87c19..821b99d19 100644 --- a/dashboard/components/onboarding-wizard/InputFileSelect.tsx +++ b/dashboard/components/onboarding-wizard/InputFileSelect.tsx @@ -1,4 +1,8 @@ import { MutableRefObject, ReactNode } from 'react'; +import classNames from 'classnames'; +import AlertCircleIcon from '../icons/AlertCircleIcon'; +import AlertIcon from '../icons/AlertIcon'; +import AlertCircleIconFilled from '../icons/AlertCircleIconFilled'; interface InputFileSelectProps { id: string; @@ -8,6 +12,8 @@ interface InputFileSelectProps { icon?: ReactNode; subLabel?: string; disabled?: boolean; + hasError?: boolean; + errorMessage?: string; placeholder?: string; iconClick?: () => void; handleFileChange: (event: any) => void; @@ -25,10 +31,12 @@ function InputFileSelect({ placeholder, fileInputRef, handleFileChange, - disabled = false + disabled = false, + hasError = false, + errorMessage = '' }: InputFileSelectProps) { return ( -
+
@@ -39,7 +47,7 @@ function InputFileSelect({ )} -
+
{icon && ( @@ -65,6 +78,12 @@ function InputFileSelect({ )}
+ {hasError && errorMessage && ( +
+ + {errorMessage} +
+ )}
); } diff --git a/dashboard/components/onboarding-wizard/LabelledInput.tsx b/dashboard/components/onboarding-wizard/LabelledInput.tsx index 2ac06e60d..1450783a9 100644 --- a/dashboard/components/onboarding-wizard/LabelledInput.tsx +++ b/dashboard/components/onboarding-wizard/LabelledInput.tsx @@ -9,6 +9,7 @@ interface LabelledInputProps { subLabel?: string; disabled?: boolean; placeholder?: string; + required?: boolean; onChange?: (e: ChangeEvent) => void; } @@ -20,6 +21,7 @@ function LabelledInput({ value, subLabel, placeholder, + required = false, disabled = false, onChange }: LabelledInputProps) { @@ -48,6 +50,7 @@ function LabelledInput({ value={value} disabled={disabled} placeholder={placeholder} + required={required} className={`block w-full rounded py-[14.5px] text-sm text-black-900 outline outline-black-200 focus:outline-2 focus:outline-primary ${ icon ? 'pl-10' : 'pl-3' }`} diff --git a/dashboard/pages/onboarding/choose-database.tsx b/dashboard/pages/onboarding/choose-database.tsx index 1754ef075..b6f5ebb54 100644 --- a/dashboard/pages/onboarding/choose-database.tsx +++ b/dashboard/pages/onboarding/choose-database.tsx @@ -31,8 +31,10 @@ function DatabaseLeftItem({ return (
{ - // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + const { toast, setToast, dismissToast } = useToast(); + + const [isError, setIsError] = useState(false); + const [hostname, setHostname] = useState(''); + const [database, setDatabase] = useState(''); + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + + const handleNext = (e: FormEvent) => { + e.preventDefault(); + + const payload = JSON.stringify({ + type: 'POSTGRES', + hostname, + database, + username, + password + }); + + settingsService.saveDatabaseConfig(payload).then(res => { + setIsError(false); + + if (res === Error) { + setIsError(true); + } else { + setToast({ + hasError: false, + title: 'Database connected', + message: + 'Your Postgres database has been successfully connected to Komiser.' + }); + } + }); }; return ( @@ -38,45 +74,63 @@ export default function PostgreSQLCredentials() {
-
-
- - - - -
-
+ {isError && } - +
+
+
+ setHostname(e.target.value)} + subLabel="The server where the Postgres server is hosted" + placeholder="my-postgres-server" + /> + setDatabase(e.target.value)} + subLabel="The name of the database where Komiser will insert/save the data" + placeholder="my_database" + /> + setUsername(e.target.value)} + subLabel="The Postgres username" + placeholder="user" + /> + setPassword(e.target.value)} + subLabel="The Postgres password" + placeholder="Example0000*" + /> +
+
+ + - + + + {/* Toast component */} + {toast && }
); diff --git a/dashboard/pages/onboarding/database/sqlite.tsx b/dashboard/pages/onboarding/database/sqlite.tsx index 8e94bee89..4d5185920 100644 --- a/dashboard/pages/onboarding/database/sqlite.tsx +++ b/dashboard/pages/onboarding/database/sqlite.tsx @@ -1,5 +1,5 @@ import Head from 'next/head'; -import { useRef } from 'react'; +import { ChangeEvent, useRef, useState, FormEvent } from 'react'; import { allDBProviders } from '../../../utils/providerHelper'; @@ -11,12 +11,45 @@ import Folder2Icon from '../../../components/icons/Folder2Icon'; import DatabasePurplin from '../../../components/onboarding-wizard/DatabasePurplin'; import InputFileSelect from '../../../components/onboarding-wizard/InputFileSelect'; import CredentialsButton from '../../../components/onboarding-wizard/CredentialsButton'; +import settingsService from '../../../services/settingsService'; +import useToast from '../../../components/toast/hooks/useToast'; +import Toast from '../../../components/toast/Toast'; +import DatabaseErrorMessage from '../../../components/onboarding-wizard/DatabaseErrorMessage'; export default function SqliteCredentials() { const database = allDBProviders.SQLITE; - const handleNext = () => { - // TODO: (onboarding-wizard) complete form inputs, validation, submission and navigation + const { toast, setToast, dismissToast } = useToast(); + + const [filePath, setFilePath] = useState(''); + const [isValidationError, setIsValidationError] = useState(false); + const [errorMessage, setErrorMessage] = useState(''); + const [isError, setIsError] = useState(false); + + const handleNext = (e: FormEvent) => { + e.preventDefault(); + + if (!filePath || isError || isValidationError) return; + + const payload = JSON.stringify({ + type: 'SQLITE', + filePath + }); + + settingsService.saveDatabaseConfig(payload).then(res => { + setIsError(false); + + if (res === Error) { + setIsError(true); + } else { + setToast({ + hasError: false, + title: 'Database connected', + message: + 'Your Postgres database has been successfully connected to Komiser.' + }); + } + }); }; const fileInputRef = useRef(null); @@ -26,9 +59,26 @@ export default function SqliteCredentials() { } }; - const handleFileChange = (event: any) => { - const file = event.target.files[0]; - // TODO: (onboarding-wizard) handle file change and naming. Set Input field to file.name and use temporary file path for the upload value + const handleFileChange = (e: ChangeEvent) => { + setIsValidationError(false); + setIsError(false); + setErrorMessage(''); + setFilePath(''); + + const fileName = e.target.files?.[0].name; + + if (fileName) { + setFilePath(fileName); + if (!fileName.endsWith('.db')) { + setIsValidationError(true); + setErrorMessage( + 'Wrong file or file type not supported. Please choose a different file.' + ); + } + } else { + setIsValidationError(true); + setErrorMessage('Please choose a file.'); + } }; return ( @@ -51,28 +101,41 @@ export default function SqliteCredentials() {
-
-
- } - fileInputRef={fileInputRef} - iconClick={handleButtonClick} - handleFileChange={handleFileChange} - /> + {isError && } + +
+
+
+ } + fileInputRef={fileInputRef} + iconClick={handleButtonClick} + value={filePath} + hasError={isValidationError} + errorMessage={errorMessage} + handleFileChange={handleFileChange} + /> +
-
- + + + + {/* Toast component */} + {toast && }
); diff --git a/dashboard/services/settingsService.ts b/dashboard/services/settingsService.ts index 8ebd2d28d..66a922ede 100644 --- a/dashboard/services/settingsService.ts +++ b/dashboard/services/settingsService.ts @@ -408,6 +408,19 @@ const settingsService = { } catch (error) { return Error; } + }, + + async saveDatabaseConfig(payload: string) { + try { + const res = await fetch( + `${BASE_URL}/databases`, + settings('POST', payload) + ); + const data = await res.json(); + return data; + } catch (error) { + return Error; + } } }; From 0083e0cbc1bacffaaf7617c9416223e24b0d956e Mon Sep 17 00:00:00 2001 From: greghub Date: Thu, 21 Sep 2023 22:55:33 +0200 Subject: [PATCH 158/191] feat: display onboarding wizard if no cloud account was connected --- .../hooks/useCloudAccounts/useCloudAccount.ts | 39 ++++++++++++------- dashboard/pages/cloud-accounts.tsx | 5 ++- dashboard/services/settingsService.ts | 10 +++++ 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.ts b/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.ts index defa9b6b4..200557c85 100644 --- a/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.ts +++ b/dashboard/components/cloud-account/hooks/useCloudAccounts/useCloudAccount.ts @@ -27,26 +27,37 @@ function useCloudAccount() { const [cloudAccounts, setCloudAccounts] = useState([]); const [cloudAccountItem, setCloudAccountItem] = useState(); const isNotCustomView = !router.query.view; - const [loading, setLoading] = useState(true); - const [error, setError] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [hasError, setHasError] = useState(false); useEffect(() => { - settingsService.getCloudAccounts().then(res => { - if (!loading) { - setLoading(true); - } + if (!isLoading) { + setIsLoading(true); + } - if (error) { - setError(false); - } + settingsService + .getOnboardingStatus() + .then(res => { + if ( + res !== Error && + res.onboarded === false && + res.status === 'PENDING_DATABASE' + ) { + router.push('/onboarding/choose-database'); + } else { + router.push('/onboarding/choose-cloud'); + } + }) + .finally(() => setIsLoading(false)); + settingsService.getCloudAccounts().then(res => { if (res === Error) { - setLoading(false); - setError(true); + setHasError(true); } else { - setLoading(false); setCloudAccounts(res); } + + setIsLoading(false); }); }, []); @@ -67,11 +78,13 @@ function useCloudAccount() { setCloudAccountItem, goTo, toast, + hasError, setToast, dismissToast, cloudAccounts, setCloudAccounts, - isNotCustomView + isNotCustomView, + isLoading }; } diff --git a/dashboard/pages/cloud-accounts.tsx b/dashboard/pages/cloud-accounts.tsx index 26a871b1a..8450f78a5 100644 --- a/dashboard/pages/cloud-accounts.tsx +++ b/dashboard/pages/cloud-accounts.tsx @@ -35,7 +35,8 @@ function CloudAccounts() { toast, setToast, dismissToast, - isNotCustomView + isNotCustomView, + isLoading } = useCloudAccount(); useEffect(() => { @@ -68,7 +69,7 @@ function CloudAccounts() { setIsDeleteModalOpen(false); }; - if (!cloudAccounts) return null; + if (!cloudAccounts || isLoading) return null; return ( <> diff --git a/dashboard/services/settingsService.ts b/dashboard/services/settingsService.ts index 66a922ede..3f890831a 100644 --- a/dashboard/services/settingsService.ts +++ b/dashboard/services/settingsService.ts @@ -421,6 +421,16 @@ const settingsService = { } catch (error) { return Error; } + }, + + async getOnboardingStatus() { + try { + const res = await fetch(`${BASE_URL}/is_onboarded`, settings('GET')); + const data = await res.json(); + return data; + } catch (error) { + return Error; + } } }; From 7a3e8e0abd6574878f73505a4f3c763711681275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20R=C3=B6sel?= <320272+Traxmaxx@users.noreply.github.com> Date: Wed, 27 Sep 2023 18:01:45 +0200 Subject: [PATCH 159/191] feat: display dependency graph on the "Resource Explorer" page (#1005) * feat: add dependency graph backend (#883) * feat: add dependency graph frontend * feat: add filter state and share some of the inventory filter components with dependency graph --------- Co-authored-by: Avinesh Tripathi <73980067+AvineshTripathi@users.noreply.github.com> Co-authored-by: ShubhamPalriwala Co-authored-by: Mohamed Labouardy --- dashboard/.gitignore | 1 - dashboard/.tool-versions | 1 + .../components/explorer/DependencyGraph.tsx | 126 + .../explorer/DependencyGraphError.tsx | 67 + .../explorer/DependencyGraphLoader.tsx | 29 + .../explorer/DependencyGraphSkeleton.tsx | 18 + .../explorer/DependencyGraphWrapper.tsx | 107 + dashboard/components/explorer/config.ts | 118 + .../filter/DependencyGraphFilterDropdown.tsx | 128 + .../filter/DependencyGraphFilterField.tsx | 30 + .../filter/DependencyGraphFilterOptions.tsx | 170 + .../filter/DependencyGraphFilterSummary.tsx | 107 + .../filter/DependendencyGraphFilter.tsx | 95 + .../explorer/hooks/useDependencyGraph.tsx | 141 + dashboard/components/icons/ArrowDownIcon.tsx | 31 + .../filter/InventoryFilterField.tsx | 2 +- .../filter/InventoryFilterOperator.tsx | 28 + .../filter/InventoryFilterValue.tsx | 33 +- .../filter/hooks/useFilterWizard.tsx | 10 + dashboard/components/navbar/Navbar.tsx | 5 +- dashboard/next.config.js | 4 +- dashboard/package-lock.json | 6334 +++++++++++------ dashboard/package.json | 16 +- dashboard/pages/dashboard.tsx | 1 + dashboard/pages/explorer.tsx | 17 + .../assets/img/dependency-graph/aws-node.svg | 12 + dashboard/services/settingsService.ts | 14 + dashboard/styles/globals.css | 5 + dashboard/tailwind.config.js | 3 + dashboard/tsconfig.json | 10 +- handlers/resources_handler.go | 128 + handlers/views_handler.go | 2 +- internal/api/v1/endpoints.go | 1 + internal/internal.go | 2 +- .../20230619100000_add_new_relation_field.go | 24 + models/relation.go | 15 + models/resource.go | 5 +- providers/aws/aws.go | 4 +- providers/aws/ec2/autoscaling_groups.go | 18 + providers/aws/ec2/elastic_ips.go | 30 +- providers/aws/ec2/instances.go | 71 + providers/aws/ec2/keypair.go | 2 +- providers/aws/ec2/security_groups.go | 13 +- providers/aws/ec2/volumes.go | 33 +- providers/aws/ec2/vpcs.go | 52 + providers/aws/iam/roles.go | 38 +- providers/aws/lambda/functions.go | 41 +- 47 files changed, 5799 insertions(+), 2343 deletions(-) create mode 100644 dashboard/.tool-versions create mode 100644 dashboard/components/explorer/DependencyGraph.tsx create mode 100644 dashboard/components/explorer/DependencyGraphError.tsx create mode 100644 dashboard/components/explorer/DependencyGraphLoader.tsx create mode 100644 dashboard/components/explorer/DependencyGraphSkeleton.tsx create mode 100644 dashboard/components/explorer/DependencyGraphWrapper.tsx create mode 100644 dashboard/components/explorer/config.ts create mode 100644 dashboard/components/explorer/filter/DependencyGraphFilterDropdown.tsx create mode 100644 dashboard/components/explorer/filter/DependencyGraphFilterField.tsx create mode 100644 dashboard/components/explorer/filter/DependencyGraphFilterOptions.tsx create mode 100644 dashboard/components/explorer/filter/DependencyGraphFilterSummary.tsx create mode 100644 dashboard/components/explorer/filter/DependendencyGraphFilter.tsx create mode 100644 dashboard/components/explorer/hooks/useDependencyGraph.tsx create mode 100644 dashboard/components/icons/ArrowDownIcon.tsx create mode 100644 dashboard/pages/explorer.tsx create mode 100644 dashboard/public/assets/img/dependency-graph/aws-node.svg create mode 100644 migrations/20230619100000_add_new_relation_field.go create mode 100644 models/relation.go diff --git a/dashboard/.gitignore b/dashboard/.gitignore index ac1d86afd..c87c9b392 100644 --- a/dashboard/.gitignore +++ b/dashboard/.gitignore @@ -4,7 +4,6 @@ /node_modules /.pnp .pnp.js -/package-lock.json # testing /coverage diff --git a/dashboard/.tool-versions b/dashboard/.tool-versions new file mode 100644 index 000000000..70d0ba4ea --- /dev/null +++ b/dashboard/.tool-versions @@ -0,0 +1 @@ +nodejs 18.16.1 diff --git a/dashboard/components/explorer/DependencyGraph.tsx b/dashboard/components/explorer/DependencyGraph.tsx new file mode 100644 index 000000000..31ec6f64d --- /dev/null +++ b/dashboard/components/explorer/DependencyGraph.tsx @@ -0,0 +1,126 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, memo } from 'react'; +import CytoscapeComponent from 'react-cytoscapejs'; +import Cytoscape, { EventObject } from 'cytoscape'; + +import nodeHtmlLabel, { + CytoscapeNodeHtmlParams + // @ts-ignore +} from 'cytoscape-node-html-label'; + +// @ts-ignore +import COSEBilkent from 'cytoscape-cose-bilkent'; + +import { ReactFlowData } from './hooks/useDependencyGraph'; +import { + edgeAnimationConfig, + edgeStyleConfig, + graphLayoutConfig, + leafStyleConfig, + maxZoom, + minZoom, + nodeHTMLLabelConfig, + nodeStyeConfig, + zoomLevelBreakpoint +} from './config'; + +export type DependencyGraphProps = { + data: ReactFlowData; +}; + +nodeHtmlLabel(Cytoscape.use(COSEBilkent)); +const DependencyGraph = ({ data }: DependencyGraphProps) => { + const [initDone, setInitDone] = useState(false); + + // Type technically is Cytoscape.EdgeCollection but that throws an unexpected error + const loopAnimation = (eles: any) => { + const ani = eles.animation(edgeAnimationConfig[0], edgeAnimationConfig[1]); + + ani + .reverse() + .play() + .promise('complete') + .then(() => loopAnimation(eles)); + }; + + const cyActionHandlers = (cy: Cytoscape.Core) => { + // make sure we did not init already, otherwise this will be bound more than once + if (!initDone) { + // Add HTML labels for better flexibility + // @ts-ignore + cy.nodeHtmlLabel([ + { + ...nodeHTMLLabelConfig, + tpl(templateData: Cytoscape.NodeDataDefinition) { + return `

${ + templateData.label || ' ' + }

+

${ + templateData.service || ' ' + }

`; + } + } + ]); + // Add class to leave nodes so we can make them smaller + cy.nodes().leaves().addClass('leaf'); + // same for root notes + cy.nodes().roots().addClass('root'); + // Animate edges + cy.edges().forEach(loopAnimation); + + // Hide labels when being zoomed out + cy.on('zoom', event => { + const opacity = cy.zoom() <= zoomLevelBreakpoint ? 0 : 1; + + Array.from( + document.querySelectorAll('.dependency-graph-node-label'), + e => { + // @ts-ignore + e.style.opacity = opacity; + return e; + } + ); + }); + // Make sure to tell we inited successfully and prevent another init + setInitDone(true); + } + }; + + return ( +
+ cyActionHandlers(cy)} + /> +
+ ); +}; + +export default memo(DependencyGraph); diff --git a/dashboard/components/explorer/DependencyGraphError.tsx b/dashboard/components/explorer/DependencyGraphError.tsx new file mode 100644 index 000000000..f996e2ec4 --- /dev/null +++ b/dashboard/components/explorer/DependencyGraphError.tsx @@ -0,0 +1,67 @@ +import Button from '@components/button/Button'; + +type DashboardDependencyGraphErrorProps = { + fetch: () => void; +}; + +function DependencyGraphError({ fetch }: DashboardDependencyGraphErrorProps) { + return ( + <> +
+
+
+

+ Dependency Graph +

+
+

+ Analyze account resource associations +

+
+
+
+
+
+ + + + +

+ Cannot fetch Relationships +

+
+ +
+
+
+
+ + ); +} + +export default DependencyGraphError; diff --git a/dashboard/components/explorer/DependencyGraphLoader.tsx b/dashboard/components/explorer/DependencyGraphLoader.tsx new file mode 100644 index 000000000..1e64707e7 --- /dev/null +++ b/dashboard/components/explorer/DependencyGraphLoader.tsx @@ -0,0 +1,29 @@ +import { memo } from 'react'; +import DependencyGraphError from './DependencyGraphError'; +import DependencyGraphSkeleton from './DependencyGraphSkeleton'; +import DependencyGraphView from './DependencyGraph'; +import { ReactFlowData } from './hooks/useDependencyGraph'; + +export type DependencyGraphLoaderProps = { + loading: boolean; + data: ReactFlowData | undefined; + error: boolean; + fetch: () => void; +}; + +function DependencyGraphLoader({ + loading, + data, + error, + fetch +}: DependencyGraphLoaderProps) { + if (loading) return ; + + if (error) return ; + + if (data && !loading) return ; + + return null; +} + +export default memo(DependencyGraphLoader); diff --git a/dashboard/components/explorer/DependencyGraphSkeleton.tsx b/dashboard/components/explorer/DependencyGraphSkeleton.tsx new file mode 100644 index 000000000..34af17184 --- /dev/null +++ b/dashboard/components/explorer/DependencyGraphSkeleton.tsx @@ -0,0 +1,18 @@ +function DependencyGraphSkeleton() { + return ( + <> +
+
+
+
+
+
+
+ + ); +} + +export default DependencyGraphSkeleton; diff --git a/dashboard/components/explorer/DependencyGraphWrapper.tsx b/dashboard/components/explorer/DependencyGraphWrapper.tsx new file mode 100644 index 000000000..254f1c37a --- /dev/null +++ b/dashboard/components/explorer/DependencyGraphWrapper.tsx @@ -0,0 +1,107 @@ +import { useRouter } from 'next/router'; +import cn from 'classnames'; + +import { useEffect, useState } from 'react'; +import parseURLParams from '@components/inventory/hooks/useInventory/helpers/parseURLParams'; +import { InventoryFilterData } from '@components/inventory/hooks/useInventory/types/useInventoryTypes'; +import ArrowDownIcon from '@components/icons/ArrowDownIcon'; +import DependencyGraphLoader from './DependencyGraphLoader'; +import DependendencyGraphFilter from './filter/DependendencyGraphFilter'; +import useDependencyGraph from './hooks/useDependencyGraph'; + +function DependencyGraphWrapper() { + const { + loading, + data, + error, + fetch, + filters, + displayedFilters, + setDisplayedFilters, + deleteFilter, + setFilters + } = useDependencyGraph(); + const router = useRouter(); + const [filterOpen, setFilterOpen] = useState(false); + + useEffect(() => { + const newFilters: InventoryFilterData[] = Object.keys(router.query).map( + param => parseURLParams(param as string, 'fetch') + ); + const newFiltersToDisplay: InventoryFilterData[] = Object.keys( + router.query + ).map(param => parseURLParams(param as string, 'display')); + + setFilters(newFilters); + setDisplayedFilters(newFiltersToDisplay); + }, [router.query]); + + useEffect(() => { + const newFilters: InventoryFilterData[] = Object.keys(router.query).map( + param => parseURLParams(param as string, 'fetch') + ); + const newFiltersToDisplay: InventoryFilterData[] = Object.keys( + router.query + ).map(param => parseURLParams(param as string, 'display')); + + setFilters(newFilters); + setDisplayedFilters(newFiltersToDisplay); + }, []); + + const hasFilters = + Object.keys(router.query).length > 0 && + displayedFilters && + displayedFilters.length > 0; + + return ( + <> +
+
+

Graph View

+
setFilterOpen(!filterOpen)} + > + {displayedFilters && displayedFilters?.length > 0 && ( + + {displayedFilters?.length} + + )} + Filters + +
+
+
+ +
+ +
+ + ); +} + +export default DependencyGraphWrapper; diff --git a/dashboard/components/explorer/config.ts b/dashboard/components/explorer/config.ts new file mode 100644 index 000000000..9b91f9f3e --- /dev/null +++ b/dashboard/components/explorer/config.ts @@ -0,0 +1,118 @@ +import Cytoscape from 'cytoscape'; + +export const zoomLevelBreakpoint = 1.5; +export const maxZoom = 4; +export const minZoom = 0.25; +export const graphLayoutConfig = { + name: 'cose-bilkent', + // 'draft', 'default' or 'proof" + // - 'draft' fast cooling rate + // - 'default' moderate cooling rate + // - "proof" slow cooling rate + quality: 'default', + // Whether to include labels in node dimensions. Useful for avoiding label overlap + nodeDimensionsIncludeLabels: true, + // number of ticks per frame; higher is faster but more jerky + refresh: 30, + // Whether to fit the network view after when done + fit: true, + // Padding on fit + padding: 10, + // Whether to enable incremental mode + randomize: true, + // Node repulsion (non overlapping) multiplier + nodeRepulsion: 10000, + // Ideal (intra-graph) edge length + idealEdgeLength: 100, + // Divisor to compute edge forces + edgeElasticity: 0.45, + // Nesting factor (multiplier) to compute ideal edge length for inter-graph edges + nestingFactor: 0.1, + // Gravity force (constant) + gravity: 0.25, + // Maximum number of iterations to perform + numIter: 2500, + // Whether to tile disconnected nodes + tile: true, + // Type of layout animation. The option set is {'during', 'end', false} + animate: 'end', + // Duration for animate:end + animationDuration: 500, + // Amount of vertical space to put between degree zero nodes during tiling (can also be a function) + tilingPaddingVertical: 10, + // Amount of horizontal space to put between degree zero nodes during tiling (can also be a function) + tilingPaddingHorizontal: 10, + // Gravity range (constant) for compounds + gravityRangeCompound: 1.5, + // Gravity force (constant) for compounds + gravityCompound: 1.0, + // Gravity range (constant) + gravityRange: 3.8, + // Initial cooling factor for incremental layout + initialEnergyOnIncremental: 0.5, + nodeSeparation: 20000 +}; + +export const nodeStyeConfig = { + width(node) { + return Math.max(2, Math.ceil(node.degree(false) / 2)) * 20; + }, + height(node) { + return Math.max(2, Math.ceil(node.degree(false) / 2)) * 20; + }, + shape: 'ellipse', + 'text-opacity': 1, + 'font-size': 17, + 'background-color': 'white', + 'background-image': node => + node.data('provider') === 'AWS' + ? '/assets/img/dependency-graph/aws-node.svg' + : '', + 'background-height': 20, + 'background-width': 20, + 'border-color': '#EDEBEE', + 'border-width': 1, + 'border-style': 'solid', + 'transition-property': 'opacity', + 'transition-duration': 0.2, + 'transition-timing-function': 'linear' +} as Cytoscape.Css.Node; + +export const edgeStyleConfig = { + width: 1, + 'line-fill': 'linear-gradient', + 'line-gradient-stop-colors': ['#008484', '#33CCCC'], + 'line-style': edge => (edge.data('relation') === 'USES' ? 'solid' : 'dashed'), + 'curve-style': 'unbundled-bezier', + 'control-point-distances': edge => edge.data('controlPointDistances'), + 'control-point-weights': [0.15, 0.85] +} as Cytoscape.Css.Edge; + +export const leafStyleConfig = { + width: 28, + height: 28, + opacity: 1 +} as Cytoscape.Css.Node; + +export const edgeAnimationConfig = [ + { + zoom: { level: 1 }, + easing: 'linear', + style: { + 'line-dash-offset': 24, + 'line-dash-pattern': [4, 4] + } + }, + { + duration: 4000 + } +]; + +export const nodeHTMLLabelConfig = { + query: 'node', // cytoscape query selector + halign: 'center', // title vertical position. Can be 'left',''center, 'right' + valign: 'bottom', // title vertical position. Can be 'top',''center, 'bottom' + halignBox: 'center', // title vertical position. Can be 'left',''center, 'right' + valignBox: 'bottom', // title relative box vertical position. Can be 'top',''center, 'bottom' + cssClass: 'dependency-graph-node-label' // any classes will be as attribute of
container for every title +}; diff --git a/dashboard/components/explorer/filter/DependencyGraphFilterDropdown.tsx b/dashboard/components/explorer/filter/DependencyGraphFilterDropdown.tsx new file mode 100644 index 000000000..c2c927f1d --- /dev/null +++ b/dashboard/components/explorer/filter/DependencyGraphFilterDropdown.tsx @@ -0,0 +1,128 @@ +import { useEffect } from 'react'; +import useInventory from '@components/inventory/hooks/useInventory/useInventory'; +import useFilterWizard from '@components/inventory/components/filter/hooks/useFilterWizard'; +import Button from '@components/button/Button'; +import InventoryFilterBreadcrumbs from '@components/inventory/components/filter/InventoryFilterBreadcrumbs'; +import InventoryFilterOperator from '@components/inventory/components/filter/InventoryFilterOperator'; +import InventoryFilterValue from '@components/inventory/components/filter/InventoryFilterValue'; +import DependencyGraphFilterSummary from './DependencyGraphFilterSummary'; +import DependencyGraphFilterField from './DependencyGraphFilterField'; + +type InventoryFilterDropdownProps = { + position: string; + closeDropdownAfterAdd: boolean; + toggle: () => void; +}; + +export default function InventoryFilterDropdown({ + position, + toggle, + closeDropdownAfterAdd +}: InventoryFilterDropdownProps) { + const { setSkippedSearch, router, setToast } = useInventory(); + + const { + // toggle, + step, + goTo, + handleField, + handleOperator, + handleTagKey, + handleValueCheck, + handleValueInput, + costBetween, + handleCostBetween, + inlineError, + data, + resetData, + cleanValues, + filter + } = useFilterWizard({ router, setSkippedSearch }); + + useEffect(() => { + cleanValues(); + }, []); + + return ( + <> + {/* Dropdown transparent backdrop */} +
+
+
+ {/* Filter breadcrumbs */} + +
+ + {/* Filter summary */} + {step !== 0 && data && data.field && ( + + )} +
+ + {/* Filter steps - 1/3 filter field */} + {step === 0 && ( + + )} + + {/* Filter steps - 2/3 filter operator */} + {step === 1 && ( + + )} + + {/* Filter steps - 3/3 filter value */} + {step === 2 && ( +
{ + e.preventDefault(); + filter(); + if (closeDropdownAfterAdd) toggle(); + }} + > +
+ +
+ {inlineError.hasError && ( +

+ {inlineError.message} +

+ )} +
+ +
+
+ )} +
+
+ + ); +} diff --git a/dashboard/components/explorer/filter/DependencyGraphFilterField.tsx b/dashboard/components/explorer/filter/DependencyGraphFilterField.tsx new file mode 100644 index 000000000..36f1b481f --- /dev/null +++ b/dashboard/components/explorer/filter/DependencyGraphFilterField.tsx @@ -0,0 +1,30 @@ +import Button from '@components/button/Button'; +import DependencyGraphFilterFieldOptions from './DependencyGraphFilterOptions'; + +type DependencyGraphFilterFieldProps = { + handleField: (field: string) => void; +}; + +function DependencyGraphFilterField({ + handleField +}: DependencyGraphFilterFieldProps) { + return ( + <> + {DependencyGraphFilterFieldOptions.map((option, idx) => ( + + ))} + + ); +} + +export default DependencyGraphFilterField; diff --git a/dashboard/components/explorer/filter/DependencyGraphFilterOptions.tsx b/dashboard/components/explorer/filter/DependencyGraphFilterOptions.tsx new file mode 100644 index 000000000..b1b817e6f --- /dev/null +++ b/dashboard/components/explorer/filter/DependencyGraphFilterOptions.tsx @@ -0,0 +1,170 @@ +import { ReactNode } from 'react'; + +export type DependencyGraphFilterFieldOptionsProps = { + label: string; + value: string; + icon: ReactNode; +}; + +const DependencyGraphFilterFieldOptions: DependencyGraphFilterFieldOptionsProps[] = + [ + { + label: 'Cloud provider', + value: 'provider', + icon: ( + + + + + ) + }, + { + label: 'Cloud region', + value: 'region', + icon: ( + + + + + + ) + }, + { + label: 'Cloud service', + value: 'service', + icon: ( + + + + ) + }, + { + label: 'Resource relation', + value: 'relations', + icon: ( + + + + + + + + + + + ) + } + ]; + +export default DependencyGraphFilterFieldOptions; diff --git a/dashboard/components/explorer/filter/DependencyGraphFilterSummary.tsx b/dashboard/components/explorer/filter/DependencyGraphFilterSummary.tsx new file mode 100644 index 000000000..c3692840f --- /dev/null +++ b/dashboard/components/explorer/filter/DependencyGraphFilterSummary.tsx @@ -0,0 +1,107 @@ +import { InventoryFilterData } from '@components/inventory/hooks/useInventory/types/useInventoryTypes'; +import Button from '@components/button/Button'; +import CloseIcon from '@components/icons/CloseIcon'; +import DependencyGraphFilterOptions from './DependencyGraphFilterOptions'; + +type DependencyGraphFilterSummaryProps = { + id?: number; + bg?: 'white'; + data: InventoryFilterData; + deleteFilter?: (idx: number) => void; + resetData?: () => void; +}; + +function DependencyGraphFilterSummary({ + id, + bg, + data, + deleteFilter, + resetData +}: DependencyGraphFilterSummaryProps) { + const index = DependencyGraphFilterOptions.findIndex( + option => option.value === data.field + ); + + function getField(param: 'icon' | 'label') { + if (param === 'icon') return DependencyGraphFilterOptions[index].icon; + if (param === 'label') return DependencyGraphFilterOptions[index].label; + return param; + } + + function getOperator(param: InventoryFilterData['operator']) { + if (param === 'IS') return 'is'; + if (param === 'IS_NOT') return 'is not'; + if (param === 'CONTAINS') return 'contains'; + if (param === 'NOT_CONTAINS') return 'does not contain'; + if (param === 'IS_EMPTY' && data.field !== 'tags') return 'is empty'; + if (param === 'IS_EMPTY' && data.field === 'tags') return 'which are empty'; + if (param === 'IS_NOT_EMPTY' && data.field !== 'tags') + return 'is not empty'; + if (param === 'IS_NOT_EMPTY' && data.field === 'tags') + return 'which are not empty'; + if (param === 'EQUAL') return 'is equal to'; + if (param === 'BETWEEN') return 'is between'; + if (param === 'GREATER_THAN') return 'is greater than'; + if (param === 'LESS_THAN') return 'is less than'; + if (param === 'EXISTS') return 'does exist'; + if (param === 'NOT_EXISTS') return 'does not exist'; + return param; + } + + return ( +
+
+
{getField('icon')}
+

{getField('label')}

+ {data.tagKey &&

: {data.tagKey}

} + {data.operator && ( + <> + : + {getOperator(data.operator)} + + )} + {data.values && + data.values.length > 0 && + data.values.map((value, idx) => ( +

+ {idx === 0 && :} + + {data.field === 'cost' && '$'} + {value} + + {data.values.length > 1 && idx < data.values.length - 1 && ( + + {data.field === 'cost' && data.operator === 'BETWEEN' + ? 'and' + : 'or'} + + )} +

+ ))} +
+ {(deleteFilter || resetData) && ( +
+ +
+ )} +
+ ); +} + +export default DependencyGraphFilterSummary; diff --git a/dashboard/components/explorer/filter/DependendencyGraphFilter.tsx b/dashboard/components/explorer/filter/DependendencyGraphFilter.tsx new file mode 100644 index 000000000..374346d4b --- /dev/null +++ b/dashboard/components/explorer/filter/DependendencyGraphFilter.tsx @@ -0,0 +1,95 @@ +import { ReactNode, useState } from 'react'; +import { NextRouter } from 'next/router'; +import useFilterWizard from '@components/inventory/components/filter/hooks/useFilterWizard'; +import useInventory from '@components/inventory/hooks/useInventory/useInventory'; +import { InventoryFilterData } from '@components/inventory/hooks/useInventory/types/useInventoryTypes'; +import PlusIcon from '@components/icons/PlusIcon'; +import Button from '@components/button/Button'; +import CloseIcon from '@components/icons/CloseIcon'; +import DependencyGraphFilterSummary from './DependencyGraphFilterSummary'; +import DependencyGraphFilterDropdown from './DependencyGraphFilterDropdown'; + +type DependendencyGraphFilterProps = { + hasFilters: boolean | undefined; + displayedFilters: InventoryFilterData[] | undefined; + deleteFilter: (idx: number) => void; + router: NextRouter; + children?: ReactNode; +}; + +function DependendencyGraphFilter({ + hasFilters, + displayedFilters, + deleteFilter, + router, + children +}: DependendencyGraphFilterProps) { + const [skippedSearch, setSkippedSearch] = useState(0); + const { toggle, isOpen } = useFilterWizard({ router, setSkippedSearch }); + + return ( +
+ {!hasFilters ? ( + <> +
+ + Filter +
+ {isOpen && ( + + )} + + ) : ( +
+
Filters
+ {displayedFilters && + displayedFilters.map((activeFilter, idx) => ( + + ))} + +
+
+
+ +
+ {isOpen && ( + + )} +
+ +
+
router.push(router.pathname)} + > + + Clear filters + + +
+
+
+ )} + + {children} +
+ ); +} + +export default DependendencyGraphFilter; diff --git a/dashboard/components/explorer/hooks/useDependencyGraph.tsx b/dashboard/components/explorer/hooks/useDependencyGraph.tsx new file mode 100644 index 000000000..72c27f07c --- /dev/null +++ b/dashboard/components/explorer/hooks/useDependencyGraph.tsx @@ -0,0 +1,141 @@ +import { useEffect, useState } from 'react'; +import { useRouter } from 'next/router'; + +import { InventoryFilterData } from '@components/inventory/hooks/useInventory/types/useInventoryTypes'; +import settingsService from '@services/settingsService'; + +export type ReactFlowData = { + nodes: any[]; + edges: any[]; +}; + +// converting the json object into data that reactflow needs +// TODO - based on selected library +function GetData(res: any) { + const d = { + nodes: [], + edges: [] + } as ReactFlowData; + res.forEach((ele: any) => { + // check if node exist already + if (d.nodes.findIndex(element => element.id === ele.resourceId) === -1) { + const a = { + data: { + label: ele.name, + service: ele.service, + provider: 'AWS', + id: ele.resourceId, + isRoot: true + } + }; + d.nodes.push(a); + } + + ele.relations.forEach((rel: any) => { + // check for other node exists + if (d.nodes.findIndex(element => element.id === rel.resourceId) === -1) { + const a = { + data: { + id: rel.resourceId, + label: rel.name, + service: ele.service, + type: rel.type, + provider: 'AWS', // when supporting new provider this could be made dynamic + isRoot: false + } + }; + d.nodes.push(a); + } + const edge = { + data: { + id: `${ele.resourceId}-${rel.resourceId}`, + source: ele.resourceId, + target: rel.resourceId, + relation: rel.relation, + label: rel.type, + controlPointDistances: [ + Math.floor(Math.random() * 20), + Math.floor(Math.random() * 21) - 20 + ] + } + }; + d.edges.push(edge); + }); + }); + return d; +} + +function useDependencyGraph() { + const [loading, setLoading] = useState(true); + const [data, setData] = useState(); + const [error, setError] = useState(false); + const [filters, setFilters] = useState([]); + const [displayedFilters, setDisplayedFilters] = + useState(); + + const router = useRouter(); + + function fetch() { + if (!loading) { + setLoading(true); + } + + if (error) { + setError(false); + } + + settingsService.getRelations(filters).then(res => { + if (res === Error) { + setLoading(false); + setError(true); + } else { + setLoading(false); + setData(GetData(res)); + } + }); + } + + function deleteFilter(idx: number) { + const updatedFilters: InventoryFilterData[] = [...filters!]; + updatedFilters.splice(idx, 1); + const url = updatedFilters + .map( + filter => + `${filter.field}${`:${filter.operator}`}${ + filter.values.length > 0 ? `:${filter.values}` : '' + }` + ) + .join('&'); + router.push(url ? `?${url}` : '', undefined, { shallow: true }); + } + + const loadingFilters = + Object.keys(router.query).length > 0 && !displayedFilters && !error; + + const hasFilters = + Object.keys(router.query).length > 0 && + displayedFilters && + displayedFilters.length > 0; + + useEffect(() => { + fetch(); + }, []); + + useEffect(() => { + fetch(); + }, [filters, displayedFilters]); + + return { + loading, + data, + error, + fetch, + filters, + displayedFilters, + setDisplayedFilters, + deleteFilter, + setFilters + }; +} + +export default useDependencyGraph; diff --git a/dashboard/components/icons/ArrowDownIcon.tsx b/dashboard/components/icons/ArrowDownIcon.tsx new file mode 100644 index 000000000..254be3ea0 --- /dev/null +++ b/dashboard/components/icons/ArrowDownIcon.tsx @@ -0,0 +1,31 @@ +import { SVGProps } from 'react'; + +const ArrowDownIcon = (props: SVGProps) => ( + + + + +); + +export default ArrowDownIcon; diff --git a/dashboard/components/inventory/components/filter/InventoryFilterField.tsx b/dashboard/components/inventory/components/filter/InventoryFilterField.tsx index cd275e077..d64ebeccf 100644 --- a/dashboard/components/inventory/components/filter/InventoryFilterField.tsx +++ b/dashboard/components/inventory/components/filter/InventoryFilterField.tsx @@ -1,4 +1,4 @@ -import Button from '../../../button/Button'; +import Button from '@components/button/Button'; import inventoryFilterFieldOptions from './InventoryFilterFieldOptions'; type InventoryFilterFieldProps = { diff --git a/dashboard/components/inventory/components/filter/InventoryFilterOperator.tsx b/dashboard/components/inventory/components/filter/InventoryFilterOperator.tsx index 42eb2e873..3f997d0dd 100644 --- a/dashboard/components/inventory/components/filter/InventoryFilterOperator.tsx +++ b/dashboard/components/inventory/components/filter/InventoryFilterOperator.tsx @@ -54,6 +54,21 @@ const inventoryFilterOperatorCostOptions: InventoryFilterOperatorOptionsProps[] } ]; +const inventoryFilterRelationsOptions: InventoryFilterOperatorOptionsProps[] = [ + { + label: 'is equal to', + value: 'EQUAL' + }, + { + label: 'is greater than', + value: 'GREATER_THAN' + }, + { + label: 'is less than', + value: 'LESS_THAN' + } +]; + function InventoryFilterOperator({ data, handleOperator, @@ -80,6 +95,7 @@ function InventoryFilterOperator({ {/* Operators list which are not tags or cost */} {data.field !== 'tags' && data.field !== 'cost' && + data.field !== 'relations' && inventoryFilterOperatorOptions.map((option, idx) => ( + ))}
); } diff --git a/dashboard/components/inventory/components/filter/InventoryFilterValue.tsx b/dashboard/components/inventory/components/filter/InventoryFilterValue.tsx index 313e03d28..0ed019754 100644 --- a/dashboard/components/inventory/components/filter/InventoryFilterValue.tsx +++ b/dashboard/components/inventory/components/filter/InventoryFilterValue.tsx @@ -121,6 +121,7 @@ function InventoryFilterValue({ {/* Display input for resource name and tag values */} {!options && data.field !== 'cost' && + data.field !== 'relations' && data.operator !== 'IS_EMPTY' && data.operator !== 'IS_NOT_EMPTY' && data.operator !== 'EXISTS' && @@ -140,21 +141,23 @@ function InventoryFilterValue({ )} {/* Display input for cost when is equal, greater or less than */} - {!options && data.field === 'cost' && data.operator !== 'BETWEEN' && ( -
- -
- )} + {!options && + (data.field === 'cost' || data.field === 'relations') && + data.operator !== 'BETWEEN' && ( +
+ +
+ )} {/* Display input for cost when is between */} {!options && data.field === 'cost' && data.operator === 'BETWEEN' && ( diff --git a/dashboard/components/inventory/components/filter/hooks/useFilterWizard.tsx b/dashboard/components/inventory/components/filter/hooks/useFilterWizard.tsx index f77ad9eaf..ff5327e8c 100644 --- a/dashboard/components/inventory/components/filter/hooks/useFilterWizard.tsx +++ b/dashboard/components/inventory/components/filter/hooks/useFilterWizard.tsx @@ -144,6 +144,16 @@ function useFilterWizard({ router, setSkippedSearch }: InventoryFilterProps) { undefined, { shallow: true } ); + } else if (router.asPath === '/explorer/') { + router.push( + `?${data.field === 'tag' ? `tag:${data.tagKey}` : data.field}:${ + data.operator + }${ + data.values.length > 0 ? `:${data.values.map(value => value)}` : '' + }`, + undefined, + { shallow: true } + ); } else { router.push( `${router.asPath}&${ diff --git a/dashboard/components/navbar/Navbar.tsx b/dashboard/components/navbar/Navbar.tsx index 8fc632bc7..0aa081c2c 100644 --- a/dashboard/components/navbar/Navbar.tsx +++ b/dashboard/components/navbar/Navbar.tsx @@ -19,14 +19,15 @@ function Navbar() { { label: 'Inventory', href: '/inventory' }, betaFlagOnboardingWizard ? { label: 'Cloud Accounts', href: '/cloud-accounts' } - : null + : null, + { label: 'Explorer', href: '/explorer' } ].filter(item => item !== null) as NavItem[]; return ( diff --git a/dashboard/pages/cloud-accounts.tsx b/dashboard/pages/cloud-accounts.tsx index 3a2a23344..fbf9966e0 100644 --- a/dashboard/pages/cloud-accounts.tsx +++ b/dashboard/pages/cloud-accounts.tsx @@ -50,7 +50,8 @@ function CloudAccounts() { else { setFilteredCloudAccounts( cloudAccounts.filter( - account => account.provider === currentViewProvider + account => + account.provider.toLowerCase() === currentViewProvider.toLowerCase() ) ); } diff --git a/dashboard/utils/cloudAccountHelpers.ts b/dashboard/utils/cloudAccountHelpers.ts index bb787f3e0..39e1e2c9a 100644 --- a/dashboard/utils/cloudAccountHelpers.ts +++ b/dashboard/utils/cloudAccountHelpers.ts @@ -199,7 +199,7 @@ export const configureAccount = ( title: 'Cloud account added', message: 'The cloud account was successfully added!' }); - router.push('/onboarding/choose-cloud/'); + router.push('/onboarding/cloud-accounts/'); } }); From 823ccde6d06de2d21b68ab96de4f63c8ce290ea9 Mon Sep 17 00:00:00 2001 From: greghub Date: Tue, 3 Oct 2023 18:50:27 +0200 Subject: [PATCH 181/191] fix: cloud account key issue --- dashboard/pages/cloud-accounts.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/dashboard/pages/cloud-accounts.tsx b/dashboard/pages/cloud-accounts.tsx index fbf9966e0..0a62fe069 100644 --- a/dashboard/pages/cloud-accounts.tsx +++ b/dashboard/pages/cloud-accounts.tsx @@ -21,7 +21,7 @@ import useToast from '../components/toast/hooks/useToast'; function CloudAccounts() { const optionsRef = useRef(null); - const [clickedItemId, setClickedItemId] = useState(null); + const [clickedItemId, setClickedItemId] = useState(null); const [editCloudAccount, setEditCloudAccount] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); @@ -74,7 +74,7 @@ function CloudAccounts() { }; }, []); - const toggleOptions = (itemId: string) => { + const toggleOptions = (itemId: number) => { setClickedItemId(prevClickedItemId => { if (prevClickedItemId === itemId) { return null; // Close on Clicking the same item's icon @@ -102,12 +102,14 @@ function CloudAccounts() { {filteredCloudAccounts.map(account => { - const { provider, name, status } = account; - const isOpen = clickedItemId === name; + const { id, provider, name, status } = account; + const isOpen = clickedItemId === id; + + if (!id) return null; return (
openModal(account)} className="relative my-5 flex w-full items-center gap-4 rounded-lg border-2 border-black-170 bg-white p-6 text-black-900 transition-colors" > @@ -130,7 +132,7 @@ function CloudAccounts() { toggleOptions(name)} + onClick={() => toggleOptions(id)} /> {isOpen && ( From d7ca1a3d985b0dc8eccaa99206954dff2d1d40c5 Mon Sep 17 00:00:00 2001 From: greghub Date: Tue, 3 Oct 2023 19:20:54 +0200 Subject: [PATCH 182/191] fix: refactor cloud accounts page --- .../components/CloudAccountItem.tsx | 101 ++++++++++++++ dashboard/pages/cloud-accounts.tsx | 128 +++--------------- 2 files changed, 120 insertions(+), 109 deletions(-) create mode 100644 dashboard/components/cloud-account/components/CloudAccountItem.tsx diff --git a/dashboard/components/cloud-account/components/CloudAccountItem.tsx b/dashboard/components/cloud-account/components/CloudAccountItem.tsx new file mode 100644 index 000000000..82a0a3473 --- /dev/null +++ b/dashboard/components/cloud-account/components/CloudAccountItem.tsx @@ -0,0 +1,101 @@ +import { useState, useEffect, useRef } from 'react'; +import Image from 'next/image'; +import providers from '@utils/providerHelper'; +import { CloudAccount } from '../hooks/useCloudAccounts/useCloudAccount'; +import CloudAccountStatus from './CloudAccountStatus'; +import More2Icon from '../../icons/More2Icon'; +import DeleteIcon from '../../icons/DeleteIcon'; +import EditIcon from '../../icons/EditIcon'; + +export default function CloudAccountItem({ + account, + openModal, + setEditCloudAccount, + setIsDeleteModalOpen, + setCloudAccountItem +}: { + account: CloudAccount; + openModal: (cloudAccount: CloudAccount) => void; + setEditCloudAccount: (editCloudAccount: boolean) => void; + setIsDeleteModalOpen: (isDeleteModalOpen: boolean) => void; + setCloudAccountItem: (cloudAccountItem: CloudAccount) => void; +}) { + const optionsRef = useRef(null); + const { id, provider, name, status } = account; + const [isOpen, setIsOpen] = useState(false); + + useEffect(() => { + const handleOutsideClick = (event: MouseEvent) => { + if ( + optionsRef.current && + !optionsRef.current.contains(event.target as Node) + ) { + setIsOpen(false); // Close the options if clicked outside + } + }; + + document.addEventListener('mousedown', handleOutsideClick); + + return () => { + document.removeEventListener('mousedown', handleOutsideClick); + }; + }, []); + + return ( +
openModal(account)} + className="relative my-5 flex w-full items-center gap-4 rounded-lg border-2 border-black-170 bg-white p-6 text-black-900 transition-colors" + > + {`${name} + +
+

{name}

+

{providers.providerLabel(provider)}

+
+ + + + setIsOpen(!isOpen)} + /> + + {isOpen && ( +
+ + +
+ )} +
+ ); +} diff --git a/dashboard/pages/cloud-accounts.tsx b/dashboard/pages/cloud-accounts.tsx index 0a62fe069..2c19c693c 100644 --- a/dashboard/pages/cloud-accounts.tsx +++ b/dashboard/pages/cloud-accounts.tsx @@ -1,27 +1,19 @@ import { useEffect, useRef, useState } from 'react'; import Head from 'next/head'; -import Image from 'next/image'; import { useRouter } from 'next/router'; -import providers from '../utils/providerHelper'; +import CloudAccountItem from '@components/cloud-account/components/CloudAccountItem'; +import Toast from '@components/toast/Toast'; +import Modal from '@components/modal/Modal'; +import CloudAccountsHeader from '@components/cloud-account/components/CloudAccountsHeader'; +import CloudAccountsLayout from '@components/cloud-account/components/CloudAccountsLayout'; -import Toast from '../components/toast/Toast'; -import Modal from '../components/modal/Modal'; -import EditIcon from '../components/icons/EditIcon'; -import More2Icon from '../components/icons/More2Icon'; -import DeleteIcon from '../components/icons/DeleteIcon'; -import CloudAccountsHeader from '../components/cloud-account/components/CloudAccountsHeader'; -import CloudAccountsLayout from '../components/cloud-account/components/CloudAccountsLayout'; - -import useCloudAccount from '../components/cloud-account/hooks/useCloudAccounts/useCloudAccount'; -import CloudAccountsSidePanel from '../components/cloud-account/components/CloudAccountsSidePanel'; -import CloudAccountStatus from '../components/cloud-account/components/CloudAccountStatus'; -import CloudAccountDeleteContents from '../components/cloud-account/components/CloudAccountDeleteContents'; -import useToast from '../components/toast/hooks/useToast'; +import useCloudAccount from '@components/cloud-account/hooks/useCloudAccounts/useCloudAccount'; +import CloudAccountsSidePanel from '@components/cloud-account/components/CloudAccountsSidePanel'; +import CloudAccountDeleteContents from '@components/cloud-account/components/CloudAccountDeleteContents'; +import useToast from '@components/toast/hooks/useToast'; function CloudAccounts() { - const optionsRef = useRef(null); - const [clickedItemId, setClickedItemId] = useState(null); const [editCloudAccount, setEditCloudAccount] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); @@ -57,32 +49,6 @@ function CloudAccounts() { } }, [currentViewProvider, cloudAccounts]); - useEffect(() => { - const handleOutsideClick = (event: MouseEvent) => { - if ( - optionsRef.current && - !optionsRef.current.contains(event.target as Node) - ) { - setClickedItemId(null); // Close the options if clicked outside - } - }; - - document.addEventListener('mousedown', handleOutsideClick); - - return () => { - document.removeEventListener('mousedown', handleOutsideClick); - }; - }, []); - - const toggleOptions = (itemId: number) => { - setClickedItemId(prevClickedItemId => { - if (prevClickedItemId === itemId) { - return null; // Close on Clicking the same item's icon - } - return itemId; - }); - }; - const closeRemoveModal = () => { setIsDeleteModalOpen(false); }; @@ -101,72 +67,16 @@ function CloudAccounts() { - {filteredCloudAccounts.map(account => { - const { id, provider, name, status } = account; - const isOpen = clickedItemId === id; - - if (!id) return null; - - return ( -
openModal(account)} - className="relative my-5 flex w-full items-center gap-4 rounded-lg border-2 border-black-170 bg-white p-6 text-black-900 transition-colors" - > - {`${name} - -
-

{name}

-

- {providers.providerLabel(provider)} -

-
- - - - toggleOptions(id)} - /> - - {isOpen && ( -
- - -
- )} -
- ); - })} + {filteredCloudAccounts.map(account => ( + + ))}
{/* Delete Modal */} From cfb4d8bbac714a9accbe6e488d6728578f450577 Mon Sep 17 00:00:00 2001 From: greghub Date: Tue, 3 Oct 2023 19:23:26 +0200 Subject: [PATCH 183/191] fix: remove beta flag redirect to onboarding --- dashboard/pages/index.tsx | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/dashboard/pages/index.tsx b/dashboard/pages/index.tsx index 7bc74d11b..da9981877 100644 --- a/dashboard/pages/index.tsx +++ b/dashboard/pages/index.tsx @@ -1,19 +1,11 @@ import { useRouter } from 'next/router'; -import { useContext, useEffect } from 'react'; - -import GlobalAppContext from '../components/layout/context/GlobalAppContext'; +import { useEffect } from 'react'; function Home() { - const { betaFlagOnboardingWizard } = useContext(GlobalAppContext); - const router = useRouter(); useEffect(() => { - if (betaFlagOnboardingWizard) { - router.push('/onboarding/choose-cloud'); - } else { - router.push('/dashboard'); - } + router.push('/dashboard'); }, []); } From 99c55ee5b97e4eb9fdcb2557f5bc6d1de4558933 Mon Sep 17 00:00:00 2001 From: greghub Date: Wed, 4 Oct 2023 01:19:28 +0200 Subject: [PATCH 184/191] fix: "Unable to resolve path to module" error --- dashboard/.eslintrc.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dashboard/.eslintrc.json b/dashboard/.eslintrc.json index 4eb5b9478..f512edd6f 100644 --- a/dashboard/.eslintrc.json +++ b/dashboard/.eslintrc.json @@ -10,6 +10,14 @@ "jest/globals": true }, "plugins": ["jest", "prettier"], + "settings": { + "import/resolver": { + "node": { + "paths": ["src"], + "extensions": [".js", ".jsx", ".ts", ".tsx"] + } + } + }, "rules": { "react-hooks/exhaustive-deps": "off", "prettier/prettier": [ From 22c8331d2708f0e378f2d048aaa537bc652911c9 Mon Sep 17 00:00:00 2001 From: greghub Date: Wed, 4 Oct 2023 01:52:27 +0200 Subject: [PATCH 185/191] feat: add Next button on cloud accounts onboarding page --- dashboard/pages/onboarding/cloud-accounts/index.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dashboard/pages/onboarding/cloud-accounts/index.tsx b/dashboard/pages/onboarding/cloud-accounts/index.tsx index 1bd3dfde2..3fc9c9307 100644 --- a/dashboard/pages/onboarding/cloud-accounts/index.tsx +++ b/dashboard/pages/onboarding/cloud-accounts/index.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +import router from 'next/router'; import Head from 'next/head'; import Link from 'next/link'; import Image from 'next/image'; @@ -14,6 +15,7 @@ import CloudAccountDeleteContents from '@components/cloud-account/components/Clo import Toast from '@components/toast/Toast'; import useToast from '@components/toast/hooks/useToast'; import useCloudAccount from '@components/cloud-account/hooks/useCloudAccounts/useCloudAccount'; +import Button from '@components/button/Button'; export default function CloudAccounts() { const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); @@ -47,7 +49,7 @@ export default function CloudAccounts() { ones, before moving to the next step.
-
+
))}
+
+ +
From b353d439400bef07e1c33c9f596d4fb17fb98a68 Mon Sep 17 00:00:00 2001 From: greghub Date: Wed, 4 Oct 2023 02:02:43 +0200 Subject: [PATCH 186/191] fix: update cloud account lists after deleting --- .../components/CloudAccountDeleteContents.tsx | 3 +++ .../components/CloudAccountsSidePanel.tsx | 7 +++++++ dashboard/pages/cloud-accounts.tsx | 9 +++++++++ .../pages/onboarding/cloud-accounts/index.tsx | 16 ++++++++++++++-- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/dashboard/components/cloud-account/components/CloudAccountDeleteContents.tsx b/dashboard/components/cloud-account/components/CloudAccountDeleteContents.tsx index f0168966a..69398b196 100644 --- a/dashboard/components/cloud-account/components/CloudAccountDeleteContents.tsx +++ b/dashboard/components/cloud-account/components/CloudAccountDeleteContents.tsx @@ -8,12 +8,14 @@ import { ToastProps } from '../../toast/hooks/useToast'; interface CloudAccountDeleteContentsProps { cloudAccount: CloudAccount; onCancel: () => void; + handleAfterDelete: (account: CloudAccount) => void; setToast: (toast: ToastProps) => void; } function CloudAccountDeleteContents({ cloudAccount, onCancel, + handleAfterDelete, setToast }: CloudAccountDeleteContentsProps) { const [loading, setLoading] = useState(false); @@ -38,6 +40,7 @@ function CloudAccountDeleteContents({ title: 'Cloud account deleted', message: `The cloud account was successfully deleted!` }); + handleAfterDelete(cloudAccount); } }); diff --git a/dashboard/components/cloud-account/components/CloudAccountsSidePanel.tsx b/dashboard/components/cloud-account/components/CloudAccountsSidePanel.tsx index 379f2fa44..a9dcb1d6e 100644 --- a/dashboard/components/cloud-account/components/CloudAccountsSidePanel.tsx +++ b/dashboard/components/cloud-account/components/CloudAccountsSidePanel.tsx @@ -33,6 +33,7 @@ interface CloudAccountsSidePanelProps { cloudAccount: CloudAccount; cloudAccounts: CloudAccount[]; setCloudAccounts: (cloudAccounts: CloudAccount[]) => void; + handleAfterDelete: (account: CloudAccount) => void; page: CloudAccountsPage; goTo: (page: CloudAccountsPage) => void; setToast: (toast: ToastProps) => void; @@ -77,6 +78,7 @@ function CloudAccountsSidePanel({ cloudAccount, cloudAccounts, setCloudAccounts, + handleAfterDelete, page, goTo, setToast @@ -175,6 +177,11 @@ function CloudAccountsSidePanel({ setIsDeleteOpen(false)} + handleAfterDelete={(account: CloudAccount) => { + handleAfterDelete(account); + setIsDeleteOpen(false); + closeModal(); + }} setToast={setToast} />
diff --git a/dashboard/pages/cloud-accounts.tsx b/dashboard/pages/cloud-accounts.tsx index 2c19c693c..b87688147 100644 --- a/dashboard/pages/cloud-accounts.tsx +++ b/dashboard/pages/cloud-accounts.tsx @@ -53,6 +53,13 @@ function CloudAccounts() { setIsDeleteModalOpen(false); }; + const handleAfterDelete = (account: any) => { + setCloudAccounts( + cloudAccounts.filter((item: any) => item.id !== account.id) + ); + closeRemoveModal(); + }; + if (!cloudAccounts || isLoading) return null; return ( @@ -87,6 +94,7 @@ function CloudAccounts() { cloudAccount={cloudAccountItem} onCancel={closeRemoveModal} setToast={setToast} + handleAfterDelete={handleAfterDelete} /> )}
@@ -99,6 +107,7 @@ function CloudAccounts() { cloudAccount={cloudAccountItem} cloudAccounts={cloudAccounts} setCloudAccounts={setCloudAccounts} + handleAfterDelete={handleAfterDelete} setToast={setToast} page={page} goTo={goTo} diff --git a/dashboard/pages/onboarding/cloud-accounts/index.tsx b/dashboard/pages/onboarding/cloud-accounts/index.tsx index 3fc9c9307..3959713e2 100644 --- a/dashboard/pages/onboarding/cloud-accounts/index.tsx +++ b/dashboard/pages/onboarding/cloud-accounts/index.tsx @@ -22,8 +22,12 @@ export default function CloudAccounts() { const { toast, setToast, dismissToast } = useToast(); - const { cloudAccounts, cloudAccountItem, setCloudAccountItem } = - useCloudAccount(); + const { + cloudAccounts, + setCloudAccounts, + cloudAccountItem, + setCloudAccountItem + } = useCloudAccount(); const closeRemoveModal = () => { setIsDeleteModalOpen(false); @@ -34,6 +38,13 @@ export default function CloudAccounts() { setIsDeleteModalOpen(true); }; + const handleAfterDelete = (account: any) => { + setCloudAccounts( + cloudAccounts.filter((item: any) => item.id !== account.id) + ); + setIsDeleteModalOpen(false); + }; + return (
@@ -217,6 +228,7 @@ export default function CloudAccounts() { cloudAccount={cloudAccountItem} onCancel={closeRemoveModal} setToast={setToast} + handleAfterDelete={handleAfterDelete} /> )}
From 09fc685ea4945b2eacfdf39d907cb2e190d8bdf7 Mon Sep 17 00:00:00 2001 From: greghub Date: Wed, 4 Oct 2023 02:22:31 +0200 Subject: [PATCH 187/191] fix: prevent access to onboarding pages when after completing it --- dashboard/components/layout/Layout.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dashboard/components/layout/Layout.tsx b/dashboard/components/layout/Layout.tsx index 323f46d78..26c6b424e 100644 --- a/dashboard/components/layout/Layout.tsx +++ b/dashboard/components/layout/Layout.tsx @@ -28,7 +28,9 @@ function Layout({ children }: LayoutProps) { useEffect(() => { settingsService.getOnboardingStatus().then(res => { - if (res.onboarded === false && res.status === 'PENDING_DATABASE') { + if (res.onboarded === true && res.status === 'COMPLETE') { + router.replace('/dashboard/'); + } else if (res.onboarded === false && res.status === 'PENDING_DATABASE') { router.replace('/onboarding/choose-database'); } else if (res.onboarded === false && res.status === 'PENDING_ACCOUNTS') { router.replace('/onboarding/choose-cloud'); From d9f41182b950215cfb9d98c8eefb018bf2b8b9d4 Mon Sep 17 00:00:00 2001 From: greghub Date: Wed, 4 Oct 2023 02:18:39 +0200 Subject: [PATCH 188/191] feat: display an empty state when there are no accounts --- dashboard/pages/cloud-accounts.tsx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/dashboard/pages/cloud-accounts.tsx b/dashboard/pages/cloud-accounts.tsx index b87688147..8e94c263c 100644 --- a/dashboard/pages/cloud-accounts.tsx +++ b/dashboard/pages/cloud-accounts.tsx @@ -12,6 +12,7 @@ import useCloudAccount from '@components/cloud-account/hooks/useCloudAccounts/us import CloudAccountsSidePanel from '@components/cloud-account/components/CloudAccountsSidePanel'; import CloudAccountDeleteContents from '@components/cloud-account/components/CloudAccountDeleteContents'; import useToast from '@components/toast/hooks/useToast'; +import EmptyState from '@components/empty-state/EmptyState'; function CloudAccounts() { const [editCloudAccount, setEditCloudAccount] = useState(false); @@ -84,6 +85,26 @@ function CloudAccounts() { setEditCloudAccount={setEditCloudAccount} /> ))} + + {!cloudAccounts.length && ( +
+ { + router.push('/onboarding/choose-cloud'); + }} + actionLabel="Connect a cloud account" + secondaryAction={() => { + router.push( + 'https://github.com/tailwarden/komiser/issues/new/choose' + ); + }} + secondaryActionLabel="Report an issue" + mascotPose="thinking" + /> +
+ )} {/* Delete Modal */} From 71a99844c629eee97bb9d83a7710b4af4b5770b9 Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Wed, 4 Oct 2023 10:41:42 +0200 Subject: [PATCH 189/191] feat: configure schemas on db setup --- handlers/accounts_handler.go | 8 + handlers/dashboard_handler.go | 24 ++- internal/config/load.go | 4 +- internal/internal.go | 165 +++++------------- .../20230619100000_add_new_relation_field.go | 7 +- .../20231014100000_add_new_status_field.go | 4 +- utils/database.go | 104 +++++++++++ 7 files changed, 185 insertions(+), 131 deletions(-) create mode 100644 utils/database.go diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index 048e9e5ad..4e8f33981 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -11,6 +11,7 @@ import ( "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/utils" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect/pgdialect" "github.com/uptrace/bun/dialect/sqlitedialect" @@ -165,5 +166,12 @@ func (handler *ApiHandler) ConfigureDatabaseHandler(c *gin.Context) { log.Println("Data will be stored in PostgreSQL") } + err = utils.SetupSchema(handler.db, &handler.cfg, []models.Account{}) + fmt.Println(err) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, map[string]string{"message": "database has been configured"}) } diff --git a/handlers/dashboard_handler.go b/handlers/dashboard_handler.go index aa8dc861d..15a4f49c7 100644 --- a/handlers/dashboard_handler.go +++ b/handlers/dashboard_handler.go @@ -15,6 +15,18 @@ import ( ) func (handler *ApiHandler) DashboardStatsHandler(c *gin.Context) { + output := struct { + Resources int `json:"resources"` + Regions int `json:"regions"` + Costs float64 `json:"costs"` + Accounts int `json:"accounts"` + }{} + + if handler.db == nil { + c.JSON(http.StatusInternalServerError, map[string]string{"message": "database isn't configured yet"}) + return + } + regions := struct { Count int `bun:"count" json:"total"` }{} @@ -51,7 +63,7 @@ func (handler *ApiHandler) DashboardStatsHandler(c *gin.Context) { logrus.WithError(err).Error("scan failed") } - output := struct { + output = struct { Resources int `json:"resources"` Regions int `json:"regions"` Costs float64 `json:"costs"` @@ -121,6 +133,11 @@ func (handler *ApiHandler) ResourcesBreakdownStatsHandler(c *gin.Context) { func (handler *ApiHandler) LocationBreakdownStatsHandler(c *gin.Context) { groups := make([]models.OutputResources, 0) + if handler.db == nil { + c.JSON(http.StatusInternalServerError, []models.OutputLocations{}) + return + } + err := handler.db.NewRaw("SELECT region as label, COUNT(*) as total FROM resources GROUP BY region ORDER by total desc;").Scan(handler.ctx, &groups) if err != nil { logrus.WithError(err).Error("scan failed") @@ -149,6 +166,11 @@ func (handler *ApiHandler) LocationBreakdownStatsHandler(c *gin.Context) { func (handler *ApiHandler) CostBreakdownHandler(c *gin.Context) { input := models.InputCostBreakdown{} + if handler.db == nil { + c.JSON(http.StatusInternalServerError, []models.OutputCostBreakdown{}) + return + } + err := json.NewDecoder(c.Request.Body).Decode(&input) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) diff --git a/internal/config/load.go b/internal/config/load.go index 9d3d25fcb..e9e22f39c 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -71,9 +71,9 @@ func Load(configPath string, telemetry bool, analytics utils.Analytics, db *bun. return nil, nil, nil, err } - if len(config.SQLite.File) == 0 && config.Postgres.URI == "" { + /*if len(config.SQLite.File) == 0 && config.Postgres.URI == "" { return nil, nil, nil, errors.New("postgres URI or sqlite file is missing") - } + }*/ clients := make([]providers.ProviderClient, 0) accounts := make([]models.Account, 0) diff --git a/internal/internal.go b/internal/internal.go index bec52f642..83b5ce6b9 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -24,12 +24,10 @@ import ( "github.com/uptrace/bun/dialect/sqlitedialect" "github.com/uptrace/bun/driver/pgdriver" "github.com/uptrace/bun/driver/sqliteshim" - "github.com/uptrace/bun/migrate" "github.com/spf13/cobra" v1 "github.com/tailwarden/komiser/internal/api/v1" "github.com/tailwarden/komiser/internal/config" - "github.com/tailwarden/komiser/migrations" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" "github.com/tailwarden/komiser/providers/aws" @@ -66,57 +64,59 @@ func Exec(address string, port int, configPath string, telemetry bool, a utils.A return err } - err = setupSchema(cfg, accounts) + err = setupDBConnection(cfg) if err != nil { return err } - err = doMigrations(ctx) - if err != nil { - return err - } + if db != nil { + err = utils.SetupSchema(db, cfg, accounts) + if err != nil { + return err + } - cron := gocron.NewScheduler(time.UTC) + cron := gocron.NewScheduler(time.UTC) + + _, err = cron.Every(1).Hours().Do(func() { + log.Info("Fetching resources workflow has started") + err = fetchResources(ctx, clients, regions, telemetry) + if err != nil { + log.Fatal(err) + } + }) - _, err = cron.Every(1).Hours().Do(func() { - log.Info("Fetching resources workflow has started") - err = fetchResources(ctx, clients, regions, telemetry) if err != nil { - log.Fatal(err) + log.WithError(err).Error("setting up cron job failed") } - }) - if err != nil { - log.WithError(err).Error("setting up cron job failed") - } + _, err = cron.Every(1).Hours().Do(func() { + alertsExist, alerts := checkIfAlertsExist(ctx) - _, err = cron.Every(1).Hours().Do(func() { - alertsExist, alerts := checkIfAlertsExist(ctx) + if alertsExist { + log.Info("Checking Alerts") + checkingAlerts(ctx, *cfg, telemetry, port, alerts) + } + }) - if alertsExist { - log.Info("Checking Alerts") - checkingAlerts(ctx, *cfg, telemetry, port, alerts) + if err != nil { + log.WithError(err).Error("setting up cron job failed") } - }) - if err != nil { - log.WithError(err).Error("setting up cron job failed") - } + _, err = cron.Every(1).Friday().At("09:00").Do(func() { + if len(cfg.Slack.Webhook) > 0 && cfg.Slack.Reporting { + log.Info("Sending weekly reporting") + sendTagsCoverageReport(ctx, *cfg) + sendCostBreakdownReport(ctx, *cfg) + } + }) - _, err = cron.Every(1).Friday().At("09:00").Do(func() { - if len(cfg.Slack.Webhook) > 0 && cfg.Slack.Reporting { - log.Info("Sending weekly reporting") - sendTagsCoverageReport(ctx, *cfg) - sendCostBreakdownReport(ctx, *cfg) + if err != nil { + log.WithError(err).Error("setting up cron job failed") } - }) - if err != nil { - log.WithError(err).Error("setting up cron job failed") + cron.StartAsync() } - cron.StartAsync() - go checkUpgrade() err = runServer(address, port, telemetry, *cfg) @@ -137,6 +137,7 @@ func checkIfAlertsExist(ctx context.Context) (bool, []models.Alert) { if len(alerts) > 0 { return true, alerts } + return false, alerts } @@ -179,10 +180,15 @@ func runServer(address string, port int, telemetry bool, cfg models.Config) erro return nil } -func setupSchema(c *models.Config, accounts []models.Account) error { +func setupDBConnection(c *models.Config) error { var sqldb *sql.DB var err error + if len(c.SQLite.File) == 0 && len(c.Postgres.URI) == 0 { + log.Println("Database wasn't configured yet") + return nil + } + if len(c.SQLite.File) > 0 { sqldb, err = sql.Open(sqliteshim.ShimName, fmt.Sprintf("file:%s?cache=shared", c.SQLite.File)) if err != nil { @@ -197,94 +203,9 @@ func setupSchema(c *models.Config, accounts []models.Account) error { } else { sqldb = sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(c.Postgres.URI))) db = bun.NewDB(sqldb, pgdialect.New()) - log.Println("Data will be stored in PostgreSQL") } - _, err = db.NewCreateTable().Model((*models.Resource)(nil)).IfNotExists().Exec(context.Background()) - if err != nil { - return err - } - - _, err = db.NewCreateTable().Model((*models.View)(nil)).IfNotExists().Exec(context.Background()) - if err != nil { - return err - } - - _, err = db.NewCreateTable().Model((*models.Alert)(nil)).IfNotExists().Exec(context.Background()) - if err != nil { - return err - } - - _, err = db.NewCreateTable().Model((*models.Account)(nil)).IfNotExists().Exec(context.Background()) - if err != nil { - return err - } - - for _, account := range accounts { - account.Status = "CONNECTED" - _, err = db.NewInsert().Model(&account).Exec(context.Background()) - if err != nil { - log.Warnf("%s account cannot be inserted to database", account.Provider) - } - } - - // Created pre-defined views - untaggedResourcesView := models.View{ - Name: "Untagged resources", - Filters: []models.Filter{ - { - Field: "tags", - Operator: "IS_EMPTY", - Values: []string{}, - }, - }, - } - - count, _ := db.NewSelect().Model(&untaggedResourcesView).Where("name = ?", untaggedResourcesView.Name).ScanAndCount(context.Background()) - if count == 0 { - _, err = db.NewInsert().Model(&untaggedResourcesView).Exec(context.Background()) - if err != nil { - return err - } - } - - expensiveResourcesView := models.View{ - Name: "Expensive resources", - Filters: []models.Filter{ - { - Field: "cost", - Operator: "GREATER_THAN", - Values: []string{"0"}, - }, - }, - } - - count, _ = db.NewSelect().Model(&expensiveResourcesView).Where("name = ?", expensiveResourcesView.Name).ScanAndCount(context.Background()) - if count == 0 { - _, err = db.NewInsert().Model(&expensiveResourcesView).Exec(context.Background()) - if err != nil { - return err - } - } - - return nil -} - -func doMigrations(ctx context.Context) error { - migrator := migrate.NewMigrator(db, migrations.Migrations) - - migrator.Init(ctx) - - group, err := migrator.Migrate(ctx) - if err != nil { - return err - } - if group.IsZero() { - log.Infof("there are no new migrations to run (database is up to date)\n") - return nil - } - log.Infof("migrated to %s\n", group) return nil } @@ -855,4 +776,4 @@ func sendCostBreakdownReport(ctx context.Context, cfg models.Config) { log.Warn(err) } } -} \ No newline at end of file +} diff --git a/migrations/20230619100000_add_new_relation_field.go b/migrations/20230619100000_add_new_relation_field.go index 7d227d73c..4b1e60688 100644 --- a/migrations/20230619100000_add_new_relation_field.go +++ b/migrations/20230619100000_add_new_relation_field.go @@ -11,12 +11,11 @@ func init() { Migrations.MustRegister(func(ctx context.Context, db *bun.DB) error { // adding new column relation for migration if db.Dialect().Name() == dialect.SQLite { - _, err := db.ExecContext(ctx, "ALTER TABLE resources ADD COLUMN relations TEXT DEFAULT '[]';") - return err + db.ExecContext(ctx, "ALTER TABLE resources ADD COLUMN relations TEXT DEFAULT '[]';") } else { - _, err := db.ExecContext(ctx, "ALTER TABLE resources ADD COLUMN relations JSONB DEFAULT '[]'::jsonb;") - return err + db.ExecContext(ctx, "ALTER TABLE resources ADD COLUMN relations JSONB DEFAULT '[]'::jsonb;") } + return nil }, func(ctx context.Context, db *bun.DB) error { // No rollback needed return nil diff --git a/migrations/20231014100000_add_new_status_field.go b/migrations/20231014100000_add_new_status_field.go index 4818d261c..087b4c638 100644 --- a/migrations/20231014100000_add_new_status_field.go +++ b/migrations/20231014100000_add_new_status_field.go @@ -9,8 +9,8 @@ import ( func init() { Migrations.MustRegister(func(ctx context.Context, db *bun.DB) error { // adding new column relation for migration - _, err := db.ExecContext(ctx, "ALTER TABLE accounts ADD COLUMN status TEXT;") - return err + db.ExecContext(ctx, "ALTER TABLE accounts ADD COLUMN status TEXT;") + return nil }, func(ctx context.Context, db *bun.DB) error { // No rollback needed return nil diff --git a/utils/database.go b/utils/database.go new file mode 100644 index 000000000..e5324e8c8 --- /dev/null +++ b/utils/database.go @@ -0,0 +1,104 @@ +package utils + +import ( + "context" + + log "github.com/sirupsen/logrus" + "github.com/tailwarden/komiser/migrations" + "github.com/tailwarden/komiser/models" + "github.com/uptrace/bun" + "github.com/uptrace/bun/migrate" +) + +func SetupSchema(db *bun.DB, c *models.Config, accounts []models.Account) error { + _, err := db.NewCreateTable().Model((*models.Resource)(nil)).IfNotExists().Exec(context.Background()) + if err != nil { + return err + } + + _, err = db.NewCreateTable().Model((*models.View)(nil)).IfNotExists().Exec(context.Background()) + if err != nil { + return err + } + + _, err = db.NewCreateTable().Model((*models.Alert)(nil)).IfNotExists().Exec(context.Background()) + if err != nil { + return err + } + + _, err = db.NewCreateTable().Model((*models.Account)(nil)).IfNotExists().Exec(context.Background()) + if err != nil { + return err + } + + for _, account := range accounts { + account.Status = "CONNECTED" + _, err = db.NewInsert().Model(&account).Exec(context.Background()) + if err != nil { + log.Warnf("%s account cannot be inserted to database", account.Provider) + } + } + + // Created pre-defined views + untaggedResourcesView := models.View{ + Name: "Untagged resources", + Filters: []models.Filter{ + { + Field: "tags", + Operator: "IS_EMPTY", + Values: []string{}, + }, + }, + } + + count, _ := db.NewSelect().Model(&untaggedResourcesView).Where("name = ?", untaggedResourcesView.Name).ScanAndCount(context.Background()) + if count == 0 { + _, err = db.NewInsert().Model(&untaggedResourcesView).Exec(context.Background()) + if err != nil { + return err + } + } + + expensiveResourcesView := models.View{ + Name: "Expensive resources", + Filters: []models.Filter{ + { + Field: "cost", + Operator: "GREATER_THAN", + Values: []string{"0"}, + }, + }, + } + + count, _ = db.NewSelect().Model(&expensiveResourcesView).Where("name = ?", expensiveResourcesView.Name).ScanAndCount(context.Background()) + if count == 0 { + _, err = db.NewInsert().Model(&expensiveResourcesView).Exec(context.Background()) + if err != nil { + return err + } + } + + err = doMigrations(db, context.Background()) + if err != nil { + return err + } + + return nil +} + +func doMigrations(db *bun.DB, ctx context.Context) error { + migrator := migrate.NewMigrator(db, migrations.Migrations) + + migrator.Init(ctx) + + group, err := migrator.Migrate(ctx) + if err != nil { + return err + } + if group.IsZero() { + log.Infof("there are no new migrations to run (database is up to date)\n") + return nil + } + log.Infof("migrated to %s\n", group) + return nil +} From 92842f23bd3c50e03dfc2b0e93e40178e91fcf8d Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Wed, 4 Oct 2023 11:01:10 +0200 Subject: [PATCH 190/191] fix: check if db has been configured --- handlers/accounts_handler.go | 3 +-- handlers/dashboard_handler.go | 7 ++++++- handlers/stats_handler.go | 10 ++++++++++ models/database.go | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index 4e8f33981..734eaaf7f 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -148,7 +148,7 @@ func (handler *ApiHandler) ConfigureDatabaseHandler(c *gin.Context) { } if db.Type == "SQLITE" { - sqldb, err := sql.Open(sqliteshim.ShimName, fmt.Sprintf("file:%s?cache=shared", db.File)) + sqldb, err := sql.Open(sqliteshim.ShimName, fmt.Sprintf("file:%s?cache=shared", db.FilePath)) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return @@ -167,7 +167,6 @@ func (handler *ApiHandler) ConfigureDatabaseHandler(c *gin.Context) { } err = utils.SetupSchema(handler.db, &handler.cfg, []models.Account{}) - fmt.Println(err) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return diff --git a/handlers/dashboard_handler.go b/handlers/dashboard_handler.go index 15a4f49c7..41c1c0acf 100644 --- a/handlers/dashboard_handler.go +++ b/handlers/dashboard_handler.go @@ -23,7 +23,7 @@ func (handler *ApiHandler) DashboardStatsHandler(c *gin.Context) { }{} if handler.db == nil { - c.JSON(http.StatusInternalServerError, map[string]string{"message": "database isn't configured yet"}) + c.JSON(http.StatusInternalServerError, output) return } @@ -90,6 +90,11 @@ func (handler *ApiHandler) DashboardStatsHandler(c *gin.Context) { func (handler *ApiHandler) ResourcesBreakdownStatsHandler(c *gin.Context) { input := models.InputResources{} + if handler.db == nil { + c.JSON(http.StatusInternalServerError, []models.OutputResources{}) + return + } + err := json.NewDecoder(c.Request.Body).Decode(&input) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) diff --git a/handlers/stats_handler.go b/handlers/stats_handler.go index 42f172c1c..6f4da6853 100644 --- a/handlers/stats_handler.go +++ b/handlers/stats_handler.go @@ -341,6 +341,11 @@ func (handler *ApiHandler) ListProvidersHandler(c *gin.Context) { Provider string `bun:"provider" json:"provider"` } + if handler.db == nil { + c.JSON(http.StatusInternalServerError, []string{}) + return + } + outputs := make([]Output, 0) err := handler.db.NewRaw("SELECT DISTINCT(provider) FROM resources").Scan(handler.ctx, &outputs) @@ -383,6 +388,11 @@ func (handler *ApiHandler) ListAccountsHandler(c *gin.Context) { Account string `bun:"account" json:"account"` } + if handler.db == nil { + c.JSON(http.StatusInternalServerError, []string{}) + return + } + outputs := make([]Output, 0) err := handler.db.NewRaw("SELECT DISTINCT(account) FROM resources").Scan(handler.ctx, &outputs) diff --git a/models/database.go b/models/database.go index 528b9c98c..58f540afa 100644 --- a/models/database.go +++ b/models/database.go @@ -6,5 +6,5 @@ type DatabaseConfig struct { Database string `json:"database"` Username string `json:"username"` Password string `json:"password"` - File string `json:"file"` + FilePath string `json:"filePath"` } From d341eec1eeef22aa1ef8786054e003c5aad0327f Mon Sep 17 00:00:00 2001 From: Mohamed Labouardy Date: Wed, 4 Oct 2023 11:11:10 +0200 Subject: [PATCH 191/191] fix: sqlite filepath --- handlers/accounts_handler.go | 4 ++-- handlers/resources_handler.go | 4 +++- internal/api/v1/endpoints.go | 4 ++-- internal/internal.go | 6 +++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index 734eaaf7f..d7ebe5dad 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -5,11 +5,11 @@ import ( "database/sql" "encoding/json" "fmt" - "log" "net/http" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/utils" "github.com/uptrace/bun" @@ -166,7 +166,7 @@ func (handler *ApiHandler) ConfigureDatabaseHandler(c *gin.Context) { log.Println("Data will be stored in PostgreSQL") } - err = utils.SetupSchema(handler.db, &handler.cfg, []models.Account{}) + err = utils.SetupSchema(handler.db, &handler.cfg, handler.accounts) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return diff --git a/handlers/resources_handler.go b/handlers/resources_handler.go index 4a970224a..501e47c3e 100644 --- a/handlers/resources_handler.go +++ b/handlers/resources_handler.go @@ -23,15 +23,17 @@ type ApiHandler struct { telemetry bool cfg models.Config analytics utils.Analytics + accounts []models.Account } -func NewApiHandler(ctx context.Context, telemetry bool, analytics utils.Analytics, db *bun.DB, cfg models.Config) *ApiHandler { +func NewApiHandler(ctx context.Context, telemetry bool, analytics utils.Analytics, db *bun.DB, cfg models.Config, accounts []models.Account) *ApiHandler { handler := ApiHandler{ db: db, ctx: ctx, telemetry: telemetry, cfg: cfg, analytics: analytics, + accounts: accounts, } return &handler } diff --git a/internal/api/v1/endpoints.go b/internal/api/v1/endpoints.go index cffb9cbec..179350292 100644 --- a/internal/api/v1/endpoints.go +++ b/internal/api/v1/endpoints.go @@ -12,7 +12,7 @@ import ( "github.com/uptrace/bun" ) -func Endpoints(ctx context.Context, telemetry bool, analytics utils.Analytics, db *bun.DB, cfg models.Config) *gin.Engine { +func Endpoints(ctx context.Context, telemetry bool, analytics utils.Analytics, db *bun.DB, cfg models.Config, accounts []models.Account) *gin.Engine { gin.SetMode(gin.ReleaseMode) router := gin.New() @@ -20,7 +20,7 @@ func Endpoints(ctx context.Context, telemetry bool, analytics utils.Analytics, d router.Use(cors.Default()) - api := handlers.NewApiHandler(ctx, telemetry, analytics, db, cfg) + api := handlers.NewApiHandler(ctx, telemetry, analytics, db, cfg, accounts) router.POST("/resources/search", api.FilterResourcesHandler) router.POST("/resources/tags", api.BulkUpdateTagsHandler) diff --git a/internal/internal.go b/internal/internal.go index 83b5ce6b9..1765a1171 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -119,7 +119,7 @@ func Exec(address string, port int, configPath string, telemetry bool, a utils.A go checkUpgrade() - err = runServer(address, port, telemetry, *cfg) + err = runServer(address, port, telemetry, *cfg, accounts) if err != nil { return err } @@ -164,10 +164,10 @@ func loggingMiddleware() gin.HandlerFunc { } } -func runServer(address string, port int, telemetry bool, cfg models.Config) error { +func runServer(address string, port int, telemetry bool, cfg models.Config, accounts []models.Account) error { log.Infof("Komiser version: %s, commit: %s, buildt: %s", Version, Commit, Buildtime) - r := v1.Endpoints(context.Background(), telemetry, analytics, db, cfg) + r := v1.Endpoints(context.Background(), telemetry, analytics, db, cfg, accounts) r.Use(loggingMiddleware())