From 59c10cc034014d8c6dd7e90b41848e18f5b8163b Mon Sep 17 00:00:00 2001 From: Davydov Artyom Date: Thu, 20 Jul 2023 03:58:28 +0300 Subject: [PATCH] v0.0.9 - A lot of fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ Allow exporting local SSH and GPG 🏗️ Separate the profile update functionality from the visual notifications. 🗃️ Fix SSH pair storage 📈 Analytics 🩹 Fixed name and email input width issue --- package.json | 4 +- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 3 +- src-tauri/tauri.conf.json | 6 +- src/api/git.ts | 10 +- src/api/github.ts | 16 +- src/app.tsx | 2 + src/components/buttons/default/index.tsx | 8 +- src/components/typography/styles.module.scss | 4 +- src/firebase.json | 9 + src/fonts/roboto/LICENSE.txt | 202 +++++ src/fonts/roboto/font.scss | 13 + src/i18n/en.ts | 31 + src/i18n/ru.ts | 30 + src/main.tsx | 16 +- src/managers/deeplinks.tsx | 1 - src/managers/notifications.tsx | 3 +- src/managers/resizer.tsx | 6 +- src/managers/syncronizer.tsx | 31 + src/notifications/action/index.tsx | 17 +- src/notifications/autoclosable/index.tsx | 14 +- src/notifications/close/index.tsx | 4 +- src/notifications/error/index.tsx | 74 +- src/notifications/error/styles.module.scss | 10 - src/notifications/gpg/add.tsx | 54 +- src/notifications/gpg/copied.tsx | 17 + src/notifications/gpg/manage.tsx | 57 ++ src/notifications/gpg/remove.tsx | 52 +- src/notifications/import/index.tsx | 13 +- src/notifications/info/index.tsx | 69 ++ src/notifications/intro/index.tsx | 22 +- src/notifications/list/index.tsx | 29 + .../manage => list}/styles.module.scss | 0 src/notifications/manager/index.tsx | 12 +- src/notifications/manager/manage/index.tsx | 94 +-- src/notifications/manager/profile/base.tsx | 101 ++- .../manager/profile/styles.module.scss | 16 +- src/notifications/ssh/add.tsx | 32 +- src/notifications/ssh/copied.tsx | 17 + src/notifications/ssh/manage.tsx | 54 ++ src/notifications/ssh/remove.tsx | 54 +- src/notifications/update/index.tsx | 52 +- src/notifications/update/styles.module.scss | 10 - src/notifications/updater/index.tsx | 19 +- src/store/persist.ts | 28 +- yarn.lock | 741 +++++++++++++++++- 46 files changed, 1721 insertions(+), 338 deletions(-) create mode 100644 src/firebase.json create mode 100644 src/fonts/roboto/LICENSE.txt create mode 100644 src/fonts/roboto/font.scss create mode 100644 src/managers/syncronizer.tsx delete mode 100644 src/notifications/error/styles.module.scss create mode 100644 src/notifications/gpg/copied.tsx create mode 100644 src/notifications/gpg/manage.tsx create mode 100644 src/notifications/info/index.tsx create mode 100644 src/notifications/list/index.tsx rename src/notifications/{manager/manage => list}/styles.module.scss (100%) create mode 100644 src/notifications/ssh/copied.tsx create mode 100644 src/notifications/ssh/manage.tsx delete mode 100644 src/notifications/update/styles.module.scss diff --git a/package.json b/package.json index 9c37f7f..74b4432 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dogit", "private": true, - "version": "0.0.8", + "version": "0.0.9", "type": "module", "scripts": { "dev": "vite", @@ -12,11 +12,11 @@ }, "dependencies": { "@floating-ui/react": "^0.24.3", - "@fontsource/roboto": "^5.0.5", "@phosphor-icons/react": "^2.0.10", "@tauri-apps/api": "^1.4.0", "axios": "^1.4.0", "clsx": "^1.2.1", + "firebase": "^10.0.0", "just-throttle": "^4.2.0", "keen-slider": "^6.8.5", "react": "^18.2.0", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 1a20daf..6c2f134 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -773,7 +773,7 @@ checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] name = "dogit" -version = "0.0.8" +version = "0.0.9" dependencies = [ "directories", "serde", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index d218a29..00ecdd2 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dogit" -version = "0.0.8" +version = "0.0.9" description = "Dogit" authors = ["Artemiy Davydov"] license = "MIT" @@ -14,6 +14,7 @@ tauri-build = { version = "1.4", features = [] } [dependencies] tauri = { version = "1.4", features = [ + "clipboard-write-text", "updater", "process-relaunch", "window-set-focus", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index b240e41..38bdd38 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -9,7 +9,7 @@ }, "package": { "productName": "dogit", - "version": "0.0.8" + "version": "0.0.9" }, "tauri": { "allowlist": { @@ -56,6 +56,10 @@ "process": { "all": false, "relaunch": true + }, + "clipboard": { + "all": false, + "writeText": true } }, "bundle": { diff --git a/src/api/git.ts b/src/api/git.ts index 8cd1d0e..568333d 100644 --- a/src/api/git.ts +++ b/src/api/git.ts @@ -3,6 +3,7 @@ import useSWR from "swr"; import { LocalProfile, usePersistStore } from "../store/persist"; import { executeBase } from "./execute"; +import { addSSHKeyPair, startSSHAgent } from "./ssh"; const execute = (args?: string | string[]) => executeBase("git", args); @@ -67,14 +68,17 @@ export const useLocalProfile = () => { await setSigningKey(profile.gpg); await setAutosign(true); } else { - //! code 5 - // await removeSigningKey(); await setAutosign(false); } + if (profile.ssh) { + await addSSHKeyPair(profile.ssh.private); + await startSSHAgent(); + } + finishSync("local"); return profile; }, - { refreshWhenHidden: true, refreshInterval: 5 * 60 * 1000 } + { revalidateOnFocus: false, revalidateOnMount: false } ); }; diff --git a/src/api/github.ts b/src/api/github.ts index 3bfa459..96ca43e 100644 --- a/src/api/github.ts +++ b/src/api/github.ts @@ -4,6 +4,7 @@ import useSWR from "swr"; import { GithubProfile, GithubUser, usePersistStore } from "../store/persist"; import { setAutosign, setEmail, setName, setSigningKey } from "./git"; +import { addSSHKeyPair, startSSHAgent } from "./ssh"; const fetcher = axios.create({ baseURL: "https://api.github.com", @@ -61,15 +62,18 @@ export const useGithubProfile = ( await setSigningKey(profile.gpg); await setAutosign(true); } else { - //! code 5 - // await removeSigningKey(); await setAutosign(false); } + if (profile.ssh) { + await addSSHKeyPair(profile.ssh.private); + await startSSHAgent(); + } + finishSync(id); return data; }, - { refreshWhenHidden: true, refreshInterval: 5 * 60 * 1000 } + { revalidateOnFocus: false, revalidateOnMount: false } ); }; @@ -136,7 +140,7 @@ export const removeGPGKey = ( accessToken: GithubProfile["user"]["accessToken"], id: GithubGPGKeyResponse["id"] ) => - axios.delete(`/user/gpg_keys/${id}`, { + fetcher.delete(`/user/gpg_keys/${id}`, { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -179,9 +183,9 @@ export const listSSHKeys = async ( export const removeSSHKey = async ( accessToken: GithubProfile["user"]["accessToken"], - idx: GitHubSSHKeyResponse["id"] + id: GitHubSSHKeyResponse["id"] ) => - fetcher.delete(`/user/keys/${idx}`, { + fetcher.delete(`/user/keys/${id}`, { headers: { Authorization: `Bearer ${accessToken}`, }, diff --git a/src/app.tsx b/src/app.tsx index f7fa782..cdc4a2e 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -9,10 +9,12 @@ import { Focuser } from "./managers/focuser"; import { NoContext } from "./managers/no-context"; import { Notifications } from "./managers/notifications"; import { Resizer } from "./managers/resizer"; +import { Syncronizer } from "./managers/syncronizer"; export const App = () => { return ( + diff --git a/src/components/buttons/default/index.tsx b/src/components/buttons/default/index.tsx index f6cb85a..f66b372 100644 --- a/src/components/buttons/default/index.tsx +++ b/src/components/buttons/default/index.tsx @@ -4,11 +4,15 @@ import { SpinnerCircular } from "spinners-react"; import classes from "./styles.module.scss"; -type Props = { +export type ButtonProps = { loading?: boolean; } & ButtonHTMLAttributes; -export const Button = ({ loading = false, children, ...props }: Props) => { +export const Button = ({ + loading = false, + children, + ...props +}: ButtonProps) => { return ( + + + ); +}; diff --git a/src/notifications/gpg/remove.tsx b/src/notifications/gpg/remove.tsx index f0411b6..e56aeae 100644 --- a/src/notifications/gpg/remove.tsx +++ b/src/notifications/gpg/remove.tsx @@ -3,15 +3,17 @@ import toast from "react-hot-toast"; import { useT } from "talkr"; import { removeSigningKey, setAutosign } from "../../api/git"; +import { listGPGKeys, removeGPGKey } from "../../api/github"; import { deleteGPGKey } from "../../api/gpg"; import { ActionButton } from "../../components/buttons/action"; -import { Profile, usePersistStore } from "../../store/persist"; -import { GenericActionNotificationBody } from "../action"; +import { getProfileById, Profile, usePersistStore } from "../../store/persist"; +import { GenericActionNotificationContent } from "../action"; +import { BaseNotificationBody } from "../base"; interface Props { - id: Profile["user"]["id"]; + userId: Profile["user"]["id"]; toastId: string; - onClose: () => void; + onClose?: () => void; } const GPGActionButton = ({ @@ -26,13 +28,13 @@ const GPGActionButton = ({ return ( {inProgress - ? T("notifications.gpg.add.button.in_progress") - : T("notifications.gpg.add.button.default")} + ? T("notifications.gpg.remove.button.in_progress") + : T("notifications.gpg.remove.button.default")} ); }; -export const RemoveGPGNotification = ({ toastId, id, onClose }: Props) => { +export const RemoveGPGNotification = ({ toastId, userId, onClose }: Props) => { const [inProgress, setInProgress] = useState(false); const setGPGKey = usePersistStore((state) => state.setGPGKey); @@ -40,25 +42,25 @@ export const RemoveGPGNotification = ({ toastId, id, onClose }: Props) => { const onClick = async () => { setInProgress(true); - const profiles = usePersistStore.getState().profiles; - const profile = profiles.find(({ user }) => id === user.id); + const profile = getProfileById(userId); - if (!profile || !profile.gpg) { - return setInProgress(false); - } + if (!profile) return setInProgress(false); try { await removeSigningKey(); await setAutosign(false); - //! 404 - // const keys = await listGPGKeys(profile.user.accessToken); - // const gpg = keys.find(({ key_id }) => key_id === profile.gpg); - // if (!gpg) throw new Error("No such GPG key"); - // await removeGPGKey(profile.user.accessToken, gpg.id); + + if (profile.type === "github") { + const keys = await listGPGKeys(profile.user.accessToken); + const gpg = keys.find(({ key_id }) => key_id === profile.gpg); + if (!gpg) throw new Error("No such GPG key"); + await removeGPGKey(profile.user.accessToken, gpg.id); + } + await deleteGPGKey(profile.user.email); setGPGKey(profile.user.id, false); - onClose(); + if (onClose) onClose(); toast.dismiss(toastId); } catch (error) { console.error(error); @@ -70,11 +72,13 @@ export const RemoveGPGNotification = ({ toastId, id, onClose }: Props) => { const { T } = useT(); return ( - - - + + + + + ); }; diff --git a/src/notifications/import/index.tsx b/src/notifications/import/index.tsx index d9f791a..37097ae 100644 --- a/src/notifications/import/index.tsx +++ b/src/notifications/import/index.tsx @@ -4,6 +4,7 @@ import { // GitlabLogoSimple, } from "@phosphor-icons/react"; import { open } from "@tauri-apps/api/shell"; +import { logEvent } from "firebase/analytics"; import { createElement, useMemo } from "react"; import { useT } from "talkr"; @@ -11,6 +12,7 @@ import { getGitEmail, getGitName } from "../../api/git"; import { Button } from "../../components/buttons/default"; import { Typography } from "../../components/typography"; import { useVirtualScroll } from "../../hooks/scrollbar"; +import { analytics } from "../../main"; import { useAppStore } from "../../store/app"; import { usePersistStore } from "../../store/persist"; import { BaseNotificationBody } from "../base"; @@ -20,7 +22,7 @@ interface Props { onClose?: () => void; } -const ImportNotificationBody = ({ onClose }: Props) => { +const ImportNotificationContent = ({ onClose }: Props) => { const { T } = useT(); // const isGitlabImportInProgress = useAppStore( @@ -85,9 +87,11 @@ const ImportNotificationBody = ({ onClose }: Props) => { return buttons; }, [ - profiles, + T, isGithubImportInProgress, - // isGitlabImportInProgress + profiles, + setGithubImportInProgress, + addProfile, ]); const [scrollable, handle, bar] = useVirtualScroll(); @@ -105,6 +109,7 @@ const ImportNotificationBody = ({ onClose }: Props) => { key={i} onClick={() => { onClick(); + logEvent(analytics, "profile_imported"); if (onClose) onClose(); }} loading={loading} @@ -126,7 +131,7 @@ const ImportNotificationBody = ({ onClose }: Props) => { export const ImportNotification = (props: Props) => { return ( - + ); }; diff --git a/src/notifications/info/index.tsx b/src/notifications/info/index.tsx new file mode 100644 index 0000000..e5e6604 --- /dev/null +++ b/src/notifications/info/index.tsx @@ -0,0 +1,69 @@ +import { toast } from "react-hot-toast"; +import { useT } from "talkr"; + +import { ActionButton } from "../../components/buttons/action"; +import { GenericActionNotificationContent } from "../action"; +import { + AutoClosableNotificationBody, + AutoClosableNotificationProps, +} from "../autoclosable"; + +interface GenericInfoNotificationContentProps { + title?: string; + description: string; + action?: () => void; + actionText?: string; +} + +const GenericInfoNotificationContent = ({ + toastId, + title, + description, + action, + actionText, +}: GenericInfoNotificationContentProps & + Pick) => { + const { T } = useT(); + + return ( + + { + if (action) action(); + toast.dismiss(toastId); + }} + > + {actionText || T("info.generic.action_text")} + + + ); +}; + +type Props = AutoClosableNotificationProps & + GenericInfoNotificationContentProps; + +export const GenericInfoNotification = ({ + title, + description, + action, + actionText, + ...props +}: Props) => { + return ( + + + + ); +}; diff --git a/src/notifications/intro/index.tsx b/src/notifications/intro/index.tsx index d13471e..ae26269 100644 --- a/src/notifications/intro/index.tsx +++ b/src/notifications/intro/index.tsx @@ -1,11 +1,14 @@ import { open } from "@tauri-apps/api/shell"; +import { logEvent } from "firebase/analytics"; import { useState } from "react"; import toast from "react-hot-toast"; import { useT } from "talkr"; import { isGitAvailable } from "../../api/git"; import { ActionButton } from "../../components/buttons/action"; -import { GenericActionNotificationBody } from "../action"; +import { analytics } from "../../main"; +import { GenericActionNotificationContent } from "../action"; +import { BaseNotificationBody } from "../base"; import { GenericErrorNotification } from "../error"; import { ImportNotification } from "../import"; @@ -26,7 +29,7 @@ const IntroActionButton = () => { if (!canDoGit) toast((t) => ( { else { toast(, { id: "import" }); setImportOpen(true); + logEvent(analytics, "intro_passed"); } } }} @@ -51,11 +55,13 @@ export const IntroNotification = () => { const { T } = useT(); return ( - - - + + + + + ); }; diff --git a/src/notifications/list/index.tsx b/src/notifications/list/index.tsx new file mode 100644 index 0000000..f2dd2a3 --- /dev/null +++ b/src/notifications/list/index.tsx @@ -0,0 +1,29 @@ +import { ReactElement } from "react"; + +import { ButtonProps } from "../../components/buttons/default"; +// import { useVirtualScroll } from "../../hooks/scrollbar"; +import { BaseNotificationBody } from "../base"; +import classes from "./styles.module.scss"; + +interface Props { + children: ReactElement | ReactElement[]; +} + +export const GenericListNotificationBody = ({ children }: Props) => { + // const [scrollable, handle, bar] = useVirtualScroll(); + + return ( + + {/*
+
+
+
*/} + + {/*
*/} + +
{children}
+ + {/*
*/} + + ); +}; diff --git a/src/notifications/manager/manage/styles.module.scss b/src/notifications/list/styles.module.scss similarity index 100% rename from src/notifications/manager/manage/styles.module.scss rename to src/notifications/list/styles.module.scss diff --git a/src/notifications/manager/index.tsx b/src/notifications/manager/index.tsx index b4c2a5b..ac80113 100644 --- a/src/notifications/manager/index.tsx +++ b/src/notifications/manager/index.tsx @@ -11,15 +11,17 @@ import { ProfileCard } from "./profile"; import classes from "./styles.module.scss"; const Background = () => { - const profiles = usePersistStore((state) => state.profiles); + const selectedId = usePersistStore((state) => state.selectedId); const colors = useMemo( () => - profiles.find(({ selected }) => selected)?.colors || [ + usePersistStore + .getState() + .profiles.find(({ user: { id } }) => selectedId === id)?.colors || [ "#000AFF", "#DB00FF", "#00A3FF", ], - [profiles] + [selectedId] ); return ( @@ -89,7 +91,7 @@ const Slides = () => { ); }; -const ManagerNotificationBody = () => { +const ManagerNotificationContent = () => { return (
@@ -101,7 +103,7 @@ const ManagerNotificationBody = () => { export const ManagerNotification = () => { return ( - + ); }; diff --git a/src/notifications/manager/manage/index.tsx b/src/notifications/manager/manage/index.tsx index c087888..310c13e 100644 --- a/src/notifications/manager/manage/index.tsx +++ b/src/notifications/manager/manage/index.tsx @@ -1,59 +1,52 @@ import { Gear, Trash } from "@phosphor-icons/react"; import { open } from "@tauri-apps/api/shell"; -import { useState } from "react"; +import { useMemo, useState } from "react"; import { toast } from "react-hot-toast"; import { useT } from "talkr"; import { removeSigningKey, setAutosign } from "../../../api/git"; +import { + listGPGKeys, + listSSHKeys, + removeGPGKey, + removeSSHKey, +} from "../../../api/github"; import { deleteGPGKey } from "../../../api/gpg"; import { removeSSHKeyFromKeychain } from "../../../api/ssh"; import { Button } from "../../../components/buttons/default"; import { Typography } from "../../../components/typography"; -// import { useVirtualScroll } from "../../../hooks/scrollbar"; -import { Profile, usePersistStore } from "../../../store/persist"; -import { BaseNotificationBody } from "../../base"; -import classes from "./styles.module.scss"; +import { + getProfileById, + Profile, + usePersistStore, +} from "../../../store/persist"; +import { GenericListNotificationBody } from "../../list"; interface Props { - email: Profile["user"]["email"]; - type: Profile["type"]; - gpg: boolean; - ssh: boolean; - id: Profile["user"]["id"]; + userId: Profile["user"]["id"]; toastId: string; onClose?: () => void; } -const ManageUserNotificationBody = ({ - email, - type, - gpg, - ssh, - id, - toastId, - onClose, -}: Props) => { - // const [scrollable, handle, bar] = useVirtualScroll(); - +const ManageUserNotificationBody = ({ userId, toastId, onClose }: Props) => { const removeProfile = usePersistStore((state) => state.removeProfile); const [removingInProgress, setRemovingInProgress] = useState(false); const { T } = useT(); - return ( -
- {/*
-
-
-
*/} + const profile = useMemo(() => getProfileById(userId), [userId]); + + if (!profile) return null; - {/*
*/} + return ( + -
- //
+ ); }; export const ManageUserNotification = (props: Props) => { - return ( - - - - ); + return ; }; diff --git a/src/notifications/manager/profile/base.tsx b/src/notifications/manager/profile/base.tsx index 4f4617c..e2978c5 100644 --- a/src/notifications/manager/profile/base.tsx +++ b/src/notifications/manager/profile/base.tsx @@ -27,8 +27,10 @@ import { useAppStore } from "../../../store/app"; import { Profile, usePersistStore } from "../../../store/persist"; import { GenericErrorNotification } from "../../error"; import { AddGPGNotification } from "../../gpg/add"; +import { ManageGPGNotification } from "../../gpg/manage"; import { RemoveGPGNotification } from "../../gpg/remove"; import { AddSSHNotification } from "../../ssh/add"; +import { ManageSSHNotification } from "../../ssh/manage"; import { RemoveSSHNotification } from "../../ssh/remove"; import { BaseCard, BaseCardProps } from "../card"; import { ManageUserNotification } from "../manage"; @@ -74,11 +76,13 @@ export const BaseProfile = ({ const hideGPGNotifications = () => { toast.dismiss("add-gpg"); toast.dismiss("remove-gpg"); + toast.dismiss("manage-gpg"); setGPGOpen(false); }; const hideSSHNotifications = () => { toast.dismiss("add-ssh"); toast.dismiss("remove-ssh"); + toast.dismiss("manage-ssh"); setSSHOpen(false); }; const hideManageNotification = () => { @@ -102,17 +106,16 @@ export const BaseProfile = ({ const { T } = useT(); const manage = () => { + if (isGPGOpen) hideGPGNotifications(); + if (isSSHOpen) hideSSHNotifications(); + if (isManageOpen) hideManageNotification(); else { toast( (t) => ( setManageOpen(false)} /> ), @@ -140,7 +143,14 @@ export const BaseProfile = ({ onClick={manage} /> ) : ( -
+
)} @@ -152,25 +162,40 @@ export const BaseProfile = ({ button onClick={async () => { if (isGPGOpen) return hideGPGNotifications(); + if (isSSHOpen) hideSSHNotifications(); + if (isManageOpen) hideManageNotification(); if (gpg) { - toast( - (t) => ( - setGPGOpen(false)} - /> - ), - { id: "remove-gpg" } - ); + if (type === "local") + toast( + (t) => ( + setGPGOpen(false)} + /> + ), + { id: "manage-gpg" } + ); + else + toast( + (t) => ( + setGPGOpen(false)} + /> + ), + { id: "remove-gpg" } + ); setGPGOpen(true); } else { const canDoGPG = await isGPGAvailable(); if (!canDoGPG) toast((t) => ( ( setGPGOpen(false)} /> @@ -206,25 +231,39 @@ export const BaseProfile = ({ button onClick={async () => { if (isSSHOpen) return hideSSHNotifications(); + if (isGPGOpen) hideGPGNotifications(); + if (isManageOpen) hideManageNotification(); if (ssh) { - toast( - (t) => ( - setSSHOpen(false)} - /> - ), - { id: "remove-ssh" } - ); + if (type === "local") + toast( + (t) => ( + setSSHOpen(false)} + /> + ), + { id: "manage-ssh" } + ); + else + toast( + (t) => ( + setSSHOpen(false)} + /> + ), + { id: "remove-ssh" } + ); setSSHOpen(true); } else { const canDoSSH = await isSSHAvailable(); if (!canDoSSH) toast((t) => ( ( setSSHOpen(false)} /> @@ -268,6 +307,7 @@ export const BaseProfile = ({
void; } @@ -36,7 +37,7 @@ const SSHActionButton = ({ ); }; -export const AddSSHNotification = ({ toastId, id, onClose }: Props) => { +export const AddSSHNotification = ({ toastId, userId, onClose }: Props) => { const [inProgress, setInProgress] = useState(false); const setSSHKey = usePersistStore((state) => state.setSSHKey); @@ -44,12 +45,9 @@ export const AddSSHNotification = ({ toastId, id, onClose }: Props) => { const onClick = async () => { setInProgress(true); - const profiles = usePersistStore.getState().profiles; - const profile = profiles.find(({ user }) => id === user.id); + const profile = getProfileById(userId); - if (!profile) { - return setInProgress(false); - } + if (!profile) return setInProgress(false); try { const { public_key, private_key } = await generateSSHKeyPair( @@ -60,7 +58,7 @@ export const AddSSHNotification = ({ toastId, id, onClose }: Props) => { if (profile.type === "github") await addSSHKey(profile.user.accessToken, public_key); - setSSHKey(profile.user.id, public_key); + setSSHKey(profile.user.id, public_key, private_key); onClose(); toast.dismiss(toastId); @@ -74,11 +72,13 @@ export const AddSSHNotification = ({ toastId, id, onClose }: Props) => { const { T } = useT(); return ( - - - + + + + + ); }; diff --git a/src/notifications/ssh/copied.tsx b/src/notifications/ssh/copied.tsx new file mode 100644 index 0000000..65218d7 --- /dev/null +++ b/src/notifications/ssh/copied.tsx @@ -0,0 +1,17 @@ +import { useT } from "talkr"; + +import { AutoClosableNotificationProps } from "../autoclosable"; +import { GenericInfoNotification } from "../info"; + +export const SSHCopiedNotification = (props: AutoClosableNotificationProps) => { + const { T } = useT(); + + return ( + + ); +}; diff --git a/src/notifications/ssh/manage.tsx b/src/notifications/ssh/manage.tsx new file mode 100644 index 0000000..5f427da --- /dev/null +++ b/src/notifications/ssh/manage.tsx @@ -0,0 +1,54 @@ +import { Clipboard, Trash } from "@phosphor-icons/react"; +import { clipboard } from "@tauri-apps/api"; +import { toast } from "react-hot-toast"; +import { useT } from "talkr"; + +import { Button } from "../../components/buttons/default"; +import { Typography } from "../../components/typography"; +import { getProfileById, Profile } from "../../store/persist"; +import { GenericListNotificationBody } from "../list"; +import { SSHCopiedNotification } from "./copied"; +import { RemoveSSHNotification } from "./remove"; + +interface Props { + toastId: string; + userId: Profile["user"]["id"]; + onClose?: () => void; +} + +export const ManageSSHNotification = ({ userId, toastId, onClose }: Props) => { + const { T } = useT(); + + return ( + + + + + ); +}; diff --git a/src/notifications/ssh/remove.tsx b/src/notifications/ssh/remove.tsx index 789eef3..799ed5f 100644 --- a/src/notifications/ssh/remove.tsx +++ b/src/notifications/ssh/remove.tsx @@ -2,15 +2,17 @@ import { useState } from "react"; import toast from "react-hot-toast"; import { useT } from "talkr"; +import { listSSHKeys, removeSSHKey } from "../../api/github"; import { removeSSHKeyFromKeychain } from "../../api/ssh"; import { ActionButton } from "../../components/buttons/action"; -import { Profile, usePersistStore } from "../../store/persist"; -import { GenericActionNotificationBody } from "../action"; +import { getProfileById, Profile, usePersistStore } from "../../store/persist"; +import { GenericActionNotificationContent } from "../action"; +import { BaseNotificationBody } from "../base"; interface Props { - id: Profile["user"]["id"]; + userId: Profile["user"]["id"]; toastId: string; - onClose: () => void; + onClose?: () => void; } const SSHActionButton = ({ @@ -31,36 +33,32 @@ const SSHActionButton = ({ ); }; -export const RemoveSSHNotification = ({ toastId, id, onClose }: Props) => { +export const RemoveSSHNotification = ({ toastId, userId, onClose }: Props) => { const [inProgress, setInProgress] = useState(false); - const setSSHKey = usePersistStore((state) => state.setSSHKey); + const unsetSSHKey = usePersistStore((state) => state.unsetSSHKey); const onClick = async () => { setInProgress(true); - const profiles = usePersistStore.getState().profiles; - const profile = profiles.find(({ user }) => id === user.id); + const profile = getProfileById(userId); - if (!profile || !profile.ssh) { - return setInProgress(false); - } + if (!profile) return setInProgress(false); try { await removeSSHKeyFromKeychain(); - //!404 - // if (profile.type === "github") { - // const [algorithm, pub] = profile.ssh.split(" "); - // const keys = await listSSHKeys(profile.user.accessToken); - // const key = keys.find(({ key }) => key === `${algorithm} ${pub}`); - // if (!key) throw new Error("No such SSH key"); - // await removeSSHKey(profile.user.accessToken, key.id); - // } + if (profile.type === "github" && profile.ssh) { + const [algorithm, pub] = profile.ssh.public.split(" "); + const keys = await listSSHKeys(profile.user.accessToken); + const key = keys.find(({ key }) => key === `${algorithm} ${pub}`); + if (!key) throw new Error("No such SSH key"); + await removeSSHKey(profile.user.accessToken, key.id); + } - setSSHKey(profile.user.id, false); + unsetSSHKey(userId); - onClose(); + if (onClose) onClose(); toast.dismiss(toastId); } catch (error) { console.error(error); @@ -72,11 +70,13 @@ export const RemoveSSHNotification = ({ toastId, id, onClose }: Props) => { const { T } = useT(); return ( - - - + + + + + ); }; diff --git a/src/notifications/update/index.tsx b/src/notifications/update/index.tsx index f1d0290..d4aba40 100644 --- a/src/notifications/update/index.tsx +++ b/src/notifications/update/index.tsx @@ -1,47 +1,29 @@ import { open } from "@tauri-apps/api/shell"; import { useT } from "talkr"; -import { ActionButton } from "../../components/buttons/action"; -import { Typography } from "../../components/typography"; import { usePersistStore } from "../../store/persist"; -import { AutoClosableNotificationBody } from "../autoclosable"; -import classes from "./styles.module.scss"; +import { AutoClosableNotificationProps } from "../autoclosable"; +import { GenericInfoNotification } from "../info"; -const UpdateNotificationBody = () => { +export const UpdateNotification = (props: AutoClosableNotificationProps) => { const lastVersion = usePersistStore((state) => state.lastVersion); const { T } = useT(); return ( -
-
- {T("notifications.update.title")} - - {T("notifications.update.description", { version: lastVersion })} - -
- { - if (lastVersion) - await open( - `https://github.com/fax1ty/dogit/releases/tag/v${lastVersion}` - ); - }} - > - {T("notifications.update.button")} - -
- ); -}; - -interface Props { - toastId: string; -} - -export const UpdateNotification = ({ toastId }: Props) => { - return ( - - - + { + if (lastVersion) + await open( + `https://github.com/fax1ty/dogit/releases/tag/v${lastVersion}` + ); + }} + actionText={T("notifications.update.button")} + /> ); }; diff --git a/src/notifications/update/styles.module.scss b/src/notifications/update/styles.module.scss deleted file mode 100644 index 99b658e..0000000 --- a/src/notifications/update/styles.module.scss +++ /dev/null @@ -1,10 +0,0 @@ -.content { - display: flex; - color: white; - justify-content: space-between; - align-items: center; - - .text { - width: 265px; - } -} diff --git a/src/notifications/updater/index.tsx b/src/notifications/updater/index.tsx index 986405d..01c9644 100644 --- a/src/notifications/updater/index.tsx +++ b/src/notifications/updater/index.tsx @@ -10,7 +10,8 @@ import { ActionButtonProps, } from "../../components/buttons/action"; import { usePersistStore } from "../../store/persist"; -import { GenericActionNotificationBody } from "../action"; +import { GenericActionNotificationContent } from "../action"; +import { BaseNotificationBody } from "../base"; interface Props { version: string; @@ -56,12 +57,14 @@ export const UpdaterNotification = ({ version, toastId }: Props) => { const { T } = useT(); return ( - - - - + + + + + + ); }; diff --git a/src/store/persist.ts b/src/store/persist.ts index 4bb06cc..a5de16e 100644 --- a/src/store/persist.ts +++ b/src/store/persist.ts @@ -9,7 +9,7 @@ interface BaseProfile< selected: boolean; colors: [string, string, string]; gpg: string | false; - ssh: string | false; + ssh: { private: string; public: string } | false; remote: R; user: U; type: T; @@ -58,6 +58,7 @@ type GetProfileType = ProfileTypes[T]; interface PersistStore { profiles: Profile[]; + selectedId: Profile["user"]["id"] | null; addProfile: < T extends Profile["type"], P extends GetProfileType, @@ -79,7 +80,8 @@ interface PersistStore { startSync: (id: Profile["user"]["id"]) => void; finishSync: (id: Profile["user"]["id"]) => void; setGPGKey: (id: Profile["user"]["id"], secretId: string | false) => void; - setSSHKey: (id: Profile["user"]["id"], pub: string | false) => void; + setSSHKey: (id: Profile["user"]["id"], pub: string, priv: string) => void; + unsetSSHKey: (id: Profile["user"]["id"]) => void; skippedVersions: string[]; skipVersion: (v: string) => void; } @@ -104,6 +106,7 @@ export const usePersistStore = create( lastVersion: null, setLastVersion: (v) => set({ lastVersion: v }), profiles: [], + selectedId: null, addProfile: (type, user) => { const userAlreadyExist = get().profiles.find( ({ user: { id } }) => id === user.id @@ -142,7 +145,7 @@ export const usePersistStore = create( const profile = profiles[i]; profile.selected = true; - return { profiles }; + return { profiles, selectedId: profile.user.id }; }), updateProfileUser: (id, mutation) => set((old) => { @@ -161,11 +164,18 @@ export const usePersistStore = create( profiles[idx].gpg = secretId; return { profiles }; }), - setSSHKey: (id, pub) => + setSSHKey: (id, pub, secret) => + set((old) => { + const profiles = [...old.profiles]; + const idx = profiles.findIndex(({ user }) => user.id === id); + profiles[idx].ssh = { public: pub, private: secret }; + return { profiles }; + }), + unsetSSHKey: (id) => set((old) => { const profiles = [...old.profiles]; const idx = profiles.findIndex(({ user }) => user.id === id); - profiles[idx].ssh = pub; + profiles[idx].ssh = false; return { profiles }; }), startSync: (id) => @@ -187,6 +197,12 @@ export const usePersistStore = create( skipVersion: (v) => set((old) => ({ skippedVersions: [...old.skippedVersions, v] })), }), - { name: "persist-store", version: 5 } + { name: "persist-store", version: 6 } ) ); + +export const getProfileById = (id: Profile["user"]["id"]) => { + const profiles = usePersistStore.getState().profiles; + const profile = profiles.find(({ user }) => id === user.id); + return profile; +}; diff --git a/yarn.lock b/yarn.lock index f776f67..e879e6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -352,6 +352,379 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== +"@firebase/analytics-compat@0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz#50063978c42f13eb800e037e96ac4b17236841f4" + integrity sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q== + dependencies: + "@firebase/analytics" "0.10.0" + "@firebase/analytics-types" "0.8.0" + "@firebase/component" "0.6.4" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/analytics-types@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.8.0.tgz#551e744a29adbc07f557306530a2ec86add6d410" + integrity sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw== + +"@firebase/analytics@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.10.0.tgz#9c6986acd573c6c6189ffb52d0fd63c775db26d7" + integrity sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/app-check-compat@0.3.7": + version "0.3.7" + resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz#e150f61d653a0f2043a34dcb995616a717161839" + integrity sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw== + dependencies: + "@firebase/app-check" "0.8.0" + "@firebase/app-check-types" "0.5.0" + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/app-check-interop-types@0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz#b27ea1397cb80427f729e4bbf3a562f2052955c4" + integrity sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg== + +"@firebase/app-check-types@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.5.0.tgz#1b02826213d7ce6a1cf773c329b46ea1c67064f4" + integrity sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ== + +"@firebase/app-check@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.8.0.tgz#b531ec40900af9c3cf1ec63de9094a0ddd733d6a" + integrity sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/app-compat@0.2.14": + version "0.2.14" + resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.2.14.tgz#dd05785f08488f5b433018bc31f5b8c207a75d0b" + integrity sha512-VP2nIK3uR3yL7aXayqysVDtAD+AIwzw5jPbc6xAZ7AxrqrxmdNy1t7OHkSeoF6cpdOUz8XGrvl0QsgYfSTK/cw== + dependencies: + "@firebase/app" "0.9.14" + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/app-types@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.9.0.tgz#35b5c568341e9e263b29b3d2ba0e9cfc9ec7f01e" + integrity sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q== + +"@firebase/app@0.9.14": + version "0.9.14" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.9.14.tgz#62b529cdc78ecc9ea9fb9deb8e315e8b3d2f620a" + integrity sha512-HkslEbqzWyGoY5FJhgI31ru7bQ4Rt4PTrnyxgUxpPLfxZjM1H2/QCMXFevIXyvkbaKoGjYDS7/YoCWu+HWqJvw== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/auth-compat@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.4.3.tgz#c9e7ef36213687e217990dd46a1d8937c2d91ab6" + integrity sha512-M1t9nT5tBV1zQFCwO/NwxYCLGXRfLWDm6Veqai3XU7x/ItcgmLeLkkEc+hv2DlmCmgeeK0mpsW1AAe+jcUgKVw== + dependencies: + "@firebase/auth" "1.0.0" + "@firebase/auth-types" "0.12.0" + "@firebase/component" "0.6.4" + "@firebase/util" "1.9.3" + node-fetch "2.6.7" + tslib "^2.1.0" + +"@firebase/auth-interop-types@0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz#78884f24fa539e34a06c03612c75f222fcc33742" + integrity sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg== + +"@firebase/auth-types@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.12.0.tgz#f28e1b68ac3b208ad02a15854c585be6da3e8e79" + integrity sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA== + +"@firebase/auth@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-1.0.0.tgz#96a80591aaae4a8c48819d887f06884aa350984c" + integrity sha512-yQB/gCVQcLf0fBQbdkVK/qA3VY5iSXpzy1zMXSggZwEYfp8I/0PksFk6AztkzWL2c+QR6wdnIPyeXLI9x9vFgQ== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + "@react-native-async-storage/async-storage" "1.17.12" + node-fetch "2.6.7" + tslib "^2.1.0" + +"@firebase/component@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.4.tgz#8981a6818bd730a7554aa5e0516ffc9b1ae3f33d" + integrity sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA== + dependencies: + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/database-compat@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-1.0.0.tgz#2772ad1fa2d4ff18391f6d87ac9fce6fa415bd41" + integrity sha512-Udkz3/lfF1RZa6A1ygergG/xT7fHSeIUk2kx5bsiv0ChllaNkgovkhC2sgSJuGUBYqlnhLmkDwX2nkAwSutgEQ== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/database" "1.0.0" + "@firebase/database-types" "1.0.0" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/database-types@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-1.0.0.tgz#3f7f71c2c3fd1e29d15fce513f14dae2e7543f2a" + integrity sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg== + dependencies: + "@firebase/app-types" "0.9.0" + "@firebase/util" "1.9.3" + +"@firebase/database@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-1.0.0.tgz#785eea5530622c191a6bee686d909549c3e03330" + integrity sha512-ZD750VzQUpdf0uejSuIwvmCrGUgl8jJfUW3WKwAdSgVQsg4xZeepekDcpnVZrT+ZH+j7DwJ98vV/Fsg9uDwBMA== + dependencies: + "@firebase/auth-interop-types" "0.2.1" + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + faye-websocket "0.11.4" + tslib "^2.1.0" + +"@firebase/firestore-compat@0.3.13": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.3.13.tgz#e4567311236f05755f48d47542f0069640578478" + integrity sha512-xJdSdHtZoU66WOuZ7c22Oin6FwzPdTHwP0blIfmn3zSKSbgNGPUTWbilW2/EhK3ICSeTunBwTsxX9sLafyGaPQ== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/firestore" "4.0.0" + "@firebase/firestore-types" "3.0.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/firestore-types@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-3.0.0.tgz#f3440d5a1cc2a722d361b24cefb62ca8b3577af3" + integrity sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw== + +"@firebase/firestore@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-4.0.0.tgz#67e47ce2be13fb9af143e32b0cce2970a749f6b4" + integrity sha512-ds4sjGefmJaxkxTT39BoRgmrjfHWBgrnSku69lTwVEPtBF+KqY01iheAEXuLFLQeb1Wu3eKxgZnWIrUYjbh6NA== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + "@firebase/webchannel-wrapper" "0.10.1" + "@grpc/grpc-js" "~1.7.0" + "@grpc/proto-loader" "^0.6.13" + node-fetch "2.6.7" + tslib "^2.1.0" + +"@firebase/functions-compat@0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.3.5.tgz#7a532d3a9764c6d5fbc1ec5541a989a704326647" + integrity sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/functions" "0.10.0" + "@firebase/functions-types" "0.6.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/functions-types@0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.6.0.tgz#ccd7000dc6fc668f5acb4e6a6a042a877a555ef2" + integrity sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw== + +"@firebase/functions@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.10.0.tgz#c630ddf12cdf941c25bc8d554e30c3226cd560f6" + integrity sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA== + dependencies: + "@firebase/app-check-interop-types" "0.3.0" + "@firebase/auth-interop-types" "0.2.1" + "@firebase/component" "0.6.4" + "@firebase/messaging-interop-types" "0.2.0" + "@firebase/util" "1.9.3" + node-fetch "2.6.7" + tslib "^2.1.0" + +"@firebase/installations-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.2.4.tgz#b5557c897b4cd3635a59887a8bf69c3731aaa952" + integrity sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" + "@firebase/installations-types" "0.5.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/installations-types@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.5.0.tgz#2adad64755cd33648519b573ec7ec30f21fb5354" + integrity sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg== + +"@firebase/installations@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.6.4.tgz#20382e33e6062ac5eff4bede8e468ed4c367609e" + integrity sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/util" "1.9.3" + idb "7.0.1" + tslib "^2.1.0" + +"@firebase/logger@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.4.0.tgz#15ecc03c452525f9d47318ad9491b81d1810f113" + integrity sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA== + dependencies: + tslib "^2.1.0" + +"@firebase/messaging-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz#323ca48deef77065b4fcda3cfd662c4337dffcfd" + integrity sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/messaging" "0.12.4" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/messaging-interop-types@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz#6056f8904a696bf0f7fdcf5f2ca8f008e8f6b064" + integrity sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ== + +"@firebase/messaging@0.12.4": + version "0.12.4" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.12.4.tgz#ccb49df5ab97d5650c9cf5b8c77ddc34daafcfe0" + integrity sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" + "@firebase/messaging-interop-types" "0.2.0" + "@firebase/util" "1.9.3" + idb "7.0.1" + tslib "^2.1.0" + +"@firebase/performance-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.2.4.tgz#95cbf32057b5d9f0c75d804bc50e6ed3ba486274" + integrity sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/performance" "0.6.4" + "@firebase/performance-types" "0.2.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/performance-types@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.2.0.tgz#400685f7a3455970817136d9b48ce07a4b9562ff" + integrity sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA== + +"@firebase/performance@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.6.4.tgz#0ad766bfcfab4f386f4fe0bef43bbcf505015069" + integrity sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/remote-config-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz#1f494c81a6c9560b1f9ca1b4fbd4bbbe47cf4776" + integrity sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/remote-config" "0.4.4" + "@firebase/remote-config-types" "0.3.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/remote-config-types@0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz#689900dcdb3e5c059e8499b29db393e4e51314b4" + integrity sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA== + +"@firebase/remote-config@0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.4.4.tgz#6a496117054de58744bc9f382d2a6d1e14060c65" + integrity sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/storage-compat@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.3.2.tgz#51a97170fd652a516f729f82b97af369e5a2f8d7" + integrity sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/storage" "0.11.2" + "@firebase/storage-types" "0.8.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/storage-types@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.8.0.tgz#f1e40a5361d59240b6e84fac7fbbbb622bfaf707" + integrity sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg== + +"@firebase/storage@0.11.2": + version "0.11.2" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.11.2.tgz#c5e0316543fe1c4026b8e3910f85ad73f5b77571" + integrity sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/util" "1.9.3" + node-fetch "2.6.7" + tslib "^2.1.0" + +"@firebase/util@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.9.3.tgz#45458dd5cd02d90e55c656e84adf6f3decf4b7ed" + integrity sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA== + dependencies: + tslib "^2.1.0" + +"@firebase/webchannel-wrapper@0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.1.tgz#60bb2aaf129f9e00621f8d698722ddba6ee1f8ac" + integrity sha512-Dq5rYfEpdeel0bLVN+nfD1VWmzCkK+pJbSjIawGE+RY4+NIJqhbUDDQjvV0NUK84fMfwxvtFoCtEe70HfZjFcw== + "@floating-ui/core@^1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.3.1.tgz#4d795b649cc3b1cbb760d191c80dcb4353c9a366" @@ -380,10 +753,35 @@ aria-hidden "^1.1.3" tabbable "^6.0.1" -"@fontsource/roboto@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-5.0.5.tgz#56e4b2af0d684d6e33e311f307adb958fcf8eabd" - integrity sha512-IMXFq5AMgGx0sgNLfwWsmPuy3qa7lmDmQcXXihqwF4mT2UpD725cbxZj93ERY793OWon+6V1ANax02I3nt9+4w== +"@grpc/grpc-js@~1.7.0": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.7.3.tgz#f2ea79f65e31622d7f86d4b4c9ae38f13ccab99a" + integrity sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog== + dependencies: + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" + +"@grpc/proto-loader@^0.6.13": + version "0.6.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.13.tgz#008f989b72a40c60c96cd4088522f09b05ac66bc" + integrity sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^6.11.3" + yargs "^16.2.0" + +"@grpc/proto-loader@^0.7.0": + version "0.7.8" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.8.tgz#c050bbeae5f000a1919507f195a1b094e218036e" + integrity sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^7.2.4" + yargs "^17.7.2" "@humanwhocodes/config-array@^0.11.10": version "0.11.10" @@ -467,6 +865,66 @@ resolved "https://registry.yarnpkg.com/@phosphor-icons/react/-/react-2.0.10.tgz#dcf2f6dabd42bf9156be38caf59d4c818af2b817" integrity sha512-q5ITPNFhmEiYZLZOvEhjo2phlfxoOmit7vE1tBYMxcMqnZX2vdbMw3deDE7wCegpBKM/q/p39BJmhhoPcjZyCg== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@react-native-async-storage/async-storage@1.17.12": + version "1.17.12" + resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.17.12.tgz#a39e4df5b06795ce49b2ca5b7ca9b8faadf8e621" + integrity sha512-BXg4OxFdjPTRt+8MvN6jz4muq0/2zII3s7HeT/11e4Zeh3WCgk/BleLzUcDfVqF3OzFHUqEkSrb76d6Ndjd/Nw== + dependencies: + merge-options "^3.0.4" + "@tauri-apps/api@^1.2.0", "@tauri-apps/api@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.4.0.tgz#b4013ca3d17b853f7df29fe14079ebb4d52dbffa" @@ -548,6 +1006,16 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + +"@types/node@>=12.12.47", "@types/node@>=13.7.0": + version "20.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== + "@types/node@^18.7.10": version "18.16.17" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.17.tgz#d2512c03313db6329f7cb515fc8b508e658230c4" @@ -723,7 +1191,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -909,6 +1377,24 @@ chalk@^4.0.0: optionalDependencies: fsevents "~2.3.2" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" @@ -1027,6 +1513,11 @@ electron-to-chromium@^1.4.411: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.427.tgz#67e8069f7a864fc092fe2e09f196e68af5cb88a1" integrity sha512-HK3r9l+Jm8dYAm1ctXEWIC+hV60zfcjS9UA5BDlYvnI5S7PU/yytjpvSrTNrSSRRkuu3tDyZhdkwIczh+0DWaw== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" @@ -1362,6 +1853,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +faye-websocket@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1384,6 +1882,38 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +firebase@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-10.0.0.tgz#973b40a167b14ffec23bf1da081682e1cbc9effa" + integrity sha512-5falS6Qv0WRlB7Uool2s9sHH7e3oMCkJNAWpgTRFLnPUjsFmHAF9rP3pZH0d9NuyjdcQnzglCVT1MwNiHatIsw== + dependencies: + "@firebase/analytics" "0.10.0" + "@firebase/analytics-compat" "0.2.6" + "@firebase/app" "0.9.14" + "@firebase/app-check" "0.8.0" + "@firebase/app-check-compat" "0.3.7" + "@firebase/app-compat" "0.2.14" + "@firebase/app-types" "0.9.0" + "@firebase/auth" "1.0.0" + "@firebase/auth-compat" "0.4.3" + "@firebase/database" "1.0.0" + "@firebase/database-compat" "1.0.0" + "@firebase/firestore" "4.0.0" + "@firebase/firestore-compat" "0.3.13" + "@firebase/functions" "0.10.0" + "@firebase/functions-compat" "0.3.5" + "@firebase/installations" "0.6.4" + "@firebase/installations-compat" "0.2.4" + "@firebase/messaging" "0.12.4" + "@firebase/messaging-compat" "0.2.4" + "@firebase/performance" "0.6.4" + "@firebase/performance-compat" "0.2.4" + "@firebase/remote-config" "0.4.4" + "@firebase/remote-config-compat" "0.2.4" + "@firebase/storage" "0.11.2" + "@firebase/storage-compat" "0.3.2" + "@firebase/util" "1.9.3" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -1453,6 +1983,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" @@ -1596,6 +2131,21 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +idb@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.0.1.tgz#d2875b3a2f205d854ee307f6d196f246fea590a7" + integrity sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg== + +idb@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -1696,6 +2246,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -1725,6 +2280,11 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -1849,11 +2409,26 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -1882,6 +2457,13 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -1944,6 +2526,13 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-releases@^2.0.12: version "2.0.12" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" @@ -2124,6 +2713,43 @@ prop-types@^15.5.8, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +protobufjs@^6.11.3: + version "6.11.3" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" + integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +protobufjs@^7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" + integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -2199,6 +2825,11 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.2.0" functions-have-names "^1.2.3" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -2248,6 +2879,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +safe-buffer@>=5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -2321,6 +2957,15 @@ spinners-react@^1.0.7: resolved "https://registry.yarnpkg.com/spinners-react/-/spinners-react-1.0.7.tgz#237e3e6f5fe2e6319083eb8703372e728eb2a304" integrity sha512-Xcgpc7Ybm6HOrpCVJjbH1G/NV852HaV4Zc9T1sJ2+S2hn05lGiBZS1dBOKGLc1kp8wv2sd3wtt94I/NNqDjs3Q== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -2362,7 +3007,7 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -2438,6 +3083,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + tsconfig-paths@^3.14.1: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" @@ -2453,7 +3103,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0: +tslib@^2.0.0, tslib@^2.1.0: version "2.6.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== @@ -2532,6 +3182,33 @@ vite@^4.2.1: optionalDependencies: fsevents "~2.3.2" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -2567,11 +3244,25 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -2582,6 +3273,42 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"