diff --git a/package.json b/package.json index 4eeb5c16d9..c2a92d68c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lightning-browser-extension", - "version": "1.27.0", + "version": "1.28.1", "description": "Lightning browser extension", "private": true, "repository": "https://github.com/bumi/lightning-browser-extension.git", @@ -36,7 +36,7 @@ }, "dependencies": { "@bitcoin-design/bitcoin-icons-react": "^0.1.9", - "@headlessui/react": "^1.7.8", + "@headlessui/react": "^1.7.12", "@lightninglabs/lnc-web": "^0.2.2-alpha", "@noble/secp256k1": "^1.7.1", "@tailwindcss/forms": "^0.5.3", @@ -50,10 +50,10 @@ "dayjs": "^1.11.7", "dexie": "^3.2.3", "elliptic": "^6.5.4", - "html5-qrcode": "^2.3.6", + "html5-qrcode": "^2.3.7", "i18next": "^22.4.10", "i18next-browser-languagedetector": "^7.0.1", - "lnmessage": "^0.0.19", + "lnmessage": "^0.1.0", "lodash.merge": "^4.6.2", "lodash.pick": "^4.4.0", "lodash.snakecase": "^4.1.1", @@ -61,14 +61,14 @@ "react": "^18.2.0", "react-confetti": "^6.1.0", "react-dom": "^18.2.0", - "react-i18next": "^12.1.5", - "react-loading-skeleton": "^3.1.1", + "react-i18next": "^12.2.0", + "react-loading-skeleton": "^3.2.0", "react-modal": "^3.16.1", "react-qr-code": "^2.0.11", - "react-router-dom": "^6.8.1", + "react-router-dom": "^6.8.2", "react-toastify": "^9.1.1", "stream": "^0.0.2", - "tailwindcss": "^3.2.6", + "tailwindcss": "^3.2.7", "uuid": "^9.0.0", "webextension-polyfill": "^0.10.0", "zustand": "^3.7.2" @@ -76,15 +76,15 @@ "devDependencies": { "@commitlint/cli": "^17.4.4", "@commitlint/config-conventional": "^17.4.4", - "@jest/types": "^29.4.3", - "@playwright/test": "^1.30.0", + "@jest/types": "^29.5.0", + "@playwright/test": "^1.31.1", "@swc/core": "^1.3.35", "@swc/jest": "^0.2.24", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.4.3", - "@trivago/prettier-plugin-sort-imports": "^4.0.0", - "@types/chrome": "^0.0.218", + "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@types/chrome": "^0.0.224", "@types/crypto-js": "^4.1.1", "@types/elliptic": "^6.4.14", "@types/lodash.merge": "^4.6.7", @@ -93,11 +93,11 @@ "@types/pubsub-js": "^1.8.3", "@types/react-dom": "^18.0.11", "@types/react-modal": "^3.13.1", - "@types/uuid": "^9.0.0", + "@types/uuid": "^9.0.1", "@types/webextension-polyfill": "^0.10.0", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", - "autoprefixer": "^10.4.13", + "@typescript-eslint/eslint-plugin": "^5.54.1", + "@typescript-eslint/parser": "^5.54.1", + "autoprefixer": "^10.4.14", "buffer": "^6.0.3", "clean-webpack-plugin": "^4.0.0", "complete-randomer": "^1.9.1", @@ -106,8 +106,8 @@ "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^4.2.2", "del-cli": "^5.0.0", - "eslint": "^8.34.0", - "eslint-config-prettier": "^8.6.0", + "eslint": "^8.35.0", + "eslint-config-prettier": "^8.7.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", @@ -115,27 +115,27 @@ "filemanager-webpack-plugin": "^8.0.0", "html-webpack-plugin": "^5.5.0", "husky": "^8.0.3", - "jest": "^29.4.3", - "jest-environment-jsdom": "^29.4.3", - "jest-webextension-mock": "^3.8.8", - "lint-staged": "^13.1.2", - "mini-css-extract-plugin": "^2.7.2", - "msw": "^1.0.1", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "jest-webextension-mock": "^3.8.9", + "lint-staged": "^13.2.0", + "mini-css-extract-plugin": "^2.7.3", + "msw": "^1.1.0", "postcss": "^8.4.21", "postcss-cli": "^10.1.0", "postcss-loader": "^7.0.2", "pptr-testing-library": "^0.7.0", "prettier": "^2.8.4", "process": "^0.11.10", - "puppeteer": "^19.6.3", - "sass": "^1.58.0", + "puppeteer": "^19.7.2", + "sass": "^1.58.3", "sass-loader": "^13.2.0", "stream-browserify": "^3.0.0", "swc-loader": "^0.2.3", - "terser-webpack-plugin": "^5.3.6", - "tsconfig-paths-webpack-plugin": "^4.0.0", + "terser-webpack-plugin": "^5.3.7", + "tsconfig-paths-webpack-plugin": "^4.0.1", "typescript": "^4.9.5", - "webpack": "^5.75.0", + "webpack": "^5.76.1", "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.11.1", diff --git a/src/app/components/AllowanceMenu/index.tsx b/src/app/components/AllowanceMenu/index.tsx index f6993387c8..c6e2e025eb 100644 --- a/src/app/components/AllowanceMenu/index.tsx +++ b/src/app/components/AllowanceMenu/index.tsx @@ -3,10 +3,11 @@ import { CrossIcon } from "@bitcoin-design/bitcoin-icons-react/outline"; import Setting from "@components/Setting"; import Toggle from "@components/form/Toggle"; import type { FormEvent } from "react"; -import { useEffect, useState } from "react"; +import { Fragment, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import Modal from "react-modal"; import { toast } from "react-toastify"; +import { useAccount } from "~/app/context/AccountContext"; import { useSettings } from "~/app/context/SettingsContext"; import msg from "~/common/lib/msg"; import type { Allowance, Permission } from "~/types"; @@ -28,7 +29,7 @@ function AllowanceMenu({ allowance, onEdit, onDelete }: Props) { getFormattedFiat, } = useSettings(); const showFiat = !isLoadingSettings && settings.showFiat; - + const { account } = useAccount(); const [modalIsOpen, setIsOpen] = useState(false); const [budget, setBudget] = useState(""); const [lnurlAuth, setLnurlAuth] = useState(false); @@ -58,6 +59,7 @@ function AllowanceMenu({ allowance, onEdit, onDelete }: Props) { permissions: Permission[]; }>("listPermissions", { id: allowance.id, + accountId: account?.id, }); const permissions: Permission[] = permissionResponse?.permissions; @@ -72,8 +74,8 @@ function AllowanceMenu({ allowance, onEdit, onDelete }: Props) { } }; - !permissions && fetchPermissions(); - }, [allowance.id, permissions]); + fetchPermissions(); + }, [account?.id, allowance.id]); useEffect(() => { if (budget !== "" && showFiat) { @@ -125,6 +127,7 @@ function AllowanceMenu({ allowance, onEdit, onDelete }: Props) { if (changedIds.length) { await msg.request("deletePermissionsById", { ids: changedIds, + accountId: account?.id, }); } @@ -237,7 +240,7 @@ function AllowanceMenu({ allowance, onEdit, onDelete }: Props) {
{permissions.map((permission) => ( - <> + - + ))}
diff --git a/src/app/components/CompanionDownloadInfo.tsx b/src/app/components/CompanionDownloadInfo.tsx index a55f4434c3..a17e0174f5 100644 --- a/src/app/components/CompanionDownloadInfo.tsx +++ b/src/app/components/CompanionDownloadInfo.tsx @@ -1,13 +1,12 @@ -import { ReceiveIcon } from "@bitcoin-design/bitcoin-icons-react/filled"; import { useState } from "react"; import { useTranslation } from "react-i18next"; type Props = { - hasTorCallback: () => void; + hasTorCallback: (hasTor: boolean) => void; }; function CompanionDownloadInfo({ hasTorCallback }: Props) { - const [hasTorSupport, setHasTorSupport] = useState(false); + const [isTor, setIsTor] = useState(false); const { t } = useTranslation("components", { keyPrefix: "companion_download_info", }); @@ -20,40 +19,76 @@ function CompanionDownloadInfo({ hasTorCallback }: Props) { if (userAgent.indexOf("Linux") !== -1) return "Linux"; } + function onChangeConnectionMode(isTor: boolean) { + setIsTor(isTor); + hasTorCallback(isTor); + } + // TODO: check if the companion app is already installed return ( - <> - {!hasTorSupport && ( -
-

{t("description")}

-

- - {t("download_here")} - - -

-

- {t("or")}{" "} - { - e.preventDefault(); - setHasTorSupport(true); - hasTorCallback(); - }} - > - {t("using_tor")} - -

-
- )} - +
+

+ {t("heading")} +

+ +
); } diff --git a/src/app/components/Hyperlink/index.tsx b/src/app/components/Hyperlink/index.tsx new file mode 100644 index 0000000000..9e3dfab400 --- /dev/null +++ b/src/app/components/Hyperlink/index.tsx @@ -0,0 +1,17 @@ +import { ReactNode } from "react"; + +type Props = { + onClick: () => void; + children: ReactNode; +}; + +export default function Hyperlink({ onClick, children }: Props) { + return ( + + {children} + + ); +} diff --git a/src/app/components/Navbar/Navbar.tsx b/src/app/components/Navbar/Navbar.tsx index 1e172f712e..6aae3558a1 100644 --- a/src/app/components/Navbar/Navbar.tsx +++ b/src/app/components/Navbar/Navbar.tsx @@ -12,7 +12,9 @@ export default function Navbar({ children }: Props) {
{children && ( - + )}
diff --git a/src/app/components/SatButtons/index.tsx b/src/app/components/SatButtons/index.tsx index 4805244ee4..33e45ecdbc 100644 --- a/src/app/components/SatButtons/index.tsx +++ b/src/app/components/SatButtons/index.tsx @@ -5,39 +5,29 @@ import Button from "../Button"; type Props = { onClick: (amount: string) => void; disabled?: boolean; + min?: number; + max?: number; }; -function SatButtons({ onClick, disabled }: Props) { +function SatButtons({ onClick, disabled, min, max }: Props) { + const sizes = [1000, 5000, 10000, 25000]; + return (
-
); } diff --git a/src/app/components/UserMenu/index.tsx b/src/app/components/UserMenu/index.tsx index cb442301c2..c836638cda 100644 --- a/src/app/components/UserMenu/index.tsx +++ b/src/app/components/UserMenu/index.tsx @@ -81,6 +81,14 @@ export default function UserMenu() { {tCommon("actions.receive")} + { + openOptions("transactions"); + }} + > + + {tCommon("transactions")} + { diff --git a/src/app/components/form/DualCurrencyField/index.tsx b/src/app/components/form/DualCurrencyField/index.tsx index bdf0c56cd6..c1f6f4120c 100644 --- a/src/app/components/form/DualCurrencyField/index.tsx +++ b/src/app/components/form/DualCurrencyField/index.tsx @@ -1,6 +1,8 @@ import { useEffect, useRef } from "react"; import { classNames } from "~/app/utils"; +import { RangeLabel } from "./rangeLabel"; + export type Props = { suffix?: string; endAdornment?: React.ReactNode; @@ -75,12 +77,19 @@ export default function DualCurrencyField({ return (
- +
+ + {(min || max) && ( + + sats + + )} +
{t("range.between", { min, max })}; + } else if (min) { + return <>{t("range.greaterThan", { min })}; + } else if (max) { + return <>{t("range.lessThan", { max })}; + } else { + return null; + } +} diff --git a/src/app/router/Options/Options.tsx b/src/app/router/Options/Options.tsx index ef68f252ea..dd1557924e 100644 --- a/src/app/router/Options/Options.tsx +++ b/src/app/router/Options/Options.tsx @@ -14,6 +14,7 @@ import PublisherDetail from "@screens/Publishers/Detail"; import Receive from "@screens/Receive"; import Send from "@screens/Send"; import Settings from "@screens/Settings"; +import Transactions from "@screens/Transactions"; import Unlock from "@screens/Unlock"; import { useTranslation } from "react-i18next"; import { HashRouter, Navigate, Outlet, Route, Routes } from "react-router-dom"; @@ -54,6 +55,7 @@ function Options() { } /> } /> } /> + } /> } /> } /> } /> @@ -142,6 +144,9 @@ const Layout = () => { {tCommon("websites")} {tCommon("actions.send")} {tCommon("actions.receive")} + + {tCommon("actions.transactions")} +
+
+ {t("nostr.private_key.backup")} +
{ e.preventDefault(); diff --git a/src/app/screens/Discover/websites.json b/src/app/screens/Discover/websites.json index cb61ceed26..aeac2b9d51 100644 --- a/src/app/screens/Discover/websites.json +++ b/src/app/screens/Discover/websites.json @@ -153,6 +153,12 @@ "subtitle": "The blue bird experience for Nostr", "logo": "https://cdn.getalby-assets.com/alby-extension-website-screen/yosup_thumbnail.svg", "url": "https://yosup.app/" + }, + { + "title": "Primal", + "subtitle": "Lightning-fast UI for Nostr", + "logo": "https://cdn.getalby-assets.com/alby-extension-website-screen/primat-logo_fire-409917ad.svg", + "url": "https://primal.net/" } ] }, diff --git a/src/app/screens/Home/AllowanceView/index.tsx b/src/app/screens/Home/AllowanceView/index.tsx index 9566e70969..232cc23940 100644 --- a/src/app/screens/Home/AllowanceView/index.tsx +++ b/src/app/screens/Home/AllowanceView/index.tsx @@ -13,6 +13,7 @@ import { Trans, useTranslation } from "react-i18next"; import { toast } from "react-toastify"; import { useSettings } from "~/app/context/SettingsContext"; import { PublisherLnData } from "~/app/screens/Home/PublisherLnData"; +import { convertPaymentsToTransactions } from "~/app/utils/payments"; import type { Allowance, Transaction, Battery } from "~/types"; dayjs.extend(relativeTime); @@ -33,52 +34,44 @@ const AllowanceView: FC = (props) => { getFormattedNumber, } = useSettings(); - const [payments, setPayments] = useState(null); - const [isLoadingPayments, setIsLoadingPayments] = useState(true); + const [transactions, setTransactions] = useState(null); + const [isLoadingTransactions, setIsLoadingTransactions] = useState(true); const { t } = useTranslation("translation", { keyPrefix: "home" }); const showFiat = !isLoadingSettings && settings.showFiat; - const hasPayments = !isLoadingPayments && !!payments?.length; - const isEmptyPayments = !isLoadingPayments && payments?.length === 0; + const hasTransactions = !isLoadingTransactions && !!transactions?.length; // get array of payments if not done yet useEffect(() => { - const getPayments = async () => { - const payments: Transaction[] = props.allowance.payments.map( - (payment) => ({ - ...payment, - id: `${payment.id}`, - type: "sent", - date: dayjs(payment.createdAt).fromNow(), - title: payment.name || payment.description, - publisherLink: `options.html#/publishers/${props.allowance.id}`, - }) + const getTransactions = async () => { + const transactions: Transaction[] = await convertPaymentsToTransactions( + props.allowance.payments, + `options.html#/publishers/${props.allowance.id}` ); try { // attach fiatAmount if enabled - for (const payment of payments) { - const totalAmountFiat = showFiat - ? await getFormattedFiat(payment.totalAmount) + for (const transaction of transactions) { + transaction.totalAmountFiat = showFiat + ? await getFormattedFiat(transaction.totalAmount) : ""; - payment.totalAmountFiat = totalAmountFiat; } - setPayments(payments); + setTransactions(transactions); } catch (e) { console.error(e); if (e instanceof Error) toast.error(e.message); } finally { - setIsLoadingPayments(false); + setIsLoadingTransactions(false); } }; - !payments && !isLoadingSettings && getPayments(); + !transactions && !isLoadingSettings && getTransactions(); }, [ props.allowance, isLoadingSettings, - payments, + transactions, getFormattedFiat, showFiat, ]); @@ -138,15 +131,15 @@ const AllowanceView: FC = (props) => { {t("allowance_view.recent_transactions")} - {isLoadingPayments && ( + {isLoadingTransactions && (
)} - {hasPayments && } + {hasTransactions && } - {isEmptyPayments && ( + {!hasTransactions && (

{ - const response = await api.getPayments({ limit: 10 }); - - const payments: Transaction[] = response.payments.map((payment) => ({ - ...payment, - id: `${payment.id}`, - type: "sent", - date: dayjs(payment.createdAt).fromNow(), - title: payment.name || payment.description, - publisherLink: "options.html#/publishers", - })); - - return payments; -}; - export type Props = { lnDataFromCurrentTab?: Battery[]; currentUrl: URL | null; }; const DefaultView: FC = (props) => { - const [isLoadingPayments, setIsLoadingPayments] = useState(true); - const [payments, setPayments] = useState(null); + const [isLoadingTransactions, setIsLoadingTransactions] = useState(true); + const [transactions, setTransactions] = useState(null); const [isLoadingInvoices, setIsLoadingInvoices] = useState(false); const [incomingTransactions, setIncomingTransactions] = useState< @@ -60,11 +46,8 @@ const DefaultView: FC = (props) => { } = useSettings(); const showFiat = !isLoadingSettings && settings.showFiat; - const hasPayments = !isLoadingPayments && !!payments?.length; - const isEmptyPayments = !isLoadingPayments && payments?.length === 0; + const hasTransactions = !isLoadingTransactions && !!transactions?.length; const hasInvoices = !isLoadingInvoices && !!incomingTransactions?.length; - const isEmptyInvoices = - !isLoadingInvoices && incomingTransactions?.length === 0; const navigate = useNavigate(); const { account, balancesDecorated } = useAccount(); @@ -86,29 +69,33 @@ const DefaultView: FC = (props) => { checkBlockedUrl(); }, [props.currentUrl]); - // get array of payments if not done yet + // get array of transactions if not done yet useEffect(() => { - const getPayments = async () => { + const getTransactions = async () => { try { - const payments = await loadPayments(); + const { payments } = await api.getPayments({ limit: 10 }); + const transactions: Transaction[] = await convertPaymentsToTransactions( + payments, + "options.html#/publishers" + ); // attach fiatAmount if enabled - for (const payment of payments) { - const totalAmountFiat = showFiat - ? await getFormattedFiat(payment.totalAmount) + for (const transaction of transactions) { + transaction.totalAmountFiat = showFiat + ? await getFormattedFiat(transaction.totalAmount) : ""; - payment.totalAmountFiat = totalAmountFiat; } - setPayments(payments); + + setTransactions(transactions); } catch (e) { console.error(e); if (e instanceof Error) toast.error(e.message); } finally { - setIsLoadingPayments(false); + setIsLoadingTransactions(false); } }; - !payments && !isLoadingSettings && getPayments(); - }, [isLoadingSettings, payments, getFormattedFiat, showFiat]); + !transactions && !isLoadingSettings && getTransactions(); + }, [isLoadingSettings, transactions, getFormattedFiat, showFiat]); const unblock = async () => { try { @@ -148,10 +135,9 @@ const DefaultView: FC = (props) => { })); for (const invoice of invoices) { - const totalAmountFiat = settings.showFiat + invoice.totalAmountFiat = settings.showFiat ? await getFormattedFiat(invoice.totalAmount) : ""; - invoice.totalAmountFiat = totalAmountFiat; } setIncomingTransactions(invoices); @@ -170,7 +156,6 @@ const DefaultView: FC = (props) => { {!!props.lnDataFromCurrentTab?.length && ( )} -

)} - {isLoadingPayments && ( + {isLoadingTransactions && (
)} - {!isLoadingPayments && ( + {!isLoadingTransactions && (

{t("default_view.recent_transactions")} @@ -248,8 +233,10 @@ const DefaultView: FC = (props) => { - {hasPayments && } - {isEmptyPayments && ( + {hasTransactions && ( + + )} + {!hasTransactions && (

{t("default_view.no_transactions")}

@@ -264,7 +251,7 @@ const DefaultView: FC = (props) => { {hasInvoices && ( )} - {isEmptyInvoices && ( + {!hasInvoices && (

{t("default_view.no_transactions")}

diff --git a/src/app/screens/Keysend/index.tsx b/src/app/screens/Keysend/index.tsx index e782cc0e5e..7556e8544c 100644 --- a/src/app/screens/Keysend/index.tsx +++ b/src/app/screens/Keysend/index.tsx @@ -119,8 +119,7 @@ function Keysend() { setAmountSat(e.target.value)} value={amountSat} fiatValue={fiatAmount} diff --git a/src/app/screens/LNURLPay/index.tsx b/src/app/screens/LNURLPay/index.tsx index 1075e3ff1f..6653443f7f 100644 --- a/src/app/screens/LNURLPay/index.tsx +++ b/src/app/screens/LNURLPay/index.tsx @@ -420,6 +420,8 @@ function LNURLPay() { fiatValue={fiatValue} /> diff --git a/src/app/screens/Nostr/ConfirmSignMessage.tsx b/src/app/screens/Nostr/ConfirmSignMessage.tsx index 0d63ae2b0d..35a6fd1b96 100644 --- a/src/app/screens/Nostr/ConfirmSignMessage.tsx +++ b/src/app/screens/Nostr/ConfirmSignMessage.tsx @@ -8,6 +8,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { toast } from "react-toastify"; +import Hyperlink from "~/app/components/Hyperlink"; import ScreenHeader from "~/app/components/ScreenHeader"; import { useNavigationState } from "~/app/hooks/useNavigationState"; import { USER_REJECTED_ERROR } from "~/common/constants"; @@ -28,6 +29,7 @@ function ConfirmSignMessage() { const [loading, setLoading] = useState(false); const [successMessage, setSuccessMessage] = useState(""); const [rememberPermission, setRememberPermission] = useState(false); + const [showJSON, setShowJSON] = useState(false); // TODO: refactor: the success message and loading will not be displayed because after the reply the prompt is closed. async function confirm() { @@ -65,6 +67,10 @@ function ConfirmSignMessage() { confirm(); } + function toggleShowJSON() { + setShowJSON((current) => !current); + } + return (
@@ -78,9 +84,24 @@ function ConfirmSignMessage() { url={origin.host} /> +
+ + {showJSON ? t("hide_details") : t("view_details")} + +
+ {showJSON && ( +
+ {JSON.stringify(event, null, 2)} +
+ )}
(); - const [payments, setPayments] = useState(); + const [transactions, setTransactions] = useState(); const { id } = useParams(); const navigate = useNavigate(); @@ -40,22 +41,16 @@ function PublisherDetail() { }); setAllowance(response); - const payments: Transaction[] = response.payments.map((payment) => ({ - ...payment, - id: `${payment.id}`, - type: "sent", - date: dayjs(payment.createdAt).fromNow(), - title: payment.name || payment.description, - publisherLink: payment.location, - })); + const _transactions: Transaction[] = convertPaymentsToTransactions( + response.payments + ); - for (const payment of payments) { - const totalAmountFiat = settings.showFiat + for (const payment of _transactions) { + payment.totalAmountFiat = settings.showFiat ? await getFormattedFiat(payment.totalAmount) : ""; - payment.totalAmountFiat = totalAmountFiat; } - setPayments(payments); + setTransactions(_transactions); } } catch (e) { console.error(e); @@ -111,8 +106,8 @@ function PublisherDetail() {
- {payments && payments?.length > 0 && ( - + {transactions && transactions?.length > 0 && ( + )}
diff --git a/src/app/screens/Publishers/index.tsx b/src/app/screens/Publishers/index.tsx index 291d1ce5e8..310f0157e1 100644 --- a/src/app/screens/Publishers/index.tsx +++ b/src/app/screens/Publishers/index.tsx @@ -1,4 +1,5 @@ import Container from "@components/Container"; +import Loading from "@components/Loading"; import PublishersTable from "@components/PublishersTable"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -14,6 +15,7 @@ function Publishers() { }); const [publishers, setPublishers] = useState([]); + const [publishersLoading, setPublishersLoading] = useState(true); const navigate = useNavigate(); function navigateToPublisher(id: number) { @@ -80,6 +82,8 @@ function Publishers() { } catch (e) { console.error(e); if (e instanceof Error) toast.error(`Error: ${e.message}`); + } finally { + setPublishersLoading(false); } } @@ -97,17 +101,25 @@ function Publishers() { {t("description")}

- {publishers.length > 0 ? ( - + {publishersLoading ? ( +
+ +
) : ( <> -

{t("no_info")}

- -
{formData.url.match(/\.onion/i) && ( { - setHasTorSupport(true); + hasTorCallback={(hasTor: boolean) => { + setHasTorSupport(hasTor); }} /> )} diff --git a/src/app/screens/connectors/ConnectStart9/index.tsx b/src/app/screens/connectors/ConnectStart9/index.tsx index 02c346b248..502ab2ea58 100644 --- a/src/app/screens/connectors/ConnectStart9/index.tsx +++ b/src/app/screens/connectors/ConnectStart9/index.tsx @@ -140,8 +140,8 @@ export default function ConnectStart9() { {formData.url.match(/\.onion/i) && (
{ - setHasTorSupport(true); + hasTorCallback={(hasTor: boolean) => { + setHasTorSupport(hasTor); }} />
diff --git a/src/app/screens/connectors/ConnectUmbrel/index.tsx b/src/app/screens/connectors/ConnectUmbrel/index.tsx index ee703d51e5..0f5fa19b9f 100644 --- a/src/app/screens/connectors/ConnectUmbrel/index.tsx +++ b/src/app/screens/connectors/ConnectUmbrel/index.tsx @@ -137,8 +137,8 @@ export default function ConnectUmbrel() { {formData.url.match(/\.onion/i) && (
{ - setHasTorSupport(true); + hasTorCallback={(hasTor: boolean) => { + setHasTorSupport(hasTor); }} />
diff --git a/src/app/utils/payments.ts b/src/app/utils/payments.ts new file mode 100644 index 0000000000..2368dd224b --- /dev/null +++ b/src/app/utils/payments.ts @@ -0,0 +1,20 @@ +import dayjs from "dayjs"; +import { DbPayment, Transaction } from "~/types"; + +export const convertPaymentToTransaction = ( + payment: DbPayment, + publisherLink?: string +): Transaction => ({ + ...payment, + id: `${payment.id}`, + type: "sent", + date: dayjs(payment.createdAt).fromNow(), + title: payment.name || payment.description, + publisherLink: publisherLink || payment.location, +}); + +export const convertPaymentsToTransactions = ( + payments: DbPayment[], + publisherLink?: string +): Transaction[] => + payments.map((p: DbPayment) => convertPaymentToTransaction(p, publisherLink)); diff --git a/src/common/constants.ts b/src/common/constants.ts index b150832a09..ef81f55e46 100644 --- a/src/common/constants.ts +++ b/src/common/constants.ts @@ -183,7 +183,6 @@ export const DEFAULT_SETTINGS: SettingsStorage = { showFiat: true, currency: CURRENCIES.USD, exchange: "alby", - debug: false, nostrEnabled: false, closedTips: [], }; diff --git a/src/common/lib/api.ts b/src/common/lib/api.ts index 0c77c2a1bd..45d839e230 100644 --- a/src/common/lib/api.ts +++ b/src/common/lib/api.ts @@ -103,8 +103,12 @@ export const selectAccount = (id: string) => msg.request("selectAccount", { id }); export const getAllowance = (host: string) => msg.request("getAllowance", { host }); -export const getPayments = (options: { limit: number }) => +export const getPayments = (options?: { limit?: number }) => msg.request<{ payments: DbPayment[] }>("getPayments", options); +export const getPaymentsByAccount = (options: { + accountId: Account["id"]; + limit: number; +}) => msg.request<{ payments: DbPayment[] }>("getPaymentsByAccount", options); export const getSettings = () => msg.request("getSettings"); export const getStatus = () => msg.request("status"); export const getInfo = () => msg.request("getInfo"); diff --git a/src/common/lib/pubsub.ts b/src/common/lib/pubsub.ts index 6cc48a5c47..212ec16f90 100644 --- a/src/common/lib/pubsub.ts +++ b/src/common/lib/pubsub.ts @@ -12,6 +12,7 @@ const pubsub = { status = "failed"; } PubSub.publish(`ln.${type}.${status}`, { + accountId: data.accountId, response: data.response, details: data.details, paymentRequestDetails: data.paymentRequestDetails, diff --git a/src/extension/background-script/actions/allowances/__tests__/delete.test.ts b/src/extension/background-script/actions/allowances/__tests__/delete.test.ts index 5761fe7b21..11c0a924a7 100644 --- a/src/extension/background-script/actions/allowances/__tests__/delete.test.ts +++ b/src/extension/background-script/actions/allowances/__tests__/delete.test.ts @@ -9,6 +9,7 @@ const mockAllowances: DbAllowance[] = allowanceFixture; const mockPermissions = [ { id: 1, + accountId: "123456", allowanceId: 1, createdAt: "1667291216372", host: "pro.kollider.xyz", @@ -18,6 +19,7 @@ const mockPermissions = [ }, { id: 2, + accountId: "123456", allowanceId: 2, createdAt: "1667291216372", host: "lnmarkets.com", @@ -27,6 +29,7 @@ const mockPermissions = [ }, { id: 3, + accountId: "123456", allowanceId: 2, createdAt: "1667291216372", host: "lnmarkets.com", diff --git a/src/extension/background-script/actions/ln/__tests__/keysend.test.ts b/src/extension/background-script/actions/ln/__tests__/keysend.test.ts new file mode 100644 index 0000000000..1dca649a1e --- /dev/null +++ b/src/extension/background-script/actions/ln/__tests__/keysend.test.ts @@ -0,0 +1,119 @@ +import type Connector from "~/extension/background-script/connectors/connector.interface"; +import type { SendPaymentResponse } from "~/extension/background-script/connectors/connector.interface"; +import { allowanceFixture } from "~/fixtures/allowances"; +import type { Message, OriginData } from "~/types"; + +import keysend from "../keysend"; + +// suppress console logs when running tests +console.error = jest.fn(); + +jest.mock("~/common/lib/utils", () => ({ + openPrompt: jest.fn(() => Promise.resolve({ data: {} })), +})); + +// overwrite "connector" in tests later +let connector: Connector; +const ConnectorClass = jest.fn().mockImplementation(() => { + return connector; +}); + +jest.mock("~/extension/background-script/state", () => ({ + getState: () => ({ + getConnector: jest.fn(() => Promise.resolve(new ConnectorClass())), + currentAccountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", + }), +})); + +const allowanceInDB = allowanceFixture[0]; + +const message: Message = { + action: "keysend", + application: "LBE", + args: { + destination: + "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3", + amount: "1000", + customRecords: { + customKey: "696969", + customValue: "abcdefgh", + }, + }, + origin: { host: allowanceInDB.host } as OriginData, + prompt: true, +}; + +const requestResponse: SendPaymentResponse = { + data: { + preimage: "123", + paymentHash: "123", + route: { + total_amt: 1000, + total_fees: 2, + }, + }, +}; +const fullConnector = { + // hacky fix because Jest doesn't return constructor name + constructor: { + name: "lnd", + }, + keysend: jest.fn(() => Promise.resolve(requestResponse)), +} as unknown as Connector; + +// resets after every test +afterEach(async () => { + jest.clearAllMocks(); + // set a default connector if overwritten in a previous test + connector = fullConnector; +}); + +describe("ln keysend", () => { + describe("throws error", () => { + test("if the message doesn't have amount", async () => { + const messageWithoutAmount = { + ...message, + args: { + destination: + "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3", + customRecords: { + customKey: "696969", + customValue: "abcdefgh", + }, + }, + }; + + const result = await keysend(messageWithoutAmount); + + expect(result).toStrictEqual({ + error: "Destination or amount missing.", + }); + }); + + test("if the message doesn't have destination", async () => { + const messageWithoutDestination = { + ...message, + args: { + amount: "1000", + customRecords: { + customKey: "696969", + customValue: "abcdefgh", + }, + }, + }; + + const result = await keysend(messageWithoutDestination); + + expect(result).toStrictEqual({ + error: "Destination or amount missing.", + }); + }); + }); + + describe("makes a successful payment", () => { + test("if amount, destination and custom records are provided", async () => { + const result = await keysend(message); + expect(result).toStrictEqual(requestResponse); + }); + }); +}); diff --git a/src/extension/background-script/actions/ln/__tests__/request.test.ts b/src/extension/background-script/actions/ln/__tests__/request.test.ts index e15bf24794..0d67f6ac43 100644 --- a/src/extension/background-script/actions/ln/__tests__/request.test.ts +++ b/src/extension/background-script/actions/ln/__tests__/request.test.ts @@ -21,6 +21,7 @@ const ConnectorClass = jest.fn().mockImplementation(() => { jest.mock("~/extension/background-script/state", () => ({ getState: () => ({ getConnector: jest.fn(() => Promise.resolve(new ConnectorClass())), + currentAccountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", }), })); @@ -40,6 +41,7 @@ const allowanceInDB = { const permissionInDB = { id: 1, + accountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", allowanceId: allowanceInDB.id, createdAt: "1487076708000", host: allowanceInDB.host, diff --git a/src/extension/background-script/actions/ln/__tests__/sendPayment.test.ts b/src/extension/background-script/actions/ln/__tests__/sendPayment.test.ts new file mode 100644 index 0000000000..4748b9ef02 --- /dev/null +++ b/src/extension/background-script/actions/ln/__tests__/sendPayment.test.ts @@ -0,0 +1,104 @@ +import type Connector from "~/extension/background-script/connectors/connector.interface"; +import type { SendPaymentResponse } from "~/extension/background-script/connectors/connector.interface"; +import { allowanceFixture } from "~/fixtures/allowances"; +import type { MessageSendPayment, OriginData } from "~/types"; + +import sendPayment from "../sendPayment"; + +// suppress console logs when running tests +console.error = jest.fn(); + +jest.mock("~/common/lib/utils", () => ({ + openPrompt: jest.fn(() => Promise.resolve({ data: {} })), +})); + +// overwrite "connector" in tests later +let connector: Connector; +const ConnectorClass = jest.fn().mockImplementation(() => { + return connector; +}); + +jest.mock("~/extension/background-script/state", () => ({ + getState: () => ({ + getConnector: jest.fn(() => Promise.resolve(new ConnectorClass())), + currentAccountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", + }), +})); + +const allowanceInDB = allowanceFixture[0]; + +const message: MessageSendPayment = { + action: "sendPayment", + application: "LBE", + args: { + paymentRequest: + "lnbc10n1p3st44mpp5j7dtqa0t6jctujwl8q8v07kaz363cva058l6pf4zyjv64qvuk9fshp5rdh2y59nhv3va0xqg7fmevcmypfw0e3pjq4p6yy52nu4jv76wmqqcqzpgxqyz5vqsp5lal7ervygjs3qpfvglzn472ag2e3w939mfckctpawsjyl3sslc6q9qyyssqvdjlxvgc0zrcn4ze44479x24w7r2svqv8zsp3ezemd55pdkxzwrjeeql0hvuy3d9klsmqzf8rwar8x4cplpxccnaj667p537g46txtqpxkyeuu", + }, + origin: { host: allowanceInDB.host } as OriginData, + prompt: true, +}; + +const requestResponse: SendPaymentResponse = { + data: { + preimage: "123", + paymentHash: "123", + route: { + total_amt: 1000, + total_fees: 2, + }, + }, +}; +const fullConnector = { + // hacky fix because Jest doesn't return constructor name + constructor: { + name: "lnd", + }, + sendPayment: jest.fn(() => Promise.resolve(requestResponse)), +} as unknown as Connector; + +// resets after every test +afterEach(async () => { + jest.clearAllMocks(); + // set a default connector if overwritten in a previous test + connector = fullConnector; +}); + +describe("ln sendPayment", () => { + describe("throws error", () => { + test("if the message doesn't have paymentRequest", async () => { + const messageWithoutAmount = { + ...message, + args: {}, + }; + + const result = await sendPayment(messageWithoutAmount); + + expect(result).toStrictEqual({ + error: "Payment request missing.", + }); + }); + + test("if the paymentRequest is invalid", async () => { + const invalidPaymentRequest = "lnbcxyz"; + const messageWithoutDestination = { + ...message, + args: { + paymentRequest: invalidPaymentRequest, + }, + }; + + const result = await sendPayment(messageWithoutDestination); + + expect(result).toStrictEqual({ + error: `${invalidPaymentRequest} too short`, + }); + }); + }); + + describe("makes a successful payment", () => { + test("if paymentRequest is valid", async () => { + const result = await sendPayment(message); + expect(result).toStrictEqual(requestResponse); + }); + }); +}); diff --git a/src/extension/background-script/actions/ln/__tests__/signMessage.test.ts b/src/extension/background-script/actions/ln/__tests__/signMessage.test.ts index b84f682653..f4e0ad41b3 100644 --- a/src/extension/background-script/actions/ln/__tests__/signMessage.test.ts +++ b/src/extension/background-script/actions/ln/__tests__/signMessage.test.ts @@ -1,4 +1,5 @@ import type Connector from "~/extension/background-script/connectors/connector.interface"; +import type { SignMessageResponse } from "~/extension/background-script/connectors/connector.interface"; import type { Message } from "~/types"; import signMessage from "../signMessage"; @@ -30,7 +31,12 @@ const message: Message = { prompt: true, }; -const requestResponse = { data: [] }; +const requestResponse: SignMessageResponse = { + data: { + message: "hello sign me", + signature: "123456789", + }, +}; const fullConnector = { // hacky fix because Jest doesn't return constructor name constructor: { diff --git a/src/extension/background-script/actions/ln/keysend.ts b/src/extension/background-script/actions/ln/keysend.ts index 2965d63549..9628bb3ad0 100644 --- a/src/extension/background-script/actions/ln/keysend.ts +++ b/src/extension/background-script/actions/ln/keysend.ts @@ -7,12 +7,20 @@ import state from "../../state"; export default async function keysend(message: Message) { PubSub.publish(`ln.keysend.start`, message); const { destination, amount, customRecords } = message.args; + + const accountId = await state.getState().currentAccountId; + if (!accountId) { + return { + error: "Select an account.", + }; + } + if ( typeof destination !== "string" || (typeof amount !== "string" && typeof amount !== "number") ) { return { - error: "destination or amount missing.", + error: "Destination or amount missing.", }; } @@ -31,6 +39,7 @@ export default async function keysend(message: Message) { }; } pubsub.publishPaymentNotification("keysend", message, { + accountId, response, details: { destination: destination, diff --git a/src/extension/background-script/actions/ln/request.ts b/src/extension/background-script/actions/ln/request.ts index ab6ffe4602..4504f39373 100644 --- a/src/extension/background-script/actions/ln/request.ts +++ b/src/extension/background-script/actions/ln/request.ts @@ -10,6 +10,7 @@ const request = async ( message: MessageGenericRequest ): Promise<{ data: unknown } | { error: string }> => { const connector = await state.getState().getConnector(); + const accountId = state.getState().currentAccountId; const { origin, args } = message; @@ -43,6 +44,11 @@ const request = async ( throw new Error("Could not find an allowance for this host"); } + if (!accountId) { + // type guard + throw new Error("Could not find a selected account"); + } + const connectorName = connector.constructor.name.toLowerCase(); // prefix method with webln to prevent potential naming conflicts (e.g. with nostr calls that also use the permissions) const weblnMethod = `${WEBLN_PREFIX}${connectorName}/${methodInLowerCase}`; @@ -50,7 +56,7 @@ const request = async ( const permission = await db.permissions .where("host") .equalsIgnoreCase(origin.host) - .and((p) => p.method === weblnMethod) + .and((p) => p.accountId === accountId && p.method === weblnMethod) .first(); // request method is allowed to be called @@ -89,6 +95,7 @@ const request = async ( if (promptResponse.data.enabled) { const permissionIsAdded = await db.permissions.add({ createdAt: Date.now().toString(), + accountId: accountId, allowanceId: allowance.id, host: origin.host, method: weblnMethod, // ensure to store the prefixed method string diff --git a/src/extension/background-script/actions/ln/sendPayment.ts b/src/extension/background-script/actions/ln/sendPayment.ts index 5334d15edb..ec5cb4dcd4 100644 --- a/src/extension/background-script/actions/ln/sendPayment.ts +++ b/src/extension/background-script/actions/ln/sendPayment.ts @@ -9,6 +9,13 @@ export default async function sendPayment( ) { PubSub.publish(`ln.sendPayment.start`, message); + const accountId = await state.getState().currentAccountId; + if (!accountId) { + return { + error: "Select an account.", + }; + } + const { paymentRequest } = message.args; if (typeof paymentRequest !== "string") { return { @@ -16,12 +23,13 @@ export default async function sendPayment( }; } - const paymentRequestDetails = lightningPayReq.decode(paymentRequest); const connector = await state.getState().getConnector(); - let response; + let response, paymentRequestDetails; try { + paymentRequestDetails = lightningPayReq.decode(paymentRequest); + response = await connector.sendPayment({ paymentRequest, }); @@ -42,11 +50,14 @@ export default async function sendPayment( } pubsub.publishPaymentNotification("sendPayment", message, { + accountId, paymentRequestDetails, response, details: { - description: paymentRequestDetails.tagsObject.description, - destination: paymentRequestDetails.payeeNodeKey, + ...(paymentRequestDetails && { + description: paymentRequestDetails.tagsObject.description, + destination: paymentRequestDetails.payeeNodeKey, + }), }, }); diff --git a/src/extension/background-script/actions/nostr/__tests__/signSchnorr.test.ts b/src/extension/background-script/actions/nostr/__tests__/signSchnorr.test.ts index 070c895417..e9bd251c57 100644 --- a/src/extension/background-script/actions/nostr/__tests__/signSchnorr.test.ts +++ b/src/extension/background-script/actions/nostr/__tests__/signSchnorr.test.ts @@ -22,6 +22,7 @@ const NostrClass = jest.fn().mockImplementation(() => { jest.mock("~/extension/background-script/state", () => ({ getState: () => ({ getNostr: jest.fn(() => new NostrClass()), + currentAccountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", }), })); diff --git a/src/extension/background-script/actions/nostr/helpers.ts b/src/extension/background-script/actions/nostr/helpers.ts index 652b20350c..e326a35dca 100644 --- a/src/extension/background-script/actions/nostr/helpers.ts +++ b/src/extension/background-script/actions/nostr/helpers.ts @@ -2,6 +2,7 @@ import * as secp256k1 from "@noble/secp256k1"; import Hex from "crypto-js/enc-hex"; import sha256 from "crypto-js/sha256"; import db from "~/extension/background-script/db"; +import state from "~/extension/background-script/state"; import { Event } from "~/extension/ln/nostr/types"; export async function hasPermissionFor(method: string, host: string) { @@ -20,24 +21,33 @@ export async function hasPermissionFor(method: string, host: string) { ); } + const accountId = state.getState().currentAccountId; + + if (!accountId) { + return Promise.reject(new Error("Account doesn't exist")); + } + const findPermission = await db.permissions.get({ host, method, + accountId, }); return !!findPermission?.enabled; } export async function addPermissionFor(method: string, host: string) { + const accountId = state.getState().currentAccountId; const allowance = await db.allowances.get({ host, }); - if (!allowance?.id) { + if (!allowance?.id || !accountId) { return false; } const permissionIsAdded = await db.permissions.add({ createdAt: Date.now().toString(), + accountId: accountId, allowanceId: allowance.id, host: host, method: method, diff --git a/src/extension/background-script/actions/payments/__tests__/all.test.ts b/src/extension/background-script/actions/payments/__tests__/all.test.ts index 6a37933cfe..6652c2f2eb 100644 --- a/src/extension/background-script/actions/payments/__tests__/all.test.ts +++ b/src/extension/background-script/actions/payments/__tests__/all.test.ts @@ -5,6 +5,7 @@ import getPayments from "../all"; const mockPayments: DbPayment[] = [ { + accountId: "12345", allowanceId: "3", createdAt: "123456", description: "A blue bird?!", @@ -20,6 +21,7 @@ const mockPayments: DbPayment[] = [ totalFees: 111, }, { + accountId: "12345", allowanceId: "3", createdAt: "123456", description: "A yellow bird?!", diff --git a/src/extension/background-script/actions/payments/all.ts b/src/extension/background-script/actions/payments/all.ts index e833f950e8..a2b9089bf1 100644 --- a/src/extension/background-script/actions/payments/all.ts +++ b/src/extension/background-script/actions/payments/all.ts @@ -3,6 +3,7 @@ import type { MessagePaymentAll } from "~/types"; import db from "../../db"; const all = async (message: MessagePaymentAll) => { + // TODO: Add pagination instead of limiting to 2121 const limit = message?.args?.limit || 2121; const payments = await db.payments diff --git a/src/extension/background-script/actions/payments/index.ts b/src/extension/background-script/actions/payments/index.ts index 4c9c94ccde..53cd73560f 100644 --- a/src/extension/background-script/actions/payments/index.ts +++ b/src/extension/background-script/actions/payments/index.ts @@ -1,3 +1,4 @@ import all from "./all"; +import listByAccount from "./listByAccount"; -export { all }; +export { all, listByAccount }; diff --git a/src/extension/background-script/actions/payments/listByAccount.ts b/src/extension/background-script/actions/payments/listByAccount.ts new file mode 100644 index 0000000000..3a085ffbc6 --- /dev/null +++ b/src/extension/background-script/actions/payments/listByAccount.ts @@ -0,0 +1,24 @@ +import type { MessagePaymentListByAccount } from "~/types"; + +import db from "../../db"; + +const listByAccount = async (message: MessagePaymentListByAccount) => { + const { accountId } = message.args; + // TODO: Add pagination instead of limiting to 2121 + const limit = message?.args?.limit || 2121; + + const payments = await db.payments + .toCollection() + .and((p) => p.accountId === accountId) + .limit(limit) + .reverse() + .sortBy("createdAt"); + + return { + data: { + payments, + }, + }; +}; + +export default listByAccount; diff --git a/src/extension/background-script/actions/permissions/__tests__/add.test.ts b/src/extension/background-script/actions/permissions/__tests__/add.test.ts index cb3aeaf810..94a0756490 100644 --- a/src/extension/background-script/actions/permissions/__tests__/add.test.ts +++ b/src/extension/background-script/actions/permissions/__tests__/add.test.ts @@ -1,10 +1,20 @@ import db from "~/extension/background-script/db"; +import state from "~/extension/background-script/state"; import { allowanceFixture } from "~/fixtures/allowances"; import { permissionsFixture } from "~/fixtures/permissions"; import type { DbAllowance, MessagePermissionAdd } from "~/types"; import addPermission from "../add"; +jest.mock("~/extension/background-script/state"); + +const defaultMockState = { + currentAccountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", +}; + +const mockState = defaultMockState; +state.getState = jest.fn().mockReturnValue(mockState); + Date.now = jest.fn(() => 1487076708000); const mockAllowances: DbAllowance[] = [allowanceFixture[0]]; diff --git a/src/extension/background-script/actions/permissions/__tests__/delete.test.ts b/src/extension/background-script/actions/permissions/__tests__/delete.test.ts index 080ca6d7bf..0e9503cccc 100644 --- a/src/extension/background-script/actions/permissions/__tests__/delete.test.ts +++ b/src/extension/background-script/actions/permissions/__tests__/delete.test.ts @@ -34,6 +34,7 @@ describe("delete permission", () => { args: { host: mockPermissions[1].host, method: "the-request-method-2", + accountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", }, }; diff --git a/src/extension/background-script/actions/permissions/__tests__/deleteByIds.test.ts b/src/extension/background-script/actions/permissions/__tests__/deleteByIds.test.ts index 0e58d37d6e..8e96313bf2 100644 --- a/src/extension/background-script/actions/permissions/__tests__/deleteByIds.test.ts +++ b/src/extension/background-script/actions/permissions/__tests__/deleteByIds.test.ts @@ -29,6 +29,7 @@ describe("delete permissions by id", () => { }, args: { ids: [2, 3], + accountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", }, }; diff --git a/src/extension/background-script/actions/permissions/__tests__/list.test.ts b/src/extension/background-script/actions/permissions/__tests__/list.test.ts index 65e5090a54..f5b4b27f40 100644 --- a/src/extension/background-script/actions/permissions/__tests__/list.test.ts +++ b/src/extension/background-script/actions/permissions/__tests__/list.test.ts @@ -1,6 +1,6 @@ import db from "~/extension/background-script/db"; import { permissionsFixture } from "~/fixtures/permissions"; -import type { DbPermission, Permission, MessagePermissionsList } from "~/types"; +import type { DbPermission, MessagePermissionsList, Permission } from "~/types"; import listByAllowance from "../list"; @@ -40,6 +40,7 @@ describe("delete permissions by id", () => { }, args: { id: 1, + accountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", }, }; diff --git a/src/extension/background-script/actions/permissions/add.ts b/src/extension/background-script/actions/permissions/add.ts index 9103307b89..e17746ea10 100644 --- a/src/extension/background-script/actions/permissions/add.ts +++ b/src/extension/background-script/actions/permissions/add.ts @@ -1,10 +1,12 @@ import type { MessagePermissionAdd } from "~/types"; import db from "../../db"; +import state from "../../state"; const addPermission = async (message: MessagePermissionAdd) => { const { host, method, enabled, blocked } = message.args; + const accountId = state.getState().currentAccountId; const matchingAllowance = await db.allowances .where("host") .equalsIgnoreCase(host) @@ -14,9 +16,14 @@ const addPermission = async (message: MessagePermissionAdd) => { return { error: "No Allowance set for this host" }; } + if (!accountId) { + return { error: "No Account selected" }; + } + const added = await db.permissions.add({ createdAt: Date.now().toString(), allowanceId: matchingAllowance.id, + accountId, host, method, enabled, diff --git a/src/extension/background-script/actions/permissions/delete.ts b/src/extension/background-script/actions/permissions/delete.ts index db639d6cd1..407456e5ec 100644 --- a/src/extension/background-script/actions/permissions/delete.ts +++ b/src/extension/background-script/actions/permissions/delete.ts @@ -3,12 +3,12 @@ import type { MessagePermissionDelete } from "~/types"; import db from "../../db"; const deletePermission = async (message: MessagePermissionDelete) => { - const { host, method } = message.args; + const { host, method, accountId } = message.args; const deleteCount = await db.permissions .where("host") .equalsIgnoreCase(host) - .and((p) => p.method === method) + .and((p) => p.accountId === accountId && p.method === method) .delete(); await db.saveToStorage(); diff --git a/src/extension/background-script/actions/permissions/deleteByIds.ts b/src/extension/background-script/actions/permissions/deleteByIds.ts index c2260d49a5..4522669286 100644 --- a/src/extension/background-script/actions/permissions/deleteByIds.ts +++ b/src/extension/background-script/actions/permissions/deleteByIds.ts @@ -2,9 +2,19 @@ import db from "~/extension/background-script/db"; import type { MessagePermissionsDelete } from "~/types"; const deleteByIds = async (message: MessagePermissionsDelete) => { - const { ids } = message.args; + const { ids, accountId } = message.args; - await db.permissions.bulkDelete(ids); + if (!accountId) { + return { + error: "Missing account id to delete permission(s).", + }; + } + + await db.permissions + .where("id") + .anyOf(ids) + .and((p) => p.accountId === accountId) + .delete(); await db.saveToStorage(); return { data: true }; diff --git a/src/extension/background-script/actions/permissions/list.ts b/src/extension/background-script/actions/permissions/list.ts index 77851ae6f2..7409a9ed94 100644 --- a/src/extension/background-script/actions/permissions/list.ts +++ b/src/extension/background-script/actions/permissions/list.ts @@ -2,9 +2,16 @@ import db from "~/extension/background-script/db"; import type { MessagePermissionsList, Permission } from "~/types"; const listByAllowance = async (message: MessagePermissionsList) => { - const { id } = message.args; + const { id, accountId } = message.args; + + if (!accountId) { + return { + error: "Missing account id to fetch permissions.", + }; + } + const dbPermissions = await db.permissions - .where({ allowanceId: id }) + .where({ allowanceId: id, accountId }) .toArray(); const permissions: Permission[] = []; diff --git a/src/extension/background-script/actions/setup/validateAccount.js b/src/extension/background-script/actions/setup/validateAccount.js index 8b57c24926..c752da97ab 100644 --- a/src/extension/background-script/actions/setup/validateAccount.js +++ b/src/extension/background-script/actions/setup/validateAccount.js @@ -2,7 +2,7 @@ import connectors from "../../connectors"; const validateAccount = async (message, sender) => { const account = message.args; - const connector = new connectors[account.connector](account.config); + const connector = new connectors[account.connector](account, account.config); await connector.init(); try { diff --git a/src/extension/background-script/connectors/citadel.ts b/src/extension/background-script/connectors/citadel.ts index 03e5dc01c6..3c21fd5523 100644 --- a/src/extension/background-script/connectors/citadel.ts +++ b/src/extension/background-script/connectors/citadel.ts @@ -1,17 +1,19 @@ +import { Account } from "~/types"; + import Connector, { + CheckPaymentArgs, + CheckPaymentResponse, ConnectPeerResponse, - SendPaymentArgs, - SendPaymentResponse, - GetInfoResponse, GetBalanceResponse, + GetInfoResponse, GetInvoicesResponse, + KeysendArgs, MakeInvoiceArgs, MakeInvoiceResponse, + SendPaymentArgs, + SendPaymentResponse, SignMessageArgs, SignMessageResponse, - CheckPaymentArgs, - CheckPaymentResponse, - KeysendArgs, } from "./connector.interface"; interface Config { @@ -27,10 +29,12 @@ type RequestFunction = ( ) => Promise; class CitadelConnector implements Connector { + account: Account; config: Config; jwt: string; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; this.jwt = ""; } diff --git a/src/extension/background-script/connectors/commando.ts b/src/extension/background-script/connectors/commando.ts index c8db9622ae..a6715b84d3 100644 --- a/src/extension/background-script/connectors/commando.ts +++ b/src/extension/background-script/connectors/commando.ts @@ -2,6 +2,7 @@ import Hex from "crypto-js/enc-hex"; import UTF8 from "crypto-js/enc-utf8"; import LnMessage from "lnmessage"; import { v4 as uuidv4 } from "uuid"; +import { Account } from "~/types"; import Connector, { CheckPaymentArgs, @@ -110,10 +111,12 @@ const supportedMethods: string[] = [ ]; export default class Commando implements Connector { + account: Account; config: Config; ln: LnMessage; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; this.ln = new LnMessage({ remoteNodePublicKey: this.config.pubkey, diff --git a/src/extension/background-script/connectors/eclair.ts b/src/extension/background-script/connectors/eclair.ts index 07b9c6f9f9..876b00df1f 100644 --- a/src/extension/background-script/connectors/eclair.ts +++ b/src/extension/background-script/connectors/eclair.ts @@ -1,20 +1,21 @@ import Base64 from "crypto-js/enc-base64"; import UTF8 from "crypto-js/enc-utf8"; +import { Account } from "~/types"; import Connector, { - SendPaymentArgs, - SendPaymentResponse, CheckPaymentArgs, CheckPaymentResponse, ConnectPeerResponse, + GetBalanceResponse, GetInfoResponse, GetInvoicesResponse, - GetBalanceResponse, + KeysendArgs, MakeInvoiceArgs, MakeInvoiceResponse, + SendPaymentArgs, + SendPaymentResponse, SignMessageArgs, SignMessageResponse, - KeysendArgs, } from "./connector.interface"; interface Config { @@ -23,9 +24,11 @@ interface Config { } class Eclair implements Connector { + account: Account; config: Config; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; } diff --git a/src/extension/background-script/connectors/galoy.ts b/src/extension/background-script/connectors/galoy.ts index 695f0258de..b5d57c3c32 100644 --- a/src/extension/background-script/connectors/galoy.ts +++ b/src/extension/background-script/connectors/galoy.ts @@ -1,21 +1,21 @@ -import axios from "axios"; -import { AxiosRequestConfig } from "axios"; +import axios, { AxiosRequestConfig } from "axios"; import lightningPayReq from "bolt11"; +import { Account } from "~/types"; import Connector, { - SendPaymentArgs, - SendPaymentResponse, CheckPaymentArgs, CheckPaymentResponse, ConnectPeerResponse, + GetBalanceResponse, GetInfoResponse, GetInvoicesResponse, - GetBalanceResponse, + KeysendArgs, MakeInvoiceArgs, MakeInvoiceResponse, + SendPaymentArgs, + SendPaymentResponse, SignMessageArgs, SignMessageResponse, - KeysendArgs, } from "./connector.interface"; interface Config { @@ -25,9 +25,11 @@ interface Config { } class Galoy implements Connector { + account: Account; config: Config; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; } diff --git a/src/extension/background-script/connectors/kollider.ts b/src/extension/background-script/connectors/kollider.ts index a1f1f258ea..be8e14e929 100644 --- a/src/extension/background-script/connectors/kollider.ts +++ b/src/extension/background-script/connectors/kollider.ts @@ -6,6 +6,7 @@ import sha256 from "crypto-js/sha256"; import { ACCOUNT_CURRENCIES } from "~/common/constants"; import { getBTCToSats, getSatsToBTC } from "~/common/utils/currencyConvert"; import HashKeySigner from "~/common/utils/signer"; +import { Account } from "~/types"; import Connector, { CheckPaymentArgs, @@ -49,6 +50,7 @@ const defaultHeaders = { }; export default class Kollider implements Connector { + account: Account; config: Config; access_token?: string; access_token_created?: number; @@ -59,7 +61,8 @@ export default class Kollider implements Connector { currency: KolliderCurrencies; currentAccountId: string | null; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; this.currency = config.currency; this.currentAccountId = null; diff --git a/src/extension/background-script/connectors/lnbits.ts b/src/extension/background-script/connectors/lnbits.ts index 86ce896dd3..d3c8020908 100644 --- a/src/extension/background-script/connectors/lnbits.ts +++ b/src/extension/background-script/connectors/lnbits.ts @@ -3,23 +3,24 @@ import Hex from "crypto-js/enc-hex"; import sha256 from "crypto-js/sha256"; import utils from "~/common/lib/utils"; import HashKeySigner from "~/common/utils/signer"; +import { Account } from "~/types"; import state from "../state"; import Connector, { - SendPaymentArgs, - SendPaymentResponse, CheckPaymentArgs, CheckPaymentResponse, ConnectorInvoice, ConnectPeerResponse, + GetBalanceResponse, GetInfoResponse, GetInvoicesResponse, - GetBalanceResponse, + KeysendArgs, MakeInvoiceArgs, MakeInvoiceResponse, + SendPaymentArgs, + SendPaymentResponse, SignMessageArgs, SignMessageResponse, - KeysendArgs, } from "./connector.interface"; interface Config { @@ -28,9 +29,11 @@ interface Config { } class LnBits implements Connector { + account: Account; config: Config; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; } diff --git a/src/extension/background-script/connectors/lnc.ts b/src/extension/background-script/connectors/lnc.ts index 9a2d5cbbe8..d1719bbac2 100644 --- a/src/extension/background-script/connectors/lnc.ts +++ b/src/extension/background-script/connectors/lnc.ts @@ -7,6 +7,7 @@ import SHA256 from "crypto-js/sha256"; import snakeCase from "lodash.snakecase"; import { encryptData } from "~/common/lib/crypto"; import utils from "~/common/lib/utils"; +import { Account } from "~/types"; import state from "../state"; import Connector, { @@ -35,6 +36,8 @@ interface Config { const methods: Record = { addinvoice: "lnd.lightning.AddInvoice", + addholdinvoice: "lnd.invoices.AddHoldInvoice", + settleinvoice: "lnd.invoices.SettleInvoice", channelbalance: "lnd.lightning.ChannelBalance", connectpeer: "lnd.lightning.ConnectPeer", decodepayreq: "lnd.lightning.DecodePayReq", @@ -81,9 +84,11 @@ const snakeCaseObjectDeep = (value: FixMe): FixMe => { }; class LncCredentialStore implements CredentialStore { + account: Account; config: Config; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; } @@ -147,13 +152,15 @@ class LncCredentialStore implements CredentialStore { } class Lnc implements Connector { + account: Account; config: Config; lnc: FixMe; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; this.lnc = new LNC({ - credentialStore: new LncCredentialStore(config), + credentialStore: new LncCredentialStore(account, config), }); } diff --git a/src/extension/background-script/connectors/lnd.ts b/src/extension/background-script/connectors/lnd.ts index 09d00da021..87924b34b5 100644 --- a/src/extension/background-script/connectors/lnd.ts +++ b/src/extension/background-script/connectors/lnd.ts @@ -4,6 +4,7 @@ import UTF8 from "crypto-js/enc-utf8"; import WordArray from "crypto-js/lib-typedarrays"; import SHA256 from "crypto-js/sha256"; import utils from "~/common/lib/utils"; +import { Account } from "~/types"; import Connector, { CheckPaymentArgs, @@ -117,6 +118,14 @@ const methods: Record> = { path: "/v1/invoices", httpMethod: "POST", }, + addholdinvoice: { + path: "/v2/invoices/hodl", + httpMethod: "POST", + }, + settleinvoice: { + path: "/v2/invoices/settle", + httpMethod: "POST", + }, }; const pathTemplateParser = ( @@ -135,9 +144,11 @@ const pathTemplateParser = ( }; class Lnd implements Connector { + account: Account; config: Config; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; } diff --git a/src/extension/background-script/connectors/lndhub.ts b/src/extension/background-script/connectors/lndhub.ts index 7192dc5f7c..a0c87b02b2 100644 --- a/src/extension/background-script/connectors/lndhub.ts +++ b/src/extension/background-script/connectors/lndhub.ts @@ -8,6 +8,7 @@ import hmacSHA256 from "crypto-js/hmac-sha256"; import sha256 from "crypto-js/sha256"; import utils from "~/common/lib/utils"; import HashKeySigner from "~/common/utils/signer"; +import { Account } from "~/types"; import state from "../state"; import Connector, { @@ -44,6 +45,7 @@ const defaultHeaders = { }; export default class LndHub implements Connector { + account: Account; config: Config; access_token?: string; access_token_created?: number; @@ -51,7 +53,8 @@ export default class LndHub implements Connector { refresh_token_created?: number; noRetry?: boolean; - constructor(config: Config) { + constructor(account: Account, config: Config) { + this.account = account; this.config = config; } diff --git a/src/extension/background-script/db.ts b/src/extension/background-script/db.ts index e64678a2cf..5bdeb8dc65 100644 --- a/src/extension/background-script/db.ts +++ b/src/extension/background-script/db.ts @@ -43,6 +43,14 @@ export class DB extends Dexie { this.version(3).stores({ permissions: "++id,allowanceId,host,method,enabled,blocked,createdAt", }); + this.version(4).stores({ + permissions: + "++id,accountId,allowanceId,host,method,enabled,blocked,createdAt", + }); + this.version(5).stores({ + payments: + "++id,accountId,allowanceId,host,location,name,description,totalAmount,totalFees,preimage,paymentRequest,paymentHash,destination,createdAt", + }); this.on("ready", this.loadFromStorage.bind(this)); this.allowances = this.table("allowances"); this.payments = this.table("payments"); diff --git a/src/extension/background-script/events/__test__/notifications.test.ts b/src/extension/background-script/events/__test__/notifications.test.ts index 549e43a858..9f92db3416 100644 --- a/src/extension/background-script/events/__test__/notifications.test.ts +++ b/src/extension/background-script/events/__test__/notifications.test.ts @@ -20,7 +20,6 @@ jest.mock("~/extension/background-script/actions/cache/getCurrencyRate", () => { const settings: SettingsStorage = { browserNotifications: true, currency: CURRENCIES["USD"], - debug: false, exchange: "coindesk", isUsingLegacyLnurlAuthKey: false, legacyLnurlAuth: false, @@ -44,6 +43,7 @@ describe("Payment notifications", () => { }); const data: PaymentNotificationData = { + accountId: "12345", response: { data: { preimage: diff --git a/src/extension/background-script/events/__test__/persistPayments.test.ts b/src/extension/background-script/events/__test__/persistPayments.test.ts new file mode 100644 index 0000000000..d49d3359c0 --- /dev/null +++ b/src/extension/background-script/events/__test__/persistPayments.test.ts @@ -0,0 +1,92 @@ +import db from "~/extension/background-script/db"; +import { allowanceFixture } from "~/fixtures/allowances"; +import { paymentsFixture } from "~/fixtures/payment"; +import type { + DbAllowance, + DbPayment, + MessagePaymentAll, + PaymentNotificationData, +} from "~/types"; + +import getPayments from "../../actions/payments/all"; +import { persistSuccessfulPayment } from "../persistPayments"; + +Date.now = jest.fn(() => 1487076708000); + +const mockAllowances: DbAllowance[] = allowanceFixture; +const mockPayments: DbPayment[] = paymentsFixture; + +const updatedPayments: DbPayment[] = [ + ...paymentsFixture, + { + accountId: "123456", + allowanceId: "1", + createdAt: "1487076708000", + description: "A red bird?!", + destination: "Space", + host: "pro.kollider.xyz", + id: 6, + location: "test", + name: "Kollider", + paymentHash: "123", + paymentRequest: "", + preimage: "123", + totalAmount: 2121, + totalFees: 333, + }, +]; + +const data: PaymentNotificationData = { + accountId: "123456", + response: { + data: { + preimage: "123", + paymentHash: "123", + route: { + total_amt: 2121, + total_fees: 333, + }, + }, + }, + details: { + description: "A red bird?!", + destination: "Space", + }, + origin: { + location: "test", + domain: "", + host: "pro.kollider.xyz", + pathname: "test", + name: "Kollider", + description: "test", + icon: "", + metaData: {}, + external: true, + }, +}; + +describe("Persist payments", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + test("updates payments on persisting successful payment", async () => { + const message: MessagePaymentAll = { + application: "LBE", + origin: { internal: true }, + prompt: true, + action: "getPayments", + }; + + await db.allowances.bulkAdd(mockAllowances); + await db.payments.bulkAdd(mockPayments); + + await persistSuccessfulPayment("ln.sendPayment.success", data); + + expect(await getPayments(message)).toEqual({ + data: { + payments: [...updatedPayments.reverse()], + }, + }); + }); +}); diff --git a/src/extension/background-script/events/__test__/updateAllowances.test.ts b/src/extension/background-script/events/__test__/updateAllowances.test.ts new file mode 100644 index 0000000000..fab692c95a --- /dev/null +++ b/src/extension/background-script/events/__test__/updateAllowances.test.ts @@ -0,0 +1,80 @@ +import db from "~/extension/background-script/db"; +import { allowanceFixture } from "~/fixtures/allowances"; +import type { + DbAllowance, + MessageAllowanceGet, + PaymentNotificationData, +} from "~/types"; + +import getAllowance from "../../actions/allowances/get"; +import { updateAllowance } from "../allowances"; + +Date.now = jest.fn(() => 1487076708000); + +const mockAllowances: DbAllowance[] = allowanceFixture; + +const data: PaymentNotificationData = { + accountId: "123456", + response: { + data: { + preimage: "123", + paymentHash: "123", + route: { + total_amt: 50, + total_fees: 2, + }, + }, + }, + details: { + description: "A red bird?!", + destination: "Space", + }, + origin: { + location: "test", + domain: "", + host: "pro.kollider.xyz", + pathname: "test", + name: "Kollider", + description: "test", + icon: "", + metaData: {}, + external: true, + }, +}; + +describe("Update Allowances", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + test("Updates allowances after successful payment", async () => { + const message: MessageAllowanceGet = { + application: "LBE", + prompt: true, + action: "getAllowance", + origin: { + internal: true, + }, + args: { + host: "pro.kollider.xyz", + }, + }; + + await db.allowances.bulkAdd(mockAllowances); + + await updateAllowance("ln.sendPayment.success", data); + + expect(await getAllowance(message)).toEqual({ + data: { + ...mockAllowances[0], + payments: [], + lastPaymentAt: 1487076708000, + paymentsAmount: 0, + paymentsCount: 0, + percentage: "10", + remainingBudget: 450, + usedBudget: 50, + }, + }); + }); +}); diff --git a/src/extension/background-script/events/allowances.js b/src/extension/background-script/events/allowances.ts similarity index 72% rename from src/extension/background-script/events/allowances.js rename to src/extension/background-script/events/allowances.ts index 6425c3b407..abdc2d598a 100644 --- a/src/extension/background-script/events/allowances.js +++ b/src/extension/background-script/events/allowances.ts @@ -1,12 +1,22 @@ +import type { PaymentNotificationData } from "~/types"; + import db from "../db"; -const updateAllowance = async (message, data) => { +const updateAllowance = async ( + message: "ln.sendPayment.success" | "ln.keysend.success", + data: PaymentNotificationData +) => { if (!data.origin || !data.origin.host) { return; } const host = data.origin.host; const paymentResponse = data.response; + + if ("error" in paymentResponse) { + return; + } + const route = paymentResponse.data.route; const { total_amt } = route; @@ -15,7 +25,7 @@ const updateAllowance = async (message, data) => { .equalsIgnoreCase(host) .first(); - if (!allowance) { + if (!allowance || !allowance.id) { return; } diff --git a/src/extension/background-script/events/index.js b/src/extension/background-script/events/index.ts similarity index 59% rename from src/extension/background-script/events/index.js rename to src/extension/background-script/events/index.ts index 83a6d7a25b..69786d3ac7 100644 --- a/src/extension/background-script/events/index.js +++ b/src/extension/background-script/events/index.ts @@ -7,20 +7,26 @@ import { paymentFailedNotification, paymentSuccessNotification, } from "./notifications"; -import { persistSuccessfullPayment } from "./persistPayments"; +import { persistSuccessfulPayment } from "./persistPayments"; const subscribe = () => { const paymentTypes = ["sendPayment", "keysend"]; paymentTypes.forEach((type) => { + // @ts-expect-error typed as ln.sendPayment.success | ln.keysend.success PubSub.subscribe(`ln.${type}.success`, paymentSuccessNotification); + // @ts-expect-error typed as ln.sendPayment.success | ln.keysend.success PubSub.subscribe(`ln.${type}.failed`, paymentFailedNotification); - PubSub.subscribe(`ln.${type}.success`, persistSuccessfullPayment); + // @ts-expect-error typed as ln.sendPayment.success | ln.keysend.success + PubSub.subscribe(`ln.${type}.success`, persistSuccessfulPayment); + // @ts-expect-error typed as ln.sendPayment.success | ln.keysend.success PubSub.subscribe(`ln.${type}.success`, updateAllowance); }); + // @ts-expect-error typed as lnurl.auth.success PubSub.subscribe("lnurl.auth.success", lnurlAuthSuccessNotification); + // @ts-expect-error typed as lnurl.auth.failed PubSub.subscribe("lnurl.auth.failed", lnurlAuthFailedNotification); console.info(`Event subscriptions registered`); diff --git a/src/extension/background-script/events/persistPayments.js b/src/extension/background-script/events/persistPayments.js deleted file mode 100644 index 2ba68ceaa4..0000000000 --- a/src/extension/background-script/events/persistPayments.js +++ /dev/null @@ -1,28 +0,0 @@ -import db from "../db"; - -const persistSuccessfullPayment = async (message, data) => { - const name = data?.origin?.name; - const host = data?.origin?.host; - const location = data?.origin?.location; - const paymentResponse = data.response; - const route = paymentResponse.data.route; - const { total_amt, total_fees } = route; - - await db.payments.add({ - host, - location, - name, - description: data.details.description, - preimage: paymentResponse.data.preimage, - paymentHash: paymentResponse.data.paymentHash, - destination: data.details.destination, - totalAmount: total_amt, - totalFees: total_fees, - createdAt: Date.now(), - }); - await db.saveToStorage(); - console.info(`Persisted payment ${paymentResponse.data.paymentHash}`); - return true; -}; - -export { persistSuccessfullPayment }; diff --git a/src/extension/background-script/events/persistPayments.ts b/src/extension/background-script/events/persistPayments.ts new file mode 100644 index 0000000000..6fc0f8bbe1 --- /dev/null +++ b/src/extension/background-script/events/persistPayments.ts @@ -0,0 +1,47 @@ +import type { PaymentNotificationData } from "~/types"; + +import db from "../db"; + +const persistSuccessfulPayment = async ( + message: "ln.sendPayment.success" | "ln.keysend.success", + data: PaymentNotificationData +) => { + const name = data?.origin?.name; + const host = data?.origin?.host; + const location = data?.origin?.location; + const accountId = data.accountId; + const paymentResponse = data.response; + + if ("error" in paymentResponse) { + return; + } + + const allowance = await db.allowances + .where("host") + .equalsIgnoreCase(host as string) + .first(); + + const route = paymentResponse.data.route; + const { total_amt, total_fees } = route; + + await db.payments.add({ + accountId, + host, + location, + name, + description: data.details.description as string, + preimage: paymentResponse.data.preimage, + paymentHash: paymentResponse.data.paymentHash, + destination: data.details.destination as string, + totalAmount: total_amt, + totalFees: total_fees, + createdAt: Date.now().toString(), + allowanceId: allowance ? (allowance.id ?? "").toString() : "", + paymentRequest: "", + }); + await db.saveToStorage(); + console.info(`Persisted payment ${paymentResponse.data.paymentHash}`); + return true; +}; + +export { persistSuccessfulPayment }; diff --git a/src/extension/background-script/index.ts b/src/extension/background-script/index.ts index c365cbbc55..e19a591110 100644 --- a/src/extension/background-script/index.ts +++ b/src/extension/background-script/index.ts @@ -3,7 +3,7 @@ import utils from "~/common/lib/utils"; import { ExtensionIcon, setIcon } from "./actions/setup/setIcon"; import connectors from "./connectors"; -import { isIndexedDbAvailable, db } from "./db"; +import { db, isIndexedDbAvailable } from "./db"; import * as events from "./events"; import migrate from "./migrations"; import { router } from "./router"; @@ -12,6 +12,8 @@ import state from "./state"; let isFirstInstalled = false; let isRecentlyUpdated = false; +const debug = process.env.NODE_ENV === "development"; + // when debugging is enabled in development mode a window.debugAlby object is defined that can be used within the console. This is the type interface for that declare global { interface Window { @@ -65,7 +67,7 @@ const updateIcon = async ( }; const debugLogger = (message: unknown, sender: Runtime.MessageSender) => { - if (state.getState().settings.debug) { + if (debug) { console.info("Background onMessage: ", message, sender); } }; @@ -97,8 +99,6 @@ const routeCalls = ( if (message.application !== "LBE" || !message.prompt) { return; } - const debug = state.getState().settings.debug; - if (message.type) { console.error("Invalid message, using type: ", message); } @@ -120,18 +120,6 @@ const routeCalls = ( async function init() { console.info("Loading background script"); - // this is the only handler that may and must return a Promise which resolve with the response to the content script - browser.runtime.onMessage.addListener(routeCalls); // all go through here - - browser.runtime.onMessage.addListener(debugLogger); - - // Update the extension icon - browser.tabs.onUpdated.addListener(updateIcon); - - // Notify the content script that the tab has been updated. - browser.tabs.onUpdated.addListener(extractLightningData); - - //await browser.storage.sync.set({ settings: { debug: true }, allowances: [] }); await state.getState().init(); console.info("State loaded"); @@ -148,7 +136,18 @@ async function init() { events.subscribe(); console.info("Events subscribed"); - if (state.getState().settings.debug) { + browser.runtime.onMessage.addListener(debugLogger); + + // this is the only handler that may and must return a Promise which resolve with the response to the content script + browser.runtime.onMessage.addListener(routeCalls); + + // Update the extension icon + browser.tabs.onUpdated.addListener(updateIcon); + + // Notify the content script that the tab has been updated. + browser.tabs.onUpdated.addListener(extractLightningData); + + if (debug) { console.info("Debug mode enabled, use window.debugAlby"); window.debugAlby = { state, diff --git a/src/extension/background-script/migrations/index.ts b/src/extension/background-script/migrations/index.ts index 2eb09b6f8c..f6832eadb3 100644 --- a/src/extension/background-script/migrations/index.ts +++ b/src/extension/background-script/migrations/index.ts @@ -1,3 +1,4 @@ +import db from "../db"; import state from "../state"; export type Migration = keyof typeof migrations; @@ -40,6 +41,18 @@ const migrations = { } }, + migratePaymentsWithoutAccountId: async () => { + const { accounts } = state.getState(); + if (Object.keys(accounts).length == 1) { + const accountId = Object.keys(accounts)[0]; + const payments = await db.payments.toArray(); + + payments.forEach(async (payments) => { + payments.id && (await db.payments.update(payments.id, { accountId })); + }); + } + }, + ensureAccountId: async () => { const { accounts } = state.getState(); Object.keys(accounts).forEach((accountId) => { @@ -53,6 +66,17 @@ const migrations = { }); // will be persisted by setMigrated }, + + migratePermissionsWithoutAccountId: async () => { + const { accounts } = state.getState(); + const accountId = Object.keys(accounts)[0]; + const permissions = await db.permissions.toArray(); + + permissions.forEach(async (permission) => { + permission.id && + (await db.permissions.update(permission.id, { accountId })); + }); + }, }; const migrate = async () => { @@ -68,6 +92,11 @@ const migrate = async () => { await migrations["ensureAccountId"](); await setMigrated("ensureAccountId"); } + if (shouldMigrate("migratePermissionsWithoutAccountId")) { + console.info("Running migration for: migratePermissionsWithoutAccountId"); + await migrations["migratePermissionsWithoutAccountId"](); + await setMigrated("migratePermissionsWithoutAccountId"); + } }; export default migrate; diff --git a/src/extension/background-script/router.ts b/src/extension/background-script/router.ts index a5324800c2..05ad0693f4 100644 --- a/src/extension/background-script/router.ts +++ b/src/extension/background-script/router.ts @@ -33,6 +33,7 @@ const routes = { makeInvoice: ln.makeInvoice, connectPeer: ln.connectPeer, getPayments: payments.all, + getPaymentsByAccount: payments.listByAccount, accountInfo: accounts.info, accountDecryptedDetails: accounts.decryptedDetails, addAccount: accounts.add, diff --git a/src/extension/background-script/state.ts b/src/extension/background-script/state.ts index f90fe3b45d..6f18931706 100644 --- a/src/extension/background-script/state.ts +++ b/src/extension/background-script/state.ts @@ -55,6 +55,8 @@ const browserStorageKeys = Object.keys(browserStorageDefaults) as Array< keyof BrowserStorage >; +let storage: "sync" | "local" = "sync"; + const state = createState((set, get) => ({ connector: null, account: null, @@ -102,7 +104,7 @@ const state = createState((set, get) => ({ if (!password) throw new Error("Password is not set"); const config = decryptData(account.config as string, password); - const connector = new connectors[account.connector](config); + const connector = new connectors[account.connector](account, config); await connector.init(); set({ connector: connector }); @@ -155,11 +157,25 @@ const state = createState((set, get) => ({ return !!password; }, init: () => { - return browser.storage.sync.get(browserStorageKeys).then((result) => { - // Deep merge to ensure that nested defaults are also merged instead of overwritten. - const data = merge(browserStorageDefaults, result as BrowserStorage); - set(data); - }); + return browser.storage.sync + .get(browserStorageKeys) + .then((result) => { + // Deep merge to ensure that nested defaults are also merged instead of overwritten. + const data = merge(browserStorageDefaults, result as BrowserStorage); + set(data); + }) + .catch((e) => { + console.info("storage.sync is not available. using storage.local"); + storage = "local"; + return browser.storage.local.get("__sync").then((result) => { + // Deep merge to ensure that nested defaults are also merged instead of overwritten. + const data = merge( + browserStorageDefaults, + result.mockSync as BrowserStorage + ); + set(data); + }); + }); }, reset: async () => { set({ ...browserStorageDefaults }); @@ -171,7 +187,14 @@ const state = createState((set, get) => ({ ...browserStorageDefaults, ...pick(current, browserStorageKeys), }; - return browser.storage.sync.set(data); + + if (storage === "sync") { + return browser.storage.sync.set(data); + } else { + // because there's an overlap with accounts being stored in + // the local storage, see src/common/lib/cache.ts + return browser.storage.local.set({ __sync: data }); + } }, })); diff --git a/src/extension/ln/nostr/types.ts b/src/extension/ln/nostr/types.ts index 8e7f3fa20d..85e8f2f357 100644 --- a/src/extension/ln/nostr/types.ts +++ b/src/extension/ln/nostr/types.ts @@ -3,7 +3,7 @@ export type Event = { kind: EventKind; pubkey?: string; content: string; - tags: string[]; + tags: string[][]; created_at: number; sig?: string; }; diff --git a/src/fixtures/payment.ts b/src/fixtures/payment.ts index aa534c0ad7..f29c5a6d17 100644 --- a/src/fixtures/payment.ts +++ b/src/fixtures/payment.ts @@ -2,6 +2,7 @@ import type { DbPayment } from "~/types"; export const paymentsFixture: DbPayment[] = [ { + accountId: "12345", allowanceId: "3", createdAt: "123456", description: "A blue bird?!", @@ -17,6 +18,7 @@ export const paymentsFixture: DbPayment[] = [ totalFees: 111, }, { + accountId: "12345", allowanceId: "3", createdAt: "123456", description: "A yellow bird?!", diff --git a/src/fixtures/permissions.ts b/src/fixtures/permissions.ts index 416dd77c46..ef6f46ddb4 100644 --- a/src/fixtures/permissions.ts +++ b/src/fixtures/permissions.ts @@ -3,6 +3,7 @@ import type { DbPermission } from "~/types"; export const permissionsFixture: DbPermission[] = [ { id: 1, + accountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", allowanceId: 1, createdAt: "1487076708000", host: "pro.kollider.xyz", @@ -12,6 +13,7 @@ export const permissionsFixture: DbPermission[] = [ }, { id: 2, + accountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", allowanceId: 1, createdAt: "1487076708000", host: "pro.kollider.xyz", @@ -21,6 +23,7 @@ export const permissionsFixture: DbPermission[] = [ }, { id: 3, + accountId: "8b7f1dc6-ab87-4c6c-bca5-19fa8632731e", allowanceId: 2, createdAt: "1487076708000", host: "lnmarkets.com", diff --git a/src/i18n/i18nConfig.ts b/src/i18n/i18nConfig.ts index 572c8a414e..41e8638a54 100644 --- a/src/i18n/i18nConfig.ts +++ b/src/i18n/i18nConfig.ts @@ -3,6 +3,7 @@ import "dayjs/locale/cs"; import "dayjs/locale/da"; import "dayjs/locale/es"; import "dayjs/locale/fi"; +import "dayjs/locale/fr"; import "dayjs/locale/it"; import "dayjs/locale/pt-br"; import "dayjs/locale/sv"; @@ -16,6 +17,7 @@ import da from "~/i18n/locales/da/translation.json"; import en from "~/i18n/locales/en/translation.json"; import es from "~/i18n/locales/es/translation.json"; import fi from "~/i18n/locales/fi/translation.json"; +import fr from "~/i18n/locales/fr/translation.json"; import it from "~/i18n/locales/it/translation.json"; import pt_BR from "~/i18n/locales/pt_BR/translation.json"; import sv from "~/i18n/locales/sv/translation.json"; @@ -54,6 +56,12 @@ export const resources = { components: fi.components, permissions: fi.permissions, }, + fr: { + translation: fr.translation, + common: fr.common, + components: fr.components, + permissions: fr.permissions, + }, it: { translation: it.translation, common: it.common, @@ -83,12 +91,13 @@ export const resources = { // needs to be aligned with `resources` export const supportedLocales = [ { locale: "en", label: "English" }, - { locale: "cs", label: "Czech" }, - { locale: "da", label: "Danish" }, + { locale: "cs", label: "Čeština," }, + { locale: "da", label: "Dansk" }, { locale: "es", label: "Español" }, - { locale: "fi", label: "Finnish" }, + { locale: "fr", label: "Français" }, { locale: "it", label: "Italiano" }, { locale: "pt-BR", label: "Português (Brasil)" }, + { locale: "fi", label: "Suomalainen" }, { locale: "sv", label: "Svenska" }, { locale: "zh-CN", label: "中文(简化字)" }, ]; diff --git a/src/i18n/locales/cs/translation.json b/src/i18n/locales/cs/translation.json index 6c0935f631..fa52cedd64 100644 --- a/src/i18n/locales/cs/translation.json +++ b/src/i18n/locales/cs/translation.json @@ -60,7 +60,7 @@ "title": "Bluewallet", "page": { "title": "Připojit k BlueWallet", - "description": "V BlueWallet vyberte peněženku, kterou chcete připojit, otevřete ji, klikněte na ¨...¨, klikněte na Export/Záloha pro zobrazení QR kódu a tento kód naskenujte svou webkamerou." + "description": "V BlueWallet vyberte peněženku, kterou chcete připojit, otevřete ji, klikněte na ¨...¨, klikněte na Exportovat/Záloha pro zobrazení QR kódu a tento kód naskenujte svou webkamerou." }, "uri": { "label": "BlueWallet Export URI" @@ -119,7 +119,7 @@ "title": "Citadel", "page": { "title": "Připojení k uzlu <0>Citadel", - "instructions": "Aktuálně nefunguje, pokud je zapnutá dvoufaktorová autentizace (2FA)." + "instructions": "Aktuálně nefunguje v případě, že máte zapnutou dvoufaktorovou autentizaci (2FA)." }, "password": { "label": "Heslo k Citadel" @@ -133,7 +133,7 @@ "title": "Umbrel", "page": { "title": "Připojení k uzlu <0>Umbrel", - "instructions": "V dashboardu Umbrell běžte do <0>Připojit pěněženku (Connect Wallet). Vyberte <0>lndconnect REST a zkopírujte <0>lndconnect URL. (V závislosti na vašem nastavení můžete také využít lokálního připojení nebo připojení přes Tor.)" + "instructions": "V dashboardu Umbrell přejděte do <0>Připojit pěněženku (Connect Wallet). Vyberte volbu <0>lndconnect REST a zkopírujte <0>lndconnect URL. (V závislosti na vašem nastavení můžete využít buď lokálního spojení nebo připojení přes Tor.)" }, "rest_url": { "label": "lndconnect REST URL", @@ -144,7 +144,7 @@ "title": "myNode", "page": { "title": "Připojení k <0>myNode", - "instructions": "Na vaší domovské stránce myNode klikněte na tlačítko <0>Pěněženka (Wallet) vaší služby <0>lightning<1/>. Dále zvolte <0>Párovat peněženku (Pair Wallet) pod záložkou <0>Stav (Status). S dotázáním vložte své heslo.<1/> Z rozbalovací nabídky vyberte volbu párování. V závislosti na vašem nastavení můžete zvolit buď spojení přes <0>lightning (REST + Local IP) nebo <0>lightning (REST + Tor)." + "instructions": "Na vaší domovské stránce myNode klikněte na tlačítko <0>Pěněženka (Wallet) služby <0>lightning.<1/> Dále zvolte <0>Párovat peněženku (Pair Wallet) pod záložkou <0>Stav (Status). S dotázáním vložte vaše heslo.<1/> Z rozbalovací nabídky vyberte volbu párování. V závislosti na vašem nastavení můžete zvolit buď připojení přes <0>lightning (REST + Local IP) nebo <0>lightning (REST + Tor)." }, "rest_url": { "label": "lndconnect REST URL", @@ -155,7 +155,7 @@ "title": "Start9", "page": { "title": "Připojení k vašemu uzlu <0>Embassy", - "instructions": "<0>Poznámka: Aktuálně podporujeme pouze LND, ale v budoucnu budeme přidávat podporu c-lightning!<1/>Ve dashboardu vašeho Embassy zvolte službu <0>lightning network Daemon.<1/>Vyberte záložku <0>Vlastnosti (Properties).<1/>Následně zkopírujte <0>LND Connect REST URL." + "instructions": "<0>Pozn.: Aktuálně podporujeme pouze LND, ale v budoucnu plánujeme přidávat podporu c-lightning!<1/>V dashboardu vašeho Embassy zvolte službu <0>lightning network daemon.<1/>Vyberte záložku <0>Vlastnosti (Properties).<1/>Následně zkopírujte <0>LND Connect REST URL." }, "rest_url": { "label": "lndconnect REST URL", @@ -166,8 +166,8 @@ "title": "RaspiBlitz", "page": { "title": "Připojení k vašemu uzlu <0>RaspiBlitz", - "instructions1": "Budete potřebovat onion adresu, port a macaroon s oprávněním pro čtení a odesílání (například admin.macaroon) vašeho uzlu.<1/><1/><0>Připojte se přes SSH k vašemu <0>RaspiBlitz.<1/>Zadejte příkaz <0>sudo cat /mnt/hdd/tor/lndrest/hostname.<1/>Zkopírujte <0>.onion adresu a vložte ji do pole níže.<1/>K onion adrese přidejte <0>port, defaultní port je <0>:8080.", - "instructions2": "Vyberte <0>PŘIPOJIT (CONNECT).<1/>Vyberte <0>EXPORT.<1/>Vyberte hexadecimální format <0>HEX.<1/>Zkopírujte <0>adminMacaroon.<1/>Vložte ho do pole níže." + "instructions1": "Následujte tyto kroky:<1/> 1. <0>Připojte se přes SSH k vašemu <0>RaspiBlitz<1/>2. Vyberte <0>Připojit aplikace a zobrazit přístupové údaje (Connect Apps & Show Credentials) ze seznamu<1/><0/>3. Vyberte <0>Připojit Alby k tomuto uzlu<1/>4. Stiskněte <0>OKpro zobrazení detailů připojení<1/><1/>Zkopírujte <0>REST API nebo <0>.onion adresu pro připojení přes Tor a vložte ji do vstupního pole níže.", + "instructions2": "Zkopírujte (administrační) <0>macaroon do pole níže." }, "rest_api_host": { "label": "REST API host", @@ -264,7 +264,7 @@ }, "pairing_phrase": { "label": "Vaše párovací fráze ", - "placeholder": "tajná sats fráze" + "placeholder": "tajná fráze" } }, "kollider": { @@ -275,7 +275,7 @@ }, "page": { "title": "Připojení k vašemu účtu Kollider", - "description": "Nemáte ještě účet? <0>Vytvořte ho teď!" + "description": "Nemáte ještě účet? <0>Vytvořte ho!" }, "username": { "label": "Vložte vaše uživatelské jméno ke Kollider" @@ -322,14 +322,14 @@ "remove": { "confirm": "Jste si jisti, že chcete odstranit účet: {{name}}? \nTato operace nelze vzít zpět. Pokud jste tento účet používali k přihlašovaní k webovým stránkam, můžete k nim ztratit přístup.", "title": "Odstranit tento účet", - "subtitle": "Všechny propojené příspěvky budou smazány. Buďte si jisti." + "subtitle": "Všechny propojené příspěvky budou smazány. Buďte si jisti, že akci chcete opravdu provést." }, "nostr": { "errors": { "failed_to_load": "Nepodařilo se načíst Nostr klíč. Zadali jste validní Nostr klíč?" }, "generate_keys": { - "hint": "Můžete vygenerovat náhodný klíč nebo derivovat klíč ze svého účtu (použitím podepsané kanonické fráze). <0>Dozvědět se více »", + "hint": "Můžete vygenerovat nový náhodně generovaný klíč nebo derivovat klíč ze svého účtu (s využitím podepsané kanonické fráze). <0>Dozvědět se více »", "screen_reader": "Vygenerovat nový Nostr klíč pro váš účet", "actions": { "random_keys": "Vygenerovat náhodný klíč", @@ -339,16 +339,17 @@ }, "private_key": { "title": "Správa vašeho klíče", - "subtitle": "Vložte svůj privátní klíč nebo si vygenerujte nový. Ujistěte se, že máte svůj privátní klíč zazálohovaný předtím, než vygenerujete nový. <0>Dozvědět se více »", - "warning": "Tato akce odstraní váš starý privátní klíč. Jste si jisti?", + "subtitle": "Vložte svůj privátní klíč nebo si vygenerujte nový. Předtím, než budete generovat nový klíč, ujistěte se, že máte svůj klíč zazalohovaný. <0>Dozvědět se více »", + "warning": "Prosím vložte jméno vašeho účtu pro potvrzení smazání privátního klíče:", "success": "Privátní klíč byl úspěšně zašifrován a uložen.", "successfully_removed": "Privátní klíč byl odstraněn.", - "label": "Privátní klíč" + "label": "Privátní klíč", + "failed_to_remove": "Zadané jméno účtu se neshoduje, váš starý privátní klíč byl obnoven." }, "actions": { "generate": "Vygenerovat nový klíč" }, - "hint": "je jednoduchý otevřený protokol, jehož snahou je vytvořit necenzurovatelné sociální sítě. Nostr pracuje s kryptografickými klíči. Pro publikování jakékoliv zpravy přes tento protokol, je vždy nutné zprávu podepsat svým klíčem a odeslat ji několika relé. Můžete použít Alby ke správě svého Nostr klíče. Většina Nostr aplikací vám pak umožní jednoduché použití klíče přímo z doplňku Alby.", + "hint": "je jednoduchý otevřený protokol, jehož snahou je vytvořit necenzurovatelné sociální sítě. Nostr pracuje s kryptografickými klíči. Pro publikování jakékoliv zpravy přes tento protokol, je vždy nutné zprávu podepsat svým klíčem a odeslat ji několika tzv. relé. Alby můžete použít ke správě svého Nostr klíče. Většina Nostr aplikací vám pak umožní jednoduché použití klíče přímo z doplňku Alby.", "title": "Nostr", "public_key": { "label": "Veřejný klíč" @@ -559,7 +560,7 @@ }, "description": { "label": "Popisek", - "placeholder": "Např. kdo odesílá tuto platbu?" + "placeholder": "Např. kdo tuto platbu odesílá?" }, "success": "Platba přijata!", "payment": { @@ -577,7 +578,7 @@ "title": "Vaše ⚡ webové stránky", "description": "Webové stránky, na kterých jste v minulosti použili Alby", "no_info": "Vypadá to, že jste Alby ještě na žádné webové stránce nepoužili.", - "discover": "Objevit webové stránky" + "discover": "Prozkoumat webové stránky" }, "make_invoice": { "title": "Vytvořit fakturu", @@ -696,7 +697,7 @@ }, "discover": { "title": "Prozkoumejte ekosystém Lightningu ⚡️", - "description": "Webové stránky a aplikace, kde je možné používat Alby", + "description": "Webové stránky a aplikace, kde je možné Alby používat", "list": { "trading": "Obchodování", "gaming": "Hraní her", @@ -716,7 +717,7 @@ "description": "Pár tipů než začnete", "top_up_wallet": { "title": "⚡️ Dobít peněženku", - "description": "Vytvořte lightning fakturu, pošlete si nějaké bitcoiny a začněte používat Alby v ekosystému lightning", + "description": "Vytvořte lightning fakturu, pošlete si bitcoiny a začněte používat Alby v ekosystému lightning", "label1": "Přijmout Bitcoin", "label2": "Koupit Bitcoin" }, @@ -783,7 +784,7 @@ }, "confirm_password": "Potvrďte heslo", "accounts": "Účty", - "discover": "Objevit" + "discover": "Objevovat" }, "components": { "allowance_menu": { @@ -809,7 +810,7 @@ "stop_scanning": "Zastavit skenování" }, "errors": { - "allow_camera_access": "Prosím povolte přístup kamery na obrazovce nastavení." + "allow_camera_access": "Prosím povolte přístup kamery ve svém nastavení." } }, "transactionsTable": { @@ -837,15 +838,9 @@ "label": "Rozpočet" } }, - "companion_download_info": { - "description": "Snažíte se připojit k uzlu, který je za Tor. Aby toto bylo možné, musíte mít nainstalovanou aplikaci Alby companion nebo být připojeni k síti Tor. (Pokud si nejste jisti, doporučujeme použít aplikaci Alby companion.)", - "download_here": "Stáhněte si Alby companion zde!", - "using_tor": "klikněte zde pro pokračování, pokud používáte Tor Browser", - "or": "Nebo:" - }, "toasts": { "connection_error": { - "what_you_can_do": "Zde je, co můžete dělat:", + "what_you_can_do": "Co můžete dělat:", "double_check": "Znovu překontrolujte detaily spojení", "if_ssl_errors": "a pokud vidíte SSL chyby (například ERR_CERT_AUTHORITY_INVALID), klikněte na \"pokročilé\" a pokračujte přijetím certifikátu.", "visit_guides": "Navštivte naše návody pro další pomoc" diff --git a/src/i18n/locales/da/translation.json b/src/i18n/locales/da/translation.json index 04c9a6dac2..b63d3fc7ab 100644 --- a/src/i18n/locales/da/translation.json +++ b/src/i18n/locales/da/translation.json @@ -837,12 +837,6 @@ "label": "Budget" } }, - "companion_download_info": { - "description": "Du forsøger at oprette forbindelse til en node bag Tor. For at gøre dette, skal du enten installere Albys tillægs-app eller have Tor kørende. (Hvis du er i tvivl, anbefaler vi Albys tillægs-app.)", - "download_here": "Hent tillægget til Alby her!", - "using_tor": "klik her for at forstsætte, hvis du bruger Tor-browseren", - "or": "Eller:" - }, "toasts": { "connection_error": { "what_you_can_do": "Dette kan du gøre:", diff --git a/src/i18n/locales/de/translation.json b/src/i18n/locales/de/translation.json index 4668dd4df8..7f05bc7a68 100644 --- a/src/i18n/locales/de/translation.json +++ b/src/i18n/locales/de/translation.json @@ -9,7 +9,7 @@ }, "set_password": { "title": "Passwort zum Entsperren festlegen", - "description": "Die Daten deines Lightning Kontos sind mit einem Freischalt Passwort sicher verschlüsselt. Vergesse dieses Passwort nicht! Du benötigst es, um die Alby Erweiterung zu entsperren (in diesem Browser).", + "description": "Dieses Passwort wird verwendet, um deine Wallet zu schützen und den Zugriff auf die Browser-Erweiterung zu ermöglichen. Es kann nicht zurückgesetzt werden und ist unabhängig von Ihrem Alby Konto Passwort.", "choose_password": { "label": "Wähle ein Password zum Entsperren:" }, @@ -139,9 +139,9 @@ }, "raspiblitz": { "page": { - "instructions1": "Du benötigst deine Node-Onion-Adresse, Port und eine Macaroon mit Lese- und Sendeberechtigungen (z. B. admin.macaroon).<1/><1/><0>SSH in deinem <0>RaspiBlitz.<1/>Führe den Befehl <0>sudo cat /mnt/hdd/tor/lndrest/hostname aus.<1/>Kopiere die <0>.onion-Adresse und füge deine Eingabe unten ein .<1/>Füge deinen <0>Port nach der Onion-Adresse hinzu, der Standardport ist <0>:8080.", + "instructions1": "Folge diese Schritte:<1/> 1. <0>SSH in deinem <0>Raspiblitz<1/>2. Wähle <0>Connect Apps & Show Credentials aus der Liste<1/><0/>3. Wähle <0>Connect Alby to this node<1/>4. Drücke <0>OK, um die Verbindungsdaten anzuzeigen<1/><1/>Kopiere den <0>REST API-Host oder die <0>.onion-Adresse, um dich über Tor zu verbinden, und füge sie in das Feld darunter ein.", "title": "Verbinde dich mit deinem <0>RaspiBlitz Knoten", - "instructions2": "Wähle <0>VERBINDEN.<1/>Wähle <0>EXPORTIEREN.<1/>Wähle <0>HEX.<1/>Kopiere das <0>adminMacaroon.<1/>Füge die Makrone in die Eingabe unten ein." + "instructions2": "Kopiere (admin) <0>macaroon in die unten stehende Eingabe." }, "title": "RaspiBlitz", "rest_api_host": { @@ -390,7 +390,8 @@ }, "name": { "title": "Name", - "placeholder": "Geben Sie Ihren Namen ein" + "placeholder": "Geben Sie Ihren Namen ein", + "subtitle": "" }, "email": { "title": "E-Mail", @@ -447,11 +448,13 @@ "title": "Nostr", "private_key": { "title": "Verwalten von deinen Schlüssel", - "subtitle": "Füge deinen privaten Schlüssel ein oder erzeuge einen neuen. Stelle sicher, dass du deinen privaten Schlüssel sicherst, bevor du einen neuen Schlüssel generierst. <0>Mehr erfahren\"", - "warning": "Dadurch wird dein alter privater Schlüssel gelöscht. Bist du dir sicher?", + "subtitle": "Füge deinen privaten Schlüssel ein oder erzeuge einen neuen. <0>Mehr erfahren\"", + "warning": "Bitte gebe den Namen des Kontos ein, um die Löschung des privaten Schlüssels zu bestätigen:", "success": "Privater Schlüssel erfolgreich verschlüsselt und gespeichert.", "successfully_removed": "Privater Schlüssel erfolgreich entfernt.", - "label": "Privater Schlüssel" + "label": "Privater Schlüssel", + "failed_to_remove": "Der eingegebene Kontoname stimmt nicht überein, dein alter Privatname wurde wiederhergestellt.", + "backup": "Vergesse nicht, deinen privaten Schlüssel zu sichern! Wenn du deinen Schlüssel nicht sicherst, kannst du den Zugang verlieren." }, "public_key": { "label": "Öffentlicher Schlüssel" @@ -562,7 +565,37 @@ "content": "Auf dieser Website wirst du aufgefordert zu signieren:", "block_and_ignore": "Blockieren und Ignorieren von {{host}}", "block_added": "{{host}} zur Blockliste hinzugefügt, bitte lade deine Website neu.", - "allow_sign": "Erlaube dein {{host}} zu unterschreiben:" + "allow_sign": "Erlaube dein {{host}} zu unterschreiben:", + "view_details": "Details anzeigen", + "hide_details": "Details ausblenden", + "no_content": "(Ohne Inhalt)", + "kinds": { + "unknown": "nostr Ereignis der Art {{kind}}", + "0": "Metadaten", + "5": "Ereignislöschung", + "40": "Kanalbildung", + "41": "Kanal Metadaten", + "42": "Kanalmeldung", + "43": "Kanal verstecke Nachrichten", + "44": "Kanal stummschalten Benutzer", + "10002": "Metadaten der Relaisliste", + "30078": "anwendungsspezifische Daten", + "22242": "Client Authentifizierung", + "7": "Reaktion", + "9734": "Zappanfrage", + "9735": "zap", + "2": "Relais empfehlen", + "1": "kurze Textnotiz", + "3": "Kontakte", + "4": "verschlüsselte Direktnachrichten", + "8": "Abzeichenverleihung", + "1984": "Berichterstattung", + "24133": "nostr verbinden", + "30008": "Profilabzeichen", + "30009": "Ausweisdefinition", + "30023": "Langform Inhalte" + }, + "allow_sign_event": "Erlaube {{host}}, eine {{kind}} zu unterzeichnen:" }, "confirm_request_permission": { "title": "Antrag genehmigen", @@ -640,11 +673,11 @@ "label": "Email Adresse" } }, - "login_account": "Melden dich an, um dein bestehendes Alby-Konto zu verbinden.", + "login_account": "Melde dich an, um dein bestehendes Alby-Konto zu verbinden.", "host_wallet": "Wir hosten die Lightning Wallet für dich!", "optional_lightning_note": { "part3": ". Dies ist eine einfache Möglichkeit für jeden, dir Bitcoin über das Lightning-Netzwerk zu senden.", - "part1": "Ihr Alby-Konto enthält außerdem ein optionales", + "part1": "Dein Alby-Konto enthält außerdem ein optionales", "part2": "Lightning Adresse", "part4": "mehr erfahren" }, @@ -660,7 +693,7 @@ "create_wallet_error2": "Wenn du Hilfe benötigst, wende dich bitte an support@getalby.com" }, "forgot_password": "Passwort vergessen?", - "title": "Dein Alby Konto", + "title": "Dein Alby-Konto", "set_password": { "choose_password": { "label": "Password" @@ -684,12 +717,12 @@ "connect": "Verbinden" }, "alby": { - "title": "Alby", - "description": "Melden dich an oder nutze dein bestehendes Alby-Konto, um im Handumdrehen eine Lightning Zahlung zu beginnen.", + "title": "Alby Konto", + "description": "Melde dich an oder verwende dein bestehendes Alby-Konto, um im Handumdrehen mit Lightningzahlungen zu beginnen.", "create_new": "Anmelden" }, "title": "Verbinden", - "description": "Um Alby für Online-Zahlungen zu nutzen, verbinde deine Lightning Wallet mit der Erweiterung." + "description": "Um mit der Verwendung der Alby Erweiterung zu beginnen, verbinde deine Lightning Wallet." }, "discover": { "description": "Websites und Webapplikationen, auf denen du Alby verwenden kannst", @@ -729,6 +762,11 @@ "description1": "<0>Um einfach auf Alby zuzugreifen, klicke auf das Erweiterungssymbol <1/> <2>in der oberen rechten Ecke Ihres Browsers" } } + }, + "transactions": { + "title": "Transaktionen", + "description": "Ausgehende Transaktionen über alle deine Konten", + "list_empty": "Noch keine Transaktionen verfügbar." } }, "components": { @@ -761,10 +799,16 @@ } }, "companion_download_info": { - "using_tor": "Klicke hier zum Weitermachen, wenn du den TOR Browser verwendest", - "description": "Du versuchst, dich mit einem Knoten hinter Tor zu verbinden. Dazu muss entweder die Alby Companion App installiert oder Tor ausgeführt werden. (Wenn du dir nicht sicher bist, empfehlen wir die Alby Companion App.)", - "download_here": "Lade dein Alby-Begleiter hier herunter!", - "or": "Oder:" + "download": "Download", + "companion": { + "title": "Begleitende App", + "description": "Leichte Anwendung, die deinem Browser mit dem TOR-Netzwerk verbindet." + }, + "tor_native": { + "title": "TOR (native)", + "description": "Wähle diese Option, wenn dieser Browser bereits mit dem TOR-Netzwerk verbunden ist." + }, + "heading": "Wie willst du dich mit dem TOR-Netzwerk verbinden?" }, "allowance_menu": { "edit_allowance": { @@ -863,7 +907,8 @@ "save": "Speichern", "copy": "Kopieren", "remember": "Denke an meine Wahl und frage nicht noch einmal", - "receive_again": "Eine weitere Zahlung erhalten" + "receive_again": "Eine weitere Zahlung erhalten", + "transactions": "Transaktionen" }, "discover": "Entdecken", "errors": { @@ -873,7 +918,13 @@ "message": "Nachricht", "response": "Antwort", "success_message": "{{amount}}{{fiatAmount}} gesendet an {{destination}}", - "accounts": "Konten" + "accounts": "Konten", + "range": { + "between": "zwischen {{min}} und {{max}}", + "lessThan": "< {{max}}", + "greaterThan": "> {{min}}" + }, + "transactions": "Transaktionen" }, "permissions": { "commando": { @@ -927,7 +978,9 @@ "decodepayreq": "Entschlüssel eine Zahlungsanforderungszeichenfolge.", "addinvoice": "Erstelle neue Rechnungen.", "listpayments": "Erhalte eine Liste aller ausgehenden Zahlungen.", - "verifymessage": "Überprüfe eine Signatur über eine Nachricht." + "verifymessage": "Überprüfe eine Signatur über eine Nachricht.", + "addholdinvoice": "Erstelle eine neue HODL-Rechnungen.", + "settleinvoice": "Begleiche eine akzeptierte Rechnung." }, "nostr": { "getpublickey": "Lese deinen öffentlichen Schlüssel.", @@ -957,7 +1010,9 @@ "listinvoices": "Erhalte eine Liste aller Rechnungen.", "channelbalance": "Erhalte einen Bericht über den Gesamtbetrag der Mittel für alle offenen Kanäle.", "walletbalance": "Ermittel die gesamten nicht verbrauchten Ausgaben deiner Wallet.", - "openchannel": "Öffne einen neuen Kanal." + "openchannel": "Öffne einen neuen Kanal.", + "addholdinvoice": "Erstelle eine neue HODL-Rechnungen.", + "settleinvoice": "Begleiche eine akzeptierte Rechnung." } } } diff --git a/src/i18n/locales/en/translation.json b/src/i18n/locales/en/translation.json index de9cf26401..f45133520b 100644 --- a/src/i18n/locales/en/translation.json +++ b/src/i18n/locales/en/translation.json @@ -10,7 +10,7 @@ }, "set_password": { "title": "Set an unlock password", - "description": "This password is used to protect your wallet and provide access to the browser extension. It cannot be reset and is separate from your Alby account password.", + "description": "This password is used to protect your wallet and provide access to the browser extension. It cannot be reset and is separate from your Alby Account password.", "choose_password": { "label": "Choose an unlock password:" }, @@ -37,10 +37,10 @@ }, "choose_path": { "title": "Connect", - "description": "To start using Alby to make online payments, connect your lightning wallet to the extension.", + "description": "To start using the Alby Extension, connect your lightning wallet.", "alby": { - "title": "Alby", - "description": "Sign up or use your existing Alby account to get started with lightning payments in no time.", + "title": "Alby Account", + "description": "Sign up or use your existing Alby Account to get started with lightning payments in no time.", "create_new": "Sign up" }, "other": { @@ -66,9 +66,9 @@ } }, "forgot_password": "Forgot password?", - "title": "Your Alby account", - "create_account": "Create a new Alby account to send and receive bitcoin payments.", - "login_account": "Log in to connect your existing Alby account.", + "title": "Your Alby Account", + "create_account": "Create a new Alby Account to send and receive bitcoin payments.", + "login_account": "Log in to connect your existing Alby Account.", "host_wallet": "We host a Lightning wallet for you!", "email": { "create": { @@ -79,7 +79,7 @@ } }, "optional_lightning_note": { - "part1": "Your Alby account also comes with an optional", + "part1": "Your Alby Account also comes with an optional", "part2": "lightning address", "part3": ". This is a simple way for anyone to send you bitcoin on the lightning network.", "part4": "learn more" @@ -397,7 +397,8 @@ "hint": "is a simple and open protocol that aims to create censorship-resistant social networks. Nostr works with cryptographic keys. To publish something you sign it with your key and send it to multiple relays. You can use Alby to manage your Nostr key. Many Nostr applications will then allow you to simply use the key from the Alby extension.", "private_key": { "title": "Manage your key", - "subtitle": "Paste your private key or generate a new one. Make sure you backup your private key before you generate a new one. <0>Learn more »", + "subtitle": "Paste your private key or generate a new one. <0>Learn more »", + "backup": "⚠️ Don't forget to back up your private key! Not backing up your key might result in losing access.", "warning": "Please enter the name of the account to confirm the deletion of the private key:", "success": "Private key encrypted & saved successfully.", "failed_to_remove": "The entered account name didn't match, your old private has been restored.", @@ -731,8 +732,43 @@ "allow": "Allow this website to:", "content": "This website asks you to sign:", "allow_sign": "Allow {{host}} to sign:", + "allow_sign_event": "Allow {{host}} to sign a {{kind}}:", + "view_details": "View details", + "hide_details": "Hide details", + "no_content": "(No content)", "block_and_ignore": "Block and ignore {{host}}", - "block_added": "Added {{host}} to the blocklist, please reload the website." + "block_added": "Added {{host}} to the blocklist, please reload the website.", + "kinds": { + "unknown": "nostr event of kind {{kind}}", + "0": "metadata", + "1": "short text note", + "2": "recommend relay", + "3": "contacts", + "4": "encrypted direct messages", + "5": "event deletion", + "7": "reaction", + "8": "badge award", + "40": "channel creation", + "41": "channel metadata", + "42": "channel message", + "43": "channel hide message", + "44": "channel mute user", + "1984": "reporting", + "9734": "zap request", + "9735": "zap", + "10002": "relay list metadata", + "22242": "client authentication", + "24133": "nostr connect", + "30008": "profile badges", + "30009": "badge definition", + "30023": "long-form content", + "30078": "application-specific data" + } + }, + "transactions": { + "title": "Transactions", + "description": "Outgoing transactions across all of your accounts", + "list_empty": "No transactions available yet." } }, "common": { @@ -745,6 +781,7 @@ "accounts": "Accounts", "discover": "Discover", "websites": "Websites", + "transactions": "Transactions", "sats_one": "sat", "sats_other": "sats", "loading": "loading", @@ -774,6 +811,7 @@ "save": "Save", "receive": "Receive", "receive_again": "Receive another payment", + "transactions": "Transactions", "close": "Close", "export": "Export", "remove": "Remove", @@ -784,6 +822,11 @@ "errors": { "connection_failed": "Connection failed", "payment_failed": "Payment Failed" + }, + "range": { + "between": "between {{min}} and {{max}}", + "lessThan": "< {{max}}", + "greaterThan": "> {{min}}" } }, "components": { @@ -839,10 +882,16 @@ } }, "companion_download_info": { - "description": "You are trying to connect to a node behind Tor. To do this you either need to have the Alby companion app installed or have Tor running. (When you're unsure, we recommend the Alby companion app.)", - "download_here": "Download the Alby companion here!", - "using_tor": "click here to continue if you use the Tor Browser", - "or": "Or:" + "heading": "How do you want to connect to the TOR network?", + "download": "Download", + "companion": { + "title": "Companion App", + "description": "Lightweight app that connects your browser to the TOR network." + }, + "tor_native": { + "title": "TOR (native)", + "description": "Select this option if this browser is already connected to the TOR network." + } }, "toasts": { "connection_error": { @@ -937,7 +986,9 @@ "sendtoroute": "Make a payment via the specified route.", "decodepayreq": "Decode a payment request string.", "routermc": "Read the internal mission control state.", - "addinvoice": "Create new invoices." + "addinvoice": "Create new invoices.", + "addholdinvoice": "Create new HODL invoices.", + "settleinvoice": "Settle an accepted invoice." }, "lnc": { "getinfo": "Get the node information.", @@ -961,7 +1012,9 @@ "sendtoroute": "Make a payment via the specified route.", "decodepayreq": "Decode a payment request string.", "routermc": "Read the internal mission control state.", - "addinvoice": "Create new invoices." + "addinvoice": "Create new invoices.", + "addholdinvoice": "Create new HODL invoices.", + "settleinvoice": "Settle an accepted invoice." } } } diff --git a/src/i18n/locales/eo/translation.json b/src/i18n/locales/eo/translation.json index 0e9671a00b..aec3b273b2 100644 --- a/src/i18n/locales/eo/translation.json +++ b/src/i18n/locales/eo/translation.json @@ -630,12 +630,6 @@ "label": "Buĝeto" } }, - "companion_download_info": { - "description": "", - "download_here": "", - "using_tor": "", - "or": "Aŭ:" - }, "toasts": { "connection_error": { "what_you_can_do": "", diff --git a/src/i18n/locales/es/translation.json b/src/i18n/locales/es/translation.json index 5a830aa150..99ef2ea727 100644 --- a/src/i18n/locales/es/translation.json +++ b/src/i18n/locales/es/translation.json @@ -9,7 +9,7 @@ }, "set_password": { "title": "Proteja su billetera", - "description": "Esta contraseña se utiliza para proteger tu billetera y darte acceso a la extensión del navegador. No se puede restablecer y es independiente de la contraseña de tu cuenta de Alby.", + "description": "Esta contraseña se utiliza para proteger su monedero y proporcionar acceso a la extensión del navegador. No se puede restablecer y es independiente de la contraseña de su cuenta de Alby.", "choose_password": { "label": "Elige una contraseña:" }, @@ -138,8 +138,8 @@ "title": "Cuenta RaspiBlitz", "page": { "title": "Conecta tu nodo <0>RaspiBlitz", - "instructions2": "Selecciona <0>CONECTAR.<1/>Selecciona <0>EXPORTAR.<1/>Selecciona <0>HEX.<1/>Copia el <0>adminMacaroon.<1/>Pega el macarrón en la entrada de abajo.", - "instructions1": "Necesita la dirección onion de su nodo, el puerto y un macarrón con permisos de lectura y envío (por ejemplo, admin.macaroon).<1/><1/><0>SSH en su <0>RaspiBlitz .<1/>Ejecute el comando <0>sudo cat /mnt/hdd/tor/lndrest/hostname.<1/>Copie y pegue la dirección <0>.onion en la entrada a continuación .<1/>Agregue su <0>puerto después de la dirección onion, el puerto predeterminado es <0>:8080." + "instructions2": "Copie el (admin) <0>macaroon en la entrada de abajo.", + "instructions1": "Siga estos pasos:<1/> 1. <0>SSH en su <0>Raspiblitz<1/>2. Seleccione <0>Conectar aplicaciones y mostrar credenciales de la lista<1/><0/>3. Elija <0>Conectar Alby a este nodo<1/>4. Pulsa <0>Aceptar para mostrar las credenciales de conexión<1/><1/>Copia y pega el <0>host API REST o la dirección <0>.onion para conectarte a través de Tor en la entrada de abajo." }, "rest_api_host": { "label": "Host de la API REST", @@ -328,8 +328,10 @@ "successfully_removed": "Clave privada eliminada con éxito.", "label": "Clave Privada", "title": "Administra tu clave", - "subtitle": "Pegue su clave privada o genere una nueva. Asegúrese de hacer una copia de seguridad de su clave privada antes de generar una nueva. <0>Más información »", - "warning": "Esto eliminará su antigua clave privada. ¿Desea continuar?" + "subtitle": "Pega tu clave privada o genera una nueva. <0>Más información \"", + "warning": "Introduzca el nombre de la cuenta para confirmar la eliminación de la clave privada:", + "failed_to_remove": "El nombre de cuenta introducido no coincide, tu antiguo privado ha sido restaurado.", + "backup": "⚠️ ¡No olvides hacer una copia de seguridad de tu clave privada! Si no haces una copia de seguridad de tu clave puedes perder el acceso." }, "public_key": { "label": "Clave Pública" @@ -612,11 +614,11 @@ }, "choose_path": { "title": "Conectar", - "description": "Para comenzar a usar Alby y realizar pagos en línea, conecta tu billetera Lightning a la extensión.", + "description": "Para empezar a utilizar la Extensión de Alby, conecta tu monedero lightning.", "alby": { - "title": "Alby", + "title": "Cuenta de Alby", "create_new": "Regístrate", - "description": "Regístrate o usa tu cuenta existente de Alby para empezar con pagos lightning en poco tiempo." + "description": "Regístrate o usa tú cuenta de Alby existente para empezar a realizar pagos relámpago en un abrir y cerrar de ojos." }, "other": { "title": "Otras Billeteras", @@ -631,7 +633,37 @@ "content": "Este sitio web te solicita firmar:", "allow_sign": "Permitir que {{host}} firme:", "block_and_ignore": "Bloquear e ignorar {{host}}", - "block_added": "Se agregó {{host}} a la lista de bloqueados, vuelva a cargar el sitio web." + "block_added": "Se agregó {{host}} a la lista de bloqueados, vuelva a cargar el sitio web.", + "allow_sign_event": "Permitir que {{host}} firme un {{kind}}:", + "view_details": "Más información", + "hide_details": "Ocultar los detalles", + "no_content": "(Sin contenido)", + "kinds": { + "unknown": "nostr evento del tipo {{kind}}", + "0": "metadatos", + "1": "nota corta de texto", + "2": "Recomendar un relé", + "3": "contactos", + "7": "reacción", + "8": "concesión de distintivo", + "40": "creación del canal", + "41": "metadatos del canal", + "42": "mensaje del canal", + "43": "ocultar mensaje del canal", + "44": "silenciar a un usuario del canal", + "9734": "solicitud de eliminación", + "9735": "borrar", + "10002": "metadatos de la lista de relés", + "22242": "autenticación del cliente", + "24133": "conectarse a nostr", + "30008": "distintivos del perfil", + "30023": "contenidos largos", + "30078": "datos específicos de la aplicación", + "5": "borrado de eventos", + "4": "mensajes directos cifrados", + "1984": "reportando", + "30009": "definición del distintivo" + } }, "discover": { "title": "Explora el Ecosistema ⚡️ Lightning", @@ -685,13 +717,13 @@ "create_wallet_error": "Error al iniciar sesión o crear una cuenta nueva. Si necesita ayuda, por favor contacte support@getalby.com" }, "forgot_password": "¿Olvidó su contraseña?", - "create_account": "Cree una nueva cuenta Alby para enviar y recibir pagos de bitcoin.", - "login_account": "Inicie sesión para conectar su cuenta de Alby existente.", + "create_account": "Crea una nueva Cuenta de Alby para enviar y recibir pagos en bitcoin.", + "login_account": "Inicia sesión para conectar tú cuenta de Alby existente.", "optional_lightning_note": { "part2": "dirección lightning", "part4": "aprende más", "part3": ". Este es un modo simple para que cualquiera te envie Bitcoin en la red lightning.", - "part1": "Su cuenta de Alby también viene con una opción" + "part1": "Tú cuenta de Alby también viene con una opción" }, "set_password": { "choose_password": { @@ -706,7 +738,7 @@ "mismatched_password": "Las contraseñas no coinciden." } }, - "title": "Tu cuenta Alby", + "title": "Tu cuenta de Alby", "optional_lightning_address": { "label": "Elige tu Dirección Lightning (opcional)", "title": "números y letras, al menos 4 caracteres", @@ -732,6 +764,11 @@ "amount": { "label": "Cantidad (Satoshi)" } + }, + "transactions": { + "title": "Transacciones", + "description": "Transacciones salientes en todas sus cuentas", + "list_empty": "Todavía no hay transacciones disponibles." } }, "common": { @@ -768,7 +805,8 @@ "back": "Volver", "receive_again": "Recibir otro pago", "log_in": "Iniciar Sesión", - "remember": "Recordar mi elección y no preguntar nuevamente" + "remember": "Recordar mi elección y no preguntar nuevamente", + "transactions": "Transacciones" }, "errors": { "connection_failed": "Error de conexión", @@ -783,7 +821,13 @@ "accounts": "Cuentas", "discover": "Descubrir", "response": "Respuesta", - "help": "Ayuda" + "help": "Ayuda", + "range": { + "between": "entre el {{min}} y el {{max}}", + "lessThan": "menor que {{max}}", + "greaterThan": "mayor que {{min}}" + }, + "transactions": "Transacciones" }, "components": { "allowance_menu": { @@ -837,12 +881,6 @@ "label": "Presupuesto" } }, - "companion_download_info": { - "description": "Estás intentando conectarte a un nodo detrás de Tor. Para hacer esto, necesitas tener instalada la aplicación Alby companion o tener Tor en ejecución. (Cuando no esté seguro, le recomendamos la aplicación complementaria Alby.)", - "download_here": "¡Descargue el compañero Alby aquí!", - "using_tor": "haz clic aquí para continuar si utilizas el navegador Tor", - "or": "O:" - }, "toasts": { "connection_error": { "what_you_can_do": "Esto es lo que puedes hacer:", @@ -876,6 +914,18 @@ "active": "ACTIVO", "auth": "INICIAR SESIÓN" } + }, + "companion_download_info": { + "download": "Descargar", + "companion": { + "title": "Aplicación complementaria", + "description": "Aplicación ligera que conecta tu navegador a la red TOR." + }, + "tor_native": { + "title": "TOR (nativa)", + "description": "Seleccione esta opción si este navegador ya está conectado a la red TOR." + }, + "heading": "¿Cómo quieres conectarte a la red TOR?" } }, "permissions": { @@ -936,7 +986,9 @@ "sendtoroute": "Realizar un pago a través de la ruta especificada.", "decodepayreq": "Decodificar una cadena de solicitud de pago.", "verifymessage": "Verificar una firma sobre un mensaje.", - "routermc": "Lea el estado de control de la misión interna." + "routermc": "Lea el estado de control de la misión interna.", + "settleinvoice": "Pagar una factura aceptada.", + "addholdinvoice": "Crear nuevas facturas HODL." }, "lnc": { "getinfo": "Obtener la información del nodo.", @@ -960,7 +1012,9 @@ "listchannels": "Obtener una descripción de todos los canales abiertos.", "decodepayreq": "Decodificar una cadena de solicitud de pago.", "verifymessage": "Verificar una firma sobre un mensaje.", - "routermc": "Lea el estado de control de la misión interna." + "routermc": "Lea el estado de control de la misión interna.", + "addholdinvoice": "Crear nuevas facturas HODL.", + "settleinvoice": "Pagar una factura aceptada." } } } diff --git a/src/i18n/locales/fi/translation.json b/src/i18n/locales/fi/translation.json index 142003d1ca..784e83a528 100644 --- a/src/i18n/locales/fi/translation.json +++ b/src/i18n/locales/fi/translation.json @@ -630,12 +630,6 @@ "label": "Budjetti" } }, - "companion_download_info": { - "description": "Yrität muodostaa yhteyden Torin takana olevaan solmuun. Tätä varten sinulla on oltava joko asennettuna Alby companion -sovellus tai Tor käynnissä. (Kun olet epävarma, suosittelemme Alby companion -sovellusta.)", - "download_here": "Lataa Alby companion täältä!", - "using_tor": "klikkaa tästä jatkaaksesi, jos käytät Tor-selainta", - "or": "Tai:" - }, "toasts": { "connection_error": { "what_you_can_do": "Voit tehdä näin:", diff --git a/src/i18n/locales/fr/translation.json b/src/i18n/locales/fr/translation.json index 2e84a7c21e..74550abfa0 100644 --- a/src/i18n/locales/fr/translation.json +++ b/src/i18n/locales/fr/translation.json @@ -9,13 +9,13 @@ "done": "Fait" }, "set_password": { - "title": "Saisissez votre mot de passe", - "description": "Ce mot de passe est utilisé pour protéger votre portefeuille et vous donner accès à l'extension du navigateur. Il ne peut être changé et est différent du mot de passe de votre compte Alby.", + "title": "Définir un mot de passe de déverrouillage", + "description": "Ce mot de passe est utilisé pour protéger votre portefeuille et donner accès à l'extension du navigateur. Il ne peut pas être réinitialisé et est distinct du mot de passe de votre compte Alby.", "choose_password": { - "label": "Choisissez un mot de passe de déverrouillage:" + "label": "Choisissez un mot de passe de déverrouillage :" }, "confirm_password": { - "label": "Confimez que ce que vous avez écrit est correct:" + "label": "Confirmons que vous l'avez tapé correctement :" }, "errors": { "enter_password": "S'il vous plait, entrez votre mot de passe.", @@ -27,940 +27,940 @@ "ready": "Parfait, vous êtes prêt !", "initializing": "Création de votre compte. S'il vous plait, veuillez patienter, ceci peut prendre une minute...", "connection_error": "Erreur de connexion", - "review_connection_details": "", - "connection_taking_long": "", - "contact_support": "", + "review_connection_details": "Veuillez vérifier vos informations de connexion.", + "connection_taking_long": "Essayer de se connecter prend plus de temps que prévu... Vos informations sont-elles correctes ? Votre nœud est-il accessible ?", + "contact_support": "Si vous avez besoin d'aide, veuillez contacter support@getalby.com", "actions": { - "delete_edit_account": "" + "delete_edit_account": "Supprimer le compte invalide et modifier à nouveau" } } }, "choose_path": { - "title": "", - "description": "", + "title": "Connecter", + "description": "Pour commencer à utiliser Alby pour effectuer des paiements en ligne, connectez votre Lightning wallet à l'extension.", "alby": { - "title": "", - "description": "", - "create_new": "" + "title": "Alby", + "description": "Inscrivez-vous ou utilisez votre compte Alby existant pour commencer à utiliser les paiements éclair en un rien de temps.", + "create_new": "S'inscrire" }, "other": { - "title": "", - "description": "", - "and_more": "", - "connect": "" + "title": "Autres portefeuilles", + "description": "Connectez-vous à votre portefeuille ou nœud Lightning et choisissez parmi différents connecteurs.", + "and_more": "& plus...", + "connect": "Connecter" } }, "alby": { "pre_connect": { "set_password": { "choose_password": { - "label": "" + "label": "Mot de passe" }, "confirm_password": { - "label": "" + "label": "Confirmez le mot de passe" }, "errors": { - "enter_password": "", - "confirm_password": "", - "mismatched_password": "" + "enter_password": "Veuillez entrer un mot de passe.", + "confirm_password": "Veuillez confirmer votre mot de passe.", + "mismatched_password": "Les mots de passe ne correspondent pas." } }, - "forgot_password": "", - "title": "", - "create_account": "", - "login_account": "", - "host_wallet": "", + "forgot_password": "Mot de passe oublié?", + "title": "Votre compte Alby", + "create_account": "Créez un nouveau compte Alby pour envoyer et recevoir des paiements en bitcoins.", + "login_account": "Connectez-vous pour connecter votre compte Alby existant.", + "host_wallet": "Nous hébergeons un portefeuille Lightning pour vous !", "email": { "create": { - "label": "" + "label": "Adresse e-mail" }, "login": { - "label": "" + "label": "Adresse e-mail ou adresse Lightning" } }, "optional_lightning_note": { - "part1": "", - "part2": "", - "part3": "", - "part4": "" + "part1": "Votre compte Alby est également livré avec une option", + "part2": "adresse lightning", + "part3": ". C'est un moyen simple pour quiconque de vous envoyer des bitcoins sur le réseau Lightning.", + "part4": "apprendre encore plus" }, "optional_lightning_address": { - "label": "", - "suffix": "", - "title": "" + "label": "Choisissez votre adresse Lightning (facultatif)", + "suffix": "@getalby.com", + "title": "chiffres et lettres, au moins 4 caractères" }, "errors": { - "create_wallet_error": "", - "create_wallet_error1": "", - "create_wallet_error2": "" + "create_wallet_error": "Impossible de se connecter ou de créer un nouveau compte. Si vous avez besoin d'aide, veuillez contacter support@getalby.com", + "create_wallet_error1": "Impossible de se connecter ou de créer un nouveau compte.", + "create_wallet_error2": "Si vous avez besoin d'aide, veuillez contacter support@getalby.com" } } }, "choose_connector": { - "title": "", - "description": "", + "title": "Connecter le portefeuille Lightning", + "description": "Connectez-vous à votre portefeuille ou nœud Lightning externe", "lnd": { - "title": "", + "title": "LND", "page": { - "title": "", - "description": "" + "title": "Connectez-vous à votre nœud LND", + "description": "Vous avez besoin de l'URL de votre nœud et d'un macaroon avec des autorisations de lecture et d'envoi (par exemple, admin.macaroon )" }, "url": { - "label": "", - "placeholder": "" + "label": "REST API host et port", + "placeholder": "https://url-de-votre-node:8080" }, "macaroon": { - "label": "" + "label": "Macaroon (format HEX )" }, - "or": "", - "drag_and_drop": "", + "or": "OR", + "drag_and_drop": "Faites glisser et déposez votre macaroon ici ou <0>naviguez", "errors": { - "connection_failed": "" + "connection_failed": "La connexion a échoué. Vos informations d'identification LND sont-elles correctes ?" } }, "lnc": { - "title": "", + "title": "LND avec LNC", "page": { - "title": "", - "description": "" + "title": "Connectez-vous à votre nœud LND", + "description": "Créez une nouvelle session dans le terminal (litd) pour obtenir une nouvelle phrase d'appariement et entrez-la ici" }, "pairing_phrase": { - "label": "", - "placeholder": "" + "label": "Votre phrase d'appariement ", + "placeholder": "phrase de sats de pile secrète" } }, "lndhub_bluewallet": { - "title": "", + "title": "Bluewallet", "page": { - "title": "", - "description": "" + "title": "Connectez-vous à BlueWallet", + "description": "Dans BlueWallet, choisissez le wallet que vous souhaitez connecter, ouvrez-le, cliquez sur \"...\", cliquez sur Export/Backup pour afficher le QR code et scannez-le avec votre webcam." }, "uri": { - "label": "" + "label": "URI d'exportation BlueWallet" }, "errors": { - "invalid_uri": "", - "connection_failed": "" + "invalid_uri": "URI BlueWallet non valide", + "connection_failed": "La connexion a échoué. Votre URI BlueWallet est-il correct ?" } }, "lndhub_go": { - "title": "", + "title": "LNDHub", "page": { - "title": "", - "description": "" + "title": "Connectez-vous à LNDHub", + "description": "Saisissez ici l'URI de votre identifiant LNDHub ou scannez le code QR avec votre webcam." }, "uri": { - "label": "" + "label": "URI d'exportation LNDHub" }, "errors": { "invalid_uri": "", - "connection_failed": "" + "connection_failed": "La connexion a échoué. Votre URI LNDHub est-elle correcte ?" } }, "lnbits": { - "title": "", + "title": "LNbits", "page": { - "title": "", - "instructions": "" + "title": "Connectez-vous à <0>LNbits", + "instructions": "Dans LNbits, choisissez le portefeuille que vous souhaitez connecter, ouvrez-le, cliquez sur API Info et copiez la clé d'administration. Collez-le ci-dessous :" }, "admin_key": { - "label": "", - "placeholder": "" + "label": "Clé d'administration LNbits", + "placeholder": "Votre clé d'administrateur à 32 chiffres" }, "url": { - "label": "" + "label": "URL LNbits" }, "errors": { - "connection_failed": "" + "connection_failed": "La connexion a échoué. Disposez-vous de l'URL et de la clé d'administration correctes ?" } }, "eclair": { - "title": "", + "title": "Eclair", "page": { - "title": "", - "instructions": "" + "title": "Connectez-vous à <0>Eclair", + "instructions": "Vous avez besoin de votre URL et de votre mot de passe Eclair." }, "password": { - "label": "" + "label": "Mot de passe Eclair" }, "url": { - "label": "", - "placeholder": "" + "label": "URL de l'éclair", + "placeholder": "http://localhost:8080" } }, "citadel": { - "title": "", + "title": "Citadelle", "page": { - "title": "", - "instructions": "" + "title": "Connectez-vous au nœud <0>Citadelle", + "instructions": "Cela ne fonctionne pas actuellement si 2FA est activé." }, "password": { - "label": "" + "label": "Mot de passe Citadelle" }, "url": { - "label": "", - "placeholder": "" + "label": "URL de la Citadelle", + "placeholder": "http://citadel.local" } }, "umbrel": { - "title": "", + "title": "Parapluie", "page": { - "title": "", - "instructions": "" + "title": "Connectez-vous au nœud <0>Umbrel", + "instructions": "Dans votre tableau de bord Umbrel, accédez à <0>Connect Wallet. Sélectionnez <0>lndconnect REST et copiez l'<0>URL lndconnect. (Selon votre configuration, vous pouvez utiliser la connexion locale ou la connexion Tor.)" }, "rest_url": { - "label": "", - "placeholder": "" + "label": "lndconnect REST URL", + "placeholder": "lndconnect://votrenode:8080?..." } }, "mynode": { - "title": "", + "title": "monNode", "page": { - "title": "", - "instructions": "" + "title": "Connectez-vous à <0>monNode", + "instructions": "Sur votre page d'accueil myNode, cliquez sur le bouton <0>Wallet pour votre service <0>lightning.<1/> Cliquez maintenant sur le bouton <0>Pair Wallet sous le <0 Onglet >État. Saisissez votre mot de passe lorsque vous y êtes invité.<1/> Sélectionnez le menu déroulant et choisissez une option de couplage. Selon votre configuration, vous pouvez soit utiliser la connexion <0>lightning (REST + Local IP) ou la connexion <0>lightning (REST + Tor)." }, "rest_url": { - "label": "", - "placeholder": "" + "label": "URL REST lndconnect", + "placeholder": "lndconnect://votrenode:8080?..." } }, "start9": { - "title": "", + "title": "Start9", "page": { - "title": "", - "instructions": "" + "title": "Connectez-vous à votre nœud <0>Embassy", + "instructions": "<0>Remarque : Actuellement, nous ne prenons en charge que LND, mais nous ajouterons la prise en charge de c-lightning à l'avenir !<1/>Sur votre tableau de bord Embassy, cliquez sur le service <0>daemon du réseau Lightning. <1/>Sélectionnez l'onglet <0>Properties.<1/>Copiez maintenant l'<0>URL REST LND Connect." }, "rest_url": { - "label": "", - "placeholder": "" + "label": "URL REST lndconnect", + "placeholder": "lndconnect://votrenoeud:8080?..." } }, "raspiblitz": { - "title": "", + "title": "RaspiBlitz", "page": { - "title": "", - "instructions1": "", - "instructions2": "" + "title": "Connectez-vous à votre nœud <0>RaspiBlitz", + "instructions1": "Suivez ces étapes :<1/> 1. <0>SSH dans votre <0>Raspiblitz<1/>2. Sélectionnez <0>Connect Apps & Show Credentials dans la liste<1/><0/>3. Choisissez <0>Connecter Alby à ce nœud<1/>4. Appuyez sur <0>OK pour afficher les identifiants de connexion<1/><1/>Copiez et collez l'<0>hôte API REST ou l'adresse <0>.onion pour vous connecter via Tor dans l'entrée ci-dessous.", + "instructions2": "Copiez le <0>macaroon (admin) dans l'entrée ci-dessous." }, "rest_api_host": { - "label": "", - "placeholder": "" + "label": "Hôte d'API REST", + "placeholder": "adresse-de-votre-node-onion:port" } }, "bitcoin_beach": { - "title": "", + "title": "Portefeuille de plage Bitcoin", "page": { - "title": "" + "title": "Connectez-vous à <0>Bitcoin Beach Wallet" } }, "bitcoin_jungle": { - "title": "", + "title": "Portefeuille Jungle Bitcoin", "page": { - "title": "" + "title": "Connectez-vous au <0>portefeuille Bitcoin Jungle" } }, "galoy": { "phone_number": { - "label": "" + "label": "Entrez votre numéro de téléphone" }, "sms_code": { - "label": "" + "label": "Entrez votre code de vérification par SMS" }, "jwt": { - "label": "", - "info": "" + "label": "Entrez votre jeton JWT", + "info": "La connexion {{label}} est en cours de mise à jour. Si vous êtes un utilisateur avancé, vous pouvez récupérer votre jeton JWT en vous connectant via le <0>Portefeuille Web (wallet.mainnet.galoy.io)<1/><1/>Le JWT ressemble : < 2>eyJhbG...<1/><1/>" }, "actions": { - "login": "", - "request_sms_code": "" + "login": "Connexion", + "request_sms_code": "Demander un code SMS" }, "errors": { - "failed_to_request_sms": "", - "failed_to_login_sms": "", - "setup_failed": "", - "missing_jwt": "", - "invalid_jwt": "" + "failed_to_request_sms": "Impossible de demander un code SMS", + "failed_to_login_sms": "Échec de la connexion avec le code SMS", + "setup_failed": "La configuration a échoué", + "missing_jwt": "JWT manquant, impossible de se connecter.", + "invalid_jwt": "JWT invalide passé" } }, "kollider": { - "title": "", - "description": "", + "title": "Kollider", + "description": "Connectez-vous à votre compte Kollider", "page": { - "title": "", - "description": "" + "title": "Connectez-vous à votre compte Kollider", + "description": "Vous n'avez pas encore de compte ? <0>Sign up maintenant !" }, "username": { - "label": "" + "label": "Saisissez votre nom d'utilisateur pour Kollider" }, "password": { - "label": "" + "label": "Entrez votre mot de passe Kollider" }, "currency": { - "label": "" + "label": "Sélectionnez votre compte en devise" }, "errors": { - "connection_failed": "" + "connection_failed": "La connexion a échoué. Êtes-vous sûr que les données du compte sont correctes ?" } }, "btcpay": { - "title": "", + "title": "Serveur BTCPay", "page": { - "title": "", - "instructions": "" + "title": "Connectez-vous à votre nœud BTCPay LND", + "instructions": "Accédez à votre BTCPayServer et connectez-vous en tant qu'administrateur. Accédez à Paramètres du serveur > Services > LND Rest - Voir les informations. Cliquez ensuite sur \"Voir les informations du code QR\" et copiez les données du code QR. Collez-le ci-dessous :" }, "config": { - "label": "", - "placeholder": "" + "label": "Données de configuration", + "placeholder": "config=https://votre-btc-pay.org/lnd-config/212121/lnd.config" }, "errors": { - "connection_failed": "" + "connection_failed": "La connexion a échoué. L'URL de connexion BTCPay est-elle correcte et accessible ?" } }, "commando": { - "title": "", + "title": "Core Lightning", "page": { - "title": "", - "instructions": "" + "title": "Connectez-vous à votre nœud Core Lightning", + "instructions": "Assurez-vous que vous disposez de Core Lightning version 0.12.0 ou plus récente, que le plug-in commando est en cours d'exécution et que votre nœud est accessible via le réseau Lightning. Créez une rune en exécutant 'lightning-cli commando-rune'." }, "host": { - "label": "" + "label": "Hôte" }, "pubkey": { - "label": "" + "label": "Clé publique" }, "rune": { - "label": "" + "label": "Rune" }, "port": { - "label": "" + "label": "Port" }, "proxy": { - "label": "" + "label": "Proxy websocket" }, "privKey": { - "label": "" + "label": "Clé privée locale (générée automatiquement)" }, "config": { - "label": "", - "placeholder": "" + "label": "Données de configuration", + "placeholder": "config=https://votre-btc-payer.org/lnd-config/212121/lnd.config" }, "errors": { - "connection_failed": "" + "connection_failed": "La connexion a échoué. Votre nœud Core Lightning est-il en ligne et utilise-t-il le plugin commando ?" } } }, "home": { "actions": { - "send_satoshis": "", - "enable_now": "" + "send_satoshis": "⚡️ Envoyez des Satoshis ⚡️", + "enable_now": "Activer maintenant" }, - "recent_transactions": "", + "recent_transactions": "transactions récentes", "transaction_list": { "tabs": { - "outgoing": "", - "incoming": "" + "outgoing": "Sortant", + "incoming": "Entrant" } }, "allowance_view": { - "recent_transactions": "", - "allowance": "", - "sats_used": "", - "no_transactions": "" + "recent_transactions": "transactions récentes", + "allowance": "Allocation", + "sats_used": "sats utilisés", + "no_transactions": "Aucune transaction sur <0>{{name}} pour le moment." }, "default_view": { - "recent_transactions": "", - "no_transactions": "", - "is_blocked_hint": "", - "block_removed": "" + "recent_transactions": "transactions récentes", + "no_transactions": "Aucune transaction effectuée avec Alby pour le moment.", + "is_blocked_hint": "Alby est actuellement désactivé sur {{host}}", + "block_removed": "{{hôte}} activé. Veuillez recharger le site Web." } }, "accounts": { - "title": "", + "title": "Comptes", "account_view": { - "title1": "", - "title2": "", + "title1": "Information sur le compte", + "title2": "Modifier le compte", "name": { - "title": "", - "placeholder": "" + "title": "Nom", + "placeholder": "Nom du compte" }, "export": { - "title": "", - "screen_reader": "", - "waiting": "", - "your_ln_address": "", - "tip_mobile": "", - "export_uri": "", - "scan_qr": "" + "title": "Compte d'exportation", + "screen_reader": "Exporter les détails du compte", + "waiting": "en attente des données LndHub...", + "your_ln_address": "Votre adresse Lightning :", + "tip_mobile": "Astuce : Utilisez ce portefeuille avec votre appareil mobile", + "export_uri": "URI des identifiants LNDHub", + "scan_qr": "Importez ce portefeuille dans Zeus ou BlueWallet en scannant le QRCode." }, "nostr": { - "title": "", - "hint": "", + "title": "Nostr", + "hint": "est un protocole simple et ouvert qui vise à créer des réseaux sociaux résistants à la censure. Nostr fonctionne avec des clés cryptographiques. Pour publier quelque chose vous le signez avec votre clé et l'envoyez à plusieurs relais. Vous pouvez utiliser Alby pour gérer votre clé Nostr. De nombreuses applications Nostr vous permettront alors d'utiliser simplement la clé de l'extension Alby.", "private_key": { - "title": "", - "subtitle": "", - "warning": "", - "success": "", - "successfully_removed": "", - "label": "" + "title": "Gérez votre clé", + "subtitle": "Collez votre clé privée ou générez-en une nouvelle. Assurez-vous de sauvegarder votre clé privée avant d'en générer une nouvelle. <0>En savoir plus »", + "warning": "Veuillez entrer le nom du compte pour confirmer la suppression de la clé privée :", + "success": "Clé privée cryptée et enregistrée avec succès.", + "successfully_removed": "Clé privée supprimée avec succès.", + "label": "Clé privée", + "failed_to_remove": "Le nom de compte saisi ne correspondait pas, votre ancien compte privé a été restauré." }, "public_key": { - "label": "" + "label": "Clé publique" }, "generate_keys": { - "title": "", - "screen_reader": "", - "hint": "", + "title": "Générer une nouvelle clé Nostr", + "screen_reader": "Générez une nouvelle clé Nostr pour votre compte", + "hint": "Vous pouvez générer une clé aléatoire ou une clé dérivée à partir des détails de ce compte (en utilisant une phrase canonique signée). <0>En savoir plus »", "actions": { - "random_keys": "", - "derived_keys": "" + "random_keys": "Générer une clé aléatoire", + "derived_keys": "Dériver une clé du compte" } }, "actions": { - "generate": "" + "generate": "Générer une nouvelle clé" }, "errors": { - "failed_to_load": "" + "failed_to_load": "Échec du chargement de la clé Nostr. Est-ce une clé Nostr valide ?" } }, "remove": { - "title": "", - "subtitle": "", - "confirm": "" + "title": "Supprimer ce compte", + "subtitle": "Tous les quotas liés seront supprimés. S'il vous plaît soyez certain.", + "confirm": "Voulez-vous vraiment supprimer le compte : {{name}} ?\nÇa ne peut pas être annulé. Si vous avez utilisé ce compte pour vous connecter à des sites Web, vous risquez de perdre l'accès à ceux-ci." }, "actions": { - "remove_account": "", - "export": "" + "remove_account": "Supprimer le compte", + "export": "Exporter" } }, "actions": { - "add_account": "" + "add_account": "Ajouter un compte" } }, "enable": { - "title": "", - "allow": "", - "request1": "", - "request2": "", - "block_and_ignore": "", - "block_added": "" + "title": "Connecter", + "allow": "Autoriser ce site Web à :", + "request1": "Demander l'approbation des transactions", + "request2": "Demander des factures et des informations sur la foudre", + "block_and_ignore": "Bloquer et ignorer {{host}}", + "block_added": "{{host}} a été ajouté à la liste de blocage, veuillez recharger le site Web." }, "unlock": { - "unlock_to_continue": "", - "unlock_password": "", + "unlock_to_continue": "Déverrouiller pour continuer", + "unlock_password": "Votre mot de passe de déverrouillage", "help_contact": { - "part1": "", - "part2": "" + "part1": "Besoin d'aide? Contacter", + "part2": "Assistance Alby" }, "unlock_error": { - "help": "", - "link": "" + "help": "Les données de votre compte sont cryptées avec votre mot de passe de déverrouillage. Si vous avez vraiment oublié votre mot de passe de déverrouillage, vous devez réinitialiser et ajouter à nouveau votre compte Lightning.", + "link": "Réinitialisez maintenant et ajoutez un nouveau compte" }, "errors": { - "invalid_password": "" + "invalid_password": "Mot de passe incorrect" } }, "settings": { - "title": "", + "title": "Paramètres", "browser_notifications": { - "title": "", - "subtitle": "" + "title": "Notifications du navigateur", + "subtitle": "Notifications liées au paiement et à l'authentification." }, "website_enhancements": { - "title": "", - "subtitle": "" + "title": "Améliorations du site Web", + "subtitle": "Améliorations des pourboires pour Twitter, YouTube, etc." }, "lnurl_auth": { - "title": "", - "hint": "", + "title": "LNURL-Auth", + "hint": "est un protocole d'authentification générique. Il authentifie l'utilisateur à l'aide de signatures numériques. Le protocole ne nécessite aucune autre information d'identification telle que des mots de passe, des e-mails, des noms d'utilisateur ou similaires. Avec Alby, vous pouvez utiliser vos comptes Lightning pour vous connecter en toute sécurité aux sites Web. Pour être compatible avec d'autres portefeuilles, nous avons dû apporter quelques modifications que vous pouvez configurer ici. <0>Idéalement, toutes ces options sont désactivées. Utilisez-les uniquement si vous avez d'anciens comptes.", "legacy_lnurl_auth_202207": { - "title": "", - "subtitle": "" + "title": "Hérité LNURL-Auth", + "subtitle": "La génération de clé pour LNURL-auth a changé (juillet 2022). Alby n'était pas compatible avec d'autres implémentations. Cela a été changé, mais maintenant différentes clés de connexion sont utilisées. Si vous avez utilisé LNURL-auth pour vous connecter auparavant, vous pouvez toujours activer l'ancienne méthode. Cette option sera supprimée plus tard, assurez-vous de passer à la nouvelle connexion." }, "legacy_lnurl_auth": { - "title": "", - "subtitle": "" + "title": "Signature héritée pour LNDhub et LNbits", + "subtitle": "La signature des messages et la connexion avec LNDhub (par exemple BlueWallet) et les comptes LNbits ont été modifiées (mars 2022). Si vous vous êtes connecté avec ces comptes, vous pouvez toujours activer l'ancienne méthode de signature. Cette option sera supprimée plus tard, assurez-vous de passer à la nouvelle connexion." } }, "camera_access": { - "title": "", - "subtitle": "", - "allow": "", - "granted": "" + "title": "accès à la caméra", + "subtitle": "Pour scanner les codes QR", + "allow": "Autoriser l'accès à la caméra", + "granted": "Permission accordée" }, "language": { - "title": "", - "subtitle": "" + "title": "Langue", + "subtitle": "Les traductions ne sont pas encore terminées à 100 %. <0>Aidez-nous à traduire Alby dans votre langue !" }, "theme": { - "title": "", - "subtitle": "", + "title": "Thème", + "subtitle": "Utiliser Alby en mode sombre ou clair", "options": { - "dark": "", - "light": "", - "system": "" + "dark": "Sombre", + "light": "Lumière", + "system": "Système" } }, "show_fiat": { - "title": "", - "subtitle": "" + "title": "Sat à Fiat", + "subtitle": "Toujours convertir dans la devise sélectionnée à partir de l'échange sélectionné" }, "currency": { - "title": "", - "subtitle": "" + "title": "Monnaie", + "subtitle": "Afficher les montants en plus dans cette devise" }, "exchange": { - "title": "", - "subtitle": "" + "title": "Source d'échange", + "subtitle": "Source des taux de change Bitcoin" }, "personal_data": { - "title": "", - "description": "" + "title": "Données personnelles", + "description": "Les bénéficiaires peuvent demander que des données supplémentaires soient envoyées avec un paiement. Ces données ne sont partagées avec personne sans votre consentement, vous serez toujours invité avant que ces données ne soient envoyées avec un paiement." }, "name": { - "title": "", + "title": "Nom", "subtitle": "", - "placeholder": "" + "placeholder": "Entrez votre nom" }, "email": { - "title": "", + "title": "E-mail", "subtitle": "", - "placeholder": "" + "placeholder": "Entrez votre adresse email" }, "change_password": { - "title": "", + "title": "Changer le mot de passe de déverrouillage", "subtitle": "", - "screen_reader": "", + "screen_reader": "Changer le mot de passe de déverrouillage", "choose_password": { - "label": "" + "label": "Saisissez un nouveau mot de passe de déverrouillage :" }, "confirm_password": { - "label": "" + "label": "Confirmer le nouveau mot de passe:" }, "submit": { - "label": "" + "label": "Changement" }, "errors": { - "enter_password": "", - "confirm_password": "", - "mismatched_password": "" + "enter_password": "Veuillez saisir un nouveau mot de passe de déverrouillage.", + "confirm_password": "Veuillez confirmer votre mot de passe.", + "mismatched_password": "Les mots de passe ne correspondent pas." }, - "success": "" + "success": "Le mot de passe a été changé avec succès" }, "nostr": { - "title": "", - "hint": "", + "title": "Nostr", + "hint": "est un protocole simple et ouvert qui vise à créer des réseaux sociaux résistants à la censure. Nostr fonctionne avec des clés cryptographiques. Pour publier quelque chose vous le signez avec votre clé et l'envoyez à plusieurs relais. Vous pouvez utiliser Alby pour gérer votre clé Nostr. De nombreuses applications Nostr vous permettront alors d'utiliser simplement la clé de l'extension Alby.", "private_key": { - "title": "", - "subtitle": "", - "go_to": "" + "title": "Clé privée", + "subtitle": "Cette section est déplacée vers la page des comptes car les clés sont désormais spécifiques au compte.", + "go_to": "Aller aux comptes" } } }, "send": { - "title": "", + "title": "Envoyer", "qrcode": { - "title": "" + "title": "En attente de numérisation" }, "input": { - "label": "", - "hint": "" + "label": "Destinataire", + "hint": "Facture, adresse Lightning ou LNURL" } }, "lnurlpay": { "amount": { - "label": "" + "label": "Montant" }, "comment": { - "label": "" + "label": "Commentaire" }, "name": { - "label": "" + "label": "Nom" }, "email": { - "label": "" + "label": "E-mail" }, - "success": "" + "success": "Succès, paiement envoyé !" }, "lnurlauth": { - "title": "", + "title": "Authentification", "content_message": { - "heading": "" + "heading": "Voulez-vous vous connecter à" }, - "submit": "", - "success": "", + "submit": "Connexion", + "success": "Connexion réussie sur {{name}}", "errors": { - "status": "" + "status": "Erreur : Le statut d'authentification n'est pas correct" } }, "lnurlchannel": { - "title": "", + "title": "Demande de chaîne", "content_message": { - "heading": "" + "heading": "Demander un canal au nœud" }, - "success": "" + "success": "La demande de chaîne a été envoyée avec succès à {{name}}" }, "lnurlwithdraw": { - "title": "", + "title": "Retirer", "content_message": { - "heading": "" + "heading": "Montant" }, "amount": { - "label": "" + "label": "Montant" }, - "success": "" + "success": "Demande de retrait de {{amount}} envoyée avec succès à {{sender}}" }, "receive": { - "title": "", + "title": "Recevoir", "actions": { - "create_invoice": "" + "create_invoice": "Créer une facture" }, "amount": { - "label": "", - "placeholder": "" + "label": "Montant", + "placeholder": "Montant en Satoshi..." }, "description": { - "label": "", - "placeholder": "" + "label": "Description", + "placeholder": "Par ex. qui envoie ce paiement ?" }, - "success": "", + "success": "Paiement reçu!", "payment": { - "waiting": "", - "status": "" + "waiting": "en attente de paiement...", + "status": "Vérifier l'état du paiement" } }, "discover": { - "title": "", - "description": "", + "title": "Explorez l'écosystème Lightning ⚡️", + "description": "Sites Web et applications Web où vous pouvez utiliser Alby", "list": { - "trading": "", - "gaming": "", - "entertaiment": "", - "shopping": "", - "miscellaneous": "", - "showcases": "", - "nostr": "" + "trading": "Commerce", + "gaming": "Jeux", + "entertaiment": "Divertissement", + "shopping": "Achats", + "miscellaneous": "Divers", + "showcases": "Vitrines", + "nostr": "Nostr" }, "tips": { - "title": "", - "description": "", + "title": "Votre portefeuille Alby est prêt", + "description": "Quelques conseils pour commencer à buzzer🐝", "top_up_wallet": { - "title": "", - "description": "", - "label1": "", - "label2": "" + "title": "⚡️ Rechargez votre portefeuille", + "description": "Créez une facture Lightning, envoyez-vous des bitcoins et commencez à utiliser Alby dans l'écosystème Lightning", + "label1": "Recevez des bitcoins", + "label2": "Recevez des bitcoins" }, "pin": { - "title": "", - "description1": "", - "description2": "", - "description3": "" + "title": "📌 Épinglez votre extension Alby", + "description1": "<0>Pour accéder facilement à Alby, cliquez sur l'icône d'extension <1/> <2>dans le coin supérieur droit de votre navigateur", + "description2": "Dans la liste des extensions, recherchez Alby et cliquez sur l'icône d'épingle pour l'épingler à la barre d'outils", + "description3": "C'est ça! Pour accéder à Alby, cliquez simplement sur l'icône Alby" }, "demo": { - "title": "", - "description": "", - "label1": "" + "title": "🕹️ Essayez la démo d'Alby", + "description": "Découvrez tout ce que vous pouvez faire avec Alby sur notre site de démonstration", + "label1": "Essaie" }, "address": { - "title": "", - "description": "", - "label1": "" + "title": "⚡️ Obtenez une adresse éclair", + "description": "Créez votre propre adresse éclair et recevez des paiements éclair en envoyant facilement un e-mail", + "label1": "Obtenez le maintenant!" } } }, "publishers": { - "title": "", - "description": "", - "no_info": "", - "discover": "", + "title": "Vos sites ⚡", + "description": "Sites Web sur lesquels vous avez déjà utilisé Alby", + "no_info": "Il semble que vous n'ayez encore utilisé Alby sur aucun site Web.", + "discover": "Découvrir des sites Web", "publisher": { "allowance": { - "title": "", - "used_budget": "" + "title": "Allocation", + "used_budget": "sats utilisés" } } }, "make_invoice": { - "title": "", + "title": "Créer une facture", "amount": { - "label": "" + "label": "Montant (Satoshi)" }, "memo": { - "label": "" + "label": "Note" }, "errors": { - "amount_too_small": "", - "amount_too_big": "" + "amount_too_small": "Le montant est inférieur au minimum", + "amount_too_big": "Le montant dépasse le maximum" } }, "confirm_sign_message": { - "title": "", - "content": "" + "title": "Signe", + "content": "Ce site vous demande de signer :" }, "confirm_keysend": { - "title": "", - "success": "", + "title": "Approuver le paiement", + "success": "Paiement envoyé! Préimage : {{preimage}}", "payment_summary": { - "description": "" + "description": "Envoyez le paiement à : {{destination}}" } }, "keysend": { - "title": "", - "success": "", + "title": "Envoyer", + "success": "Paiement envoyé! Préimage : {{preimage}}", "receiver": { - "label": "" + "label": "Envoyez le paiement à" }, "amount": { - "label": "" + "label": "Montant (Satoshi)" } }, "confirm_payment": { - "title": "", - "success": "", + "title": "Approuver le paiement", + "success": "Paiement de {{amount}} réussi !", "actions": { - "pay_now": "" + "pay_now": "Payez maintenant" } }, "confirm_request_permission": { - "title": "", - "allow": "", - "always_allow": "" + "title": "Approuver la demande", + "allow": "Autoriser ce site Web à exécuter :", + "always_allow": "Souviens-toi de mon choix et ne redemande plus" }, "nostr": { - "title": "", - "allow": "", - "content": "", - "allow_sign": "", - "block_and_ignore": "", - "block_added": "" + "title": "Nostr", + "allow": "Autoriser ce site Web à :", + "content": "Ce site vous demande de signer :", + "allow_sign": "Autoriser {{host}} à signer :", + "block_and_ignore": "Bloquer et ignorer {{host}}", + "block_added": "{{host}} a été ajouté à la liste de blocage, veuillez recharger le site Web." } }, "common": { - "password": "", - "confirm_password": "", - "advanced": "", - "success": "", - "error": "", - "settings": "", - "accounts": "", - "discover": "", - "websites": "", - "sats_one": "", - "sats_other": "", - "loading": "", - "amount": "", - "optional": "", - "feedback": "", - "copied": "", - "description": "", - "description_full": "", - "success_message": "", - "response": "", - "message": "", - "help": "", + "password": "Mot de passe", + "confirm_password": "Confirmez le mot de passe", + "advanced": "Avancé", + "success": "Succès", + "error": "Erreur", + "settings": "Paramètres", + "accounts": "Comptes", + "discover": "Découvrir", + "websites": "Sites Internet", + "sats_one": "sat", + "sats_other": "sats", + "loading": "chargement", + "amount": "Montant", + "optional": "Facultatif", + "feedback": "Retour", + "copied": "Copié !", + "description": "Description", + "description_full": "Description complète", + "success_message": "{{amount}}{{fiatAmount}} envoyé à {{destination}}", + "response": "Réponse", + "message": "Message", + "help": "Aider", "actions": { - "back": "", - "delete": "", - "edit": "", - "next": "", - "open": "", - "cancel": "", - "confirm": "", - "continue": "", - "connect": "", - "lock": "", - "unlock": "", - "send": "", - "save": "", - "receive": "", - "receive_again": "", - "close": "", - "export": "", - "remove": "", - "copy": "", - "log_in": "", - "remember": "" + "back": "arrière", + "delete": "Supprimer", + "edit": "Modifier", + "next": "Suivant", + "open": "Ouvrir", + "cancel": "Annuler", + "confirm": "Confirmer", + "continue": "Continuer", + "connect": "Connecter", + "lock": "Verrouiller", + "unlock": "Déverrouiller", + "send": "Envoyer", + "save": "Sauvegarder", + "receive": "Recevoir", + "receive_again": "Recevoir un autre paiement", + "close": "Fermer", + "export": "Exporter", + "remove": "Retirer", + "copy": "Copie", + "log_in": "Connexion", + "remember": "Souviens-toi de mon choix et ne redemande plus" }, "errors": { - "connection_failed": "", - "payment_failed": "" + "connection_failed": "La connexion a échoué", + "payment_failed": "Paiement échoué" + }, + "range": { + "lessThan": "< {{max}}", + "greaterThan": "> {{min}}", + "between": "entre {{min}} et {{max}}" } }, "components": { "allowance_menu": { - "confirm_delete": "", - "hint": "", + "confirm_delete": "Voulez-vous vraiment supprimer ce site ?", + "hint": "Cela réinitialisera le budget actuel", "new_budget": { - "label": "" + "label": "Nouveau budget" }, "enable_login": { - "title": "", - "subtitle": "" + "title": "Activer la connexion au site Web", + "subtitle": "Connectez-vous automatiquement sans confirmation lorsque le site Web le demande." }, "edit_allowance": { - "title": "", - "screen_reader": "" + "title": "Modifier l'allocation", + "screen_reader": "Options d'allocation" }, - "edit_permissions": "" + "edit_permissions": "Modifier les autorisations" }, "qrcode_scanner": { - "title": "", + "title": "Scanner le code QR", "actions": { - "start_scanning": "", - "stop_scanning": "" + "start_scanning": "Lancer la numérisation", + "stop_scanning": "Arrêter la numérisation" }, "errors": { - "allow_camera_access": "" + "allow_camera_access": "Veuillez autoriser l'accès à la caméra dans l'écran des paramètres." } }, "transactionsTable": { - "fee": "", - "preimage": "", - "received": "", - "sent": "", + "fee": "Frais", + "preimage": "Préimage", + "received": "Reçu", + "sent": "Envoyé", "boostagram": { - "sender": "", - "message": "", - "app": "", - "podcast": "" + "sender": "Expéditeur", + "message": "Message", + "app": "Application", + "podcast": "Podcast" }, - "open_location": "" + "open_location": "Ouvrir le site Web" }, "confirm_or_cancel": { - "only_trusted": "" + "only_trusted": "Connectez-vous uniquement aux sites auxquels vous faites confiance." }, "budget_control": { "remember": { - "label": "", - "description": "" + "label": "Rappelez-vous et établissez un budget", + "description": "Vous pouvez définir un solde pour ne pas être invité à confirmer les paiements tant qu'il n'est pas épuisé." }, "budget": { - "label": "" + "label": "Budget" } }, - "companion_download_info": { - "description": "", - "download_here": "", - "using_tor": "", - "or": "" - }, "toasts": { "connection_error": { - "what_you_can_do": "", - "double_check": "", - "if_ssl_errors": "", - "visit_guides": "" + "what_you_can_do": "Voici ce que vous pouvez faire :", + "double_check": "Vérifiez vos informations de connexion", + "if_ssl_errors": "et s'il y a des erreurs SSL (par exemple ERR_CERT_AUTHORITY_INVALID), cliquez sur \"avancé\" et continuez à accepter le certificat.", + "visit_guides": "Consultez nos guides pour plus d'aide" }, "login_failed": { - "password_reset": "" + "password_reset": "Mot de passe oublié? Cliquez ici" }, "errors": { - "invalid_credentials": "" + "invalid_credentials": "Mot de passe incorrect. Veuillez vérifier votre mot de passe et votre adresse e-mail et réessayer." } }, "account_menu": { - "screen_reader": "", - "title": "", + "screen_reader": "Basculer la liste déroulante", + "title": "Changer de compte", "options": { "account": { - "add": "", - "manage": "" + "add": "Ajouter un nouveau compte", + "manage": "Gérer les comptes" } } }, "publishers_table": { - "payments": "", - "used": "" + "payments": "Paiements", + "used": "utilisé" }, "badge": { "label": { - "active": "", - "auth": "" + "active": "ACTIF", + "auth": "CONNEXION" } } }, "permissions": { "nostr": { - "getpublickey": "", - "nip04encrypt": "", - "nip04decrypt": "", - "signmessage": "" + "getpublickey": "Lisez votre clé publique.", + "nip04encrypt": "Crypter les données.", + "nip04decrypt": "Déchiffrer les données.", + "signmessage": "Signez le message avec votre clé." }, "commando": { - "bkpr-listbalances": "", - "checkmessage": "", - "connect": "", - "decode": "", - "decodepay": "", - "disconnect": "", - "feerates": "", - "fundchannel": "", - "getinfo": "", - "getroute": "", - "invoice": "", - "keysend": "", - "listforwards": "", - "listfunds": "", - "listinvoices": "", - "listnodes": "", - "listoffers": "", - "listpays": "", - "listpeers": "", - "listsendpays": "", - "listtransactions": "", - "multifundchannel": "", - "offer": "", - "pay": "", - "sendpay": "", - "setchannel": "", - "signmessage": "" + "bkpr-listbalances": "Liste de tous les soldes de compte actuels et historiques.", + "checkmessage": "Vérifiez que la signature a été générée par un nœud donné.", + "connect": "Établissez une nouvelle connexion avec un autre nœud.", + "decode": "Décode une chaîne bolt11/bolt12/ rune chaîne.", + "decodepay": "Vérifier et analyser une chaîne bolt11.", + "disconnect": "Fermez une connexion existante à un pair.", + "feerates": "Renvoie les frais que CLN utilisera.", + "fundchannel": "Ouvrez un canal de paiement avec un pair en engageant une transaction de financement.", + "getinfo": "Obtenez le résumé du nœud.", + "getroute": "Trouvez le meilleur itinéraire pour le paiement vers un nœud Lightning.", + "invoice": "Créer l'attente d'un paiement.", + "keysend": "Envoyez un paiement à un autre nœud.", + "listforwards": "Répertorier tous les htlcs qui ont été tentés d'être transférés.", + "listfunds": "Dressez la liste de tous les fonds disponibles.", + "listinvoices": "Obtenez le statut de toutes les factures.", + "listnodes": "Listez les nœuds dont le nœud a eu connaissance via des messages de potins.", + "listoffers": "Listez toutes les offres ou obtenez une offre spécifique.", + "listpays": "Obtient le statut de toutes les commandes de paiement.", + "listpeers": "Répertorier les nœuds connectés ou ayant des canaux ouverts avec ce nœud.", + "listsendpays": "Obtient le statut de toutes les commandes sendpay.", + "listtransactions": "Répertorier les transactions suivies dans le portefeuille.", + "multifundchannel": "Ouvrez plusieurs canaux de paiement avec des nœuds en effectuant une seule transaction de financement.", + "offer": "Créer une offre.", + "pay": "Envoyez un paiement à une facture BOLT11.", + "sendpay": "Envoyer un paiement via un itinéraire.", + "setchannel": "Configurez les frais / la gamme htlc annoncée pour un canal.", + "signmessage": "Créez une signature à partir de ce nœud." }, "lnd": { - "getinfo": "", - "listchannels": "", - "listinvoices": "", - "channelbalance": "", - "walletbalance": "", - "openchannel": "", - "connectpeer": "", - "disconnectpeer": "", - "estimatefee": "", - "getchaninfo": "", - "getnetworkinfo": "", - "getnodeinfo": "", - "gettransactions": "", - "listpayments": "", - "listpeers": "", - "lookupinvoice": "", - "queryroutes": "", - "verifymessage": "", - "sendtoroute": "", - "decodepayreq": "", - "routermc": "", - "addinvoice": "" + "getinfo": "Obtenez les informations sur le nœud.", + "listchannels": "Obtenez une description de tous les canaux ouverts.", + "listinvoices": "Obtenez une liste de toutes les factures.", + "channelbalance": "Obtenez un rapport sur le total des fonds sur tous les canaux ouverts.", + "walletbalance": "Obtenez le total des sorties non dépensées du portefeuille.", + "openchannel": "Ouvrez une nouvelle chaîne.", + "connectpeer": "Établissez une connexion à un pair distant.", + "disconnectpeer": "Déconnectez-vous d'un pair distant.", + "estimatefee": "Estimez le taux de frais et les frais totaux pour une transaction.", + "getchaninfo": "Obtenez l'annonce du réseau pour la chaîne donnée.", + "getnetworkinfo": "Obtenez des statistiques de base sur le graphique des canaux connus.", + "getnodeinfo": "Obtenir les informations de canal pour un nœud.", + "gettransactions": "Obtenez une liste de toutes les transactions pertinentes pour le portefeuille.", + "listpayments": "Obtenez une liste de tous les paiements sortants.", + "listpeers": "Obtenez une liste de tous les pairs actuellement actifs.", + "lookupinvoice": "Consulter les détails de la facture.", + "queryroutes": "Requête pour un itinéraire possible.", + "verifymessage": "Vérifier une signature sur un msg.", + "sendtoroute": "Effectuez un paiement via l'itinéraire spécifié.", + "decodepayreq": "Décoder une chaîne de demande de paiement.", + "routermc": "Lire l'état du contrôle de mission interne.", + "addinvoice": "Créer de nouvelles factures." }, "lnc": { - "getinfo": "", - "listchannels": "", - "listinvoices": "", - "channelbalance": "", - "walletbalance": "", - "openchannel": "", - "connectpeer": "", - "disconnectpeer": "", - "estimatefee": "", - "getchaninfo": "", - "getnetworkinfo": "", - "getnodeinfo": "", - "gettransactions": "", - "listpayments": "", - "listpeers": "", - "lookupinvoice": "", - "queryroutes": "", - "verifymessage": "", - "sendtoroute": "", - "decodepayreq": "", - "routermc": "", - "addinvoice": "" + "getinfo": "Obtenez les informations sur le nœud.", + "listchannels": "Obtenez une description de tous les canaux ouverts.", + "listinvoices": "Obtenez une liste de toutes les factures.", + "channelbalance": "Obtenez un rapport sur le total des fonds sur tous les canaux ouverts.", + "walletbalance": "Obtenez le total des sorties non dépensées du portefeuille.", + "openchannel": "Ouvrez une nouvelle chaîne.", + "connectpeer": "Établissez une connexion à un pair distant.", + "disconnectpeer": "Déconnectez-vous d'un pair distant.", + "estimatefee": "Estimez le taux de frais et les frais totaux pour une transaction.", + "getchaninfo": "Obtenez l'annonce du réseau pour la chaîne donnée.", + "getnetworkinfo": "Obtenez des statistiques de base sur le graphique des canaux connus.", + "getnodeinfo": "Obtenir les informations de canal pour un nœud.", + "gettransactions": "Obtenez une liste de toutes les transactions pertinentes pour le portefeuille.", + "listpayments": "Obtenez une liste de tous les paiements sortants.", + "listpeers": "Obtenez une liste de tous les pairs actuellement actifs.", + "lookupinvoice": "Consulter les détails de la facture.", + "queryroutes": "Requête pour un itinéraire possible.", + "verifymessage": "Vérifier une signature sur un msg.", + "sendtoroute": "Effectuez un paiement via l'itinéraire spécifié.", + "decodepayreq": "Décoder une chaîne de demande de paiement.", + "routermc": "Lire l'état du contrôle de mission interne.", + "addinvoice": "Créer de nouvelles factures." } } } diff --git a/src/i18n/locales/it/translation.json b/src/i18n/locales/it/translation.json index 25f6e4957f..c18ace176f 100644 --- a/src/i18n/locales/it/translation.json +++ b/src/i18n/locales/it/translation.json @@ -837,12 +837,6 @@ "label": "Budget" } }, - "companion_download_info": { - "description": "Stai cercando di connetterti a un nodo dietro Tor. Per fare ciò è necessario avere installato l'app companion Alby o avere Tor in esecuzione. (Se non sei sicuro, ti consigliamo l'app complementare Alby.)", - "download_here": "Scarica il companion Alby qui!", - "using_tor": "clicca qui per continuare se stai utilizzando il Browser Tor", - "or": "Oppure:" - }, "toasts": { "connection_error": { "what_you_can_do": "Ecco cosa puoi fare:", diff --git a/src/i18n/locales/nl/translation.json b/src/i18n/locales/nl/translation.json index 718b84056d..0bc4645272 100644 --- a/src/i18n/locales/nl/translation.json +++ b/src/i18n/locales/nl/translation.json @@ -643,12 +643,6 @@ "label": "" } }, - "companion_download_info": { - "description": "", - "download_here": "", - "using_tor": "", - "or": "" - }, "toasts": { "connection_error": { "what_you_can_do": "", diff --git a/src/i18n/locales/pl/translation.json b/src/i18n/locales/pl/translation.json index 79a493c416..86f8165432 100644 --- a/src/i18n/locales/pl/translation.json +++ b/src/i18n/locales/pl/translation.json @@ -240,15 +240,15 @@ "page": { "title": "Podłącz do węzła <0>RaspiBlitz", "instructions1": "", - "instructions2": "" + "instructions2": "Skopiuj (admin) <0>macaroon w pole poniżej." }, "rest_api_host": { - "label": "", - "placeholder": "" + "label": "Adres serwera REST API", + "placeholder": "adres-onion-twojego-wezla:port" } }, "bitcoin_beach": { - "title": "", + "title": "Portfel Bitcoin Beach", "page": { "title": "Podłącz do <0>Bitcoin Beach Wallet" } @@ -268,7 +268,7 @@ }, "jwt": { "label": "Wprowadź swój token JWT", - "info": "" + "info": "Logowanie do {{label}} jest w trakcie aktualizacji. Jeśli jesteś zaawansowanym użytkownikiem, pobierz swój token JWT logując się przez <0>Portfel webowy (wallet.mainnet.galoy.io)<1/><1/>Token JWT wygląda tak: <2>eyJhbG...<1/><1/>" }, "actions": { "login": "Zaloguj", @@ -306,36 +306,36 @@ "title": "BTCPay Server", "page": { "title": "Podłącz do węzła LND na BTCPayServer", - "instructions": "" + "instructions": "Przejdź do BTCPayServer i zaloguj się jako administrator. Idź do Server Settings > Services > NDS Rest - See information. Następni kliknij \"See QR Code information\" i skopiuj dane kodu QR. Wklej poniżej:" }, "config": { - "label": "", - "placeholder": "" + "label": "Date konfiguracyjne", + "placeholder": "config=https://twoj-btc-pay.org/lnd-config/212121/lnd.config" }, "errors": { - "connection_failed": "" + "connection_failed": "Połączenie nieudane. Czy adres BTCPay jest poprawny i osiągalny?" } }, "commando": { - "title": "", + "title": "Core Lightning", "page": { - "title": "", - "instructions": "" + "title": "Podłącz do Twojego węzła Core Lightning", + "instructions": "Upewnij się, że masz Core Lightning w wersji 0.12.0 lub nowszej, że plugin commando działa, a Twój węzeł jest dostępny w sieci lightning. Stwórz runę komendą 'lightning-cli commando-rune'." }, "host": { - "label": "" + "label": "Serwer" }, "pubkey": { - "label": "" + "label": "Klucz publiczny" }, "rune": { - "label": "" + "label": "Runa" }, "port": { "label": "Port" }, "proxy": { - "label": "" + "label": "Proxy websocket" }, "privKey": { "label": "Lokalny klucz prywatny (generowany automatycznie)" @@ -364,12 +364,12 @@ "allowance_view": { "recent_transactions": "Ostatnie transakcje", "allowance": "", - "sats_used": "", - "no_transactions": "" + "sats_used": "wydanych satoshi", + "no_transactions": "Jeszcze nie ma transakcji na koncie <0>{{name}}." }, "default_view": { "recent_transactions": "Ostatnie transakcje", - "no_transactions": "", + "no_transactions": "Jeszcze nie ma transakcji z użyciem Alby.", "is_blocked_hint": "Alby jest obecnie wyłączone na {{host}}", "block_removed": "Włączono {{host}}. Odśwież stronę." } @@ -389,7 +389,7 @@ "waiting": "oczekiwanie na dane LndHub...", "your_ln_address": "Twój adres Lightning:", "tip_mobile": "Wskazówka: Użyj tego portfela na swoim urządzeniu mobilnym", - "export_uri": "", + "export_uri": "Adres LNDHub", "scan_qr": "Zaimportuj ten portfel do Zeusa lub BlueWallet skanując kod QR." }, "nostr": { @@ -409,21 +409,21 @@ "generate_keys": { "title": "Wygeneruj nowy klucz Nostr", "screen_reader": "Wygeneruj nowy klucz Nostr ze swojego konta", - "hint": "", + "hint": "Możesz wygenerować losowy klucz lub wyprowadzić go z danych tego konta (używając podpisanej frazy kanonicznej). <0>Dowiedz się więcej »", "actions": { - "random_keys": "", - "derived_keys": "" + "random_keys": "Wygeneruj losowy klucz", + "derived_keys": "Wyprowadź klucz z danych konta" } }, "actions": { - "generate": "" + "generate": "Generuj nowy klucz" }, "errors": { - "failed_to_load": "" + "failed_to_load": "Nie udało się władować klucza Nostr. Czy to poprawny klucz?" } }, "remove": { - "title": "", + "title": "Usuń konto", "subtitle": "", "confirm": "" }, @@ -837,12 +837,6 @@ "label": "" } }, - "companion_download_info": { - "description": "", - "download_here": "", - "using_tor": "", - "or": "" - }, "toasts": { "connection_error": { "what_you_can_do": "", diff --git a/src/i18n/locales/pt_BR/translation.json b/src/i18n/locales/pt_BR/translation.json index 969bf12706..548ed6d2fe 100644 --- a/src/i18n/locales/pt_BR/translation.json +++ b/src/i18n/locales/pt_BR/translation.json @@ -138,8 +138,8 @@ "title": "RaspiBlitz", "page": { "title": "Conecte seu servidor <0>RaspiBlitz", - "instructions2": "Selecione <0>CONNECT.<1/>Selecione <0>EXPORT.<1/>Selecione <0>HEX.<1/>Copie o <0>adminMacaroon.<1/>Cole o macaroon no campo abaixo.", - "instructions1": "Você precisa do endereço onion, porta, e um macaroon com permissão de leitura e envio (e.g. admin.macaroon).<1/><1/><0>SSH no seu <0>RaspiBlitz.<1/>Execute o comando <0>sudo cat /mnt/hdd/tor/lndrest/hostname.<1/>Copie e cole o endereço <0>.onion no campo abaixo.<1/>Adicione a <0>porta após o endereço onion, a porta padrão é <0>:8080." + "instructions2": "Copie o (admin) <0>macaroon no campo abaixo.", + "instructions1": "Siga esses passos<1/> 1. <0>SSH na <0>Raspiblitz<1/>2. Selecione <0>Conectar apps & Mostrar credenciais da lista<1/><0/>3. Escolher <0>Conectar Alby neste servidor<1/>4. Pressione <0>OK para exibir as credenciais de conexão<1/><1/>Copie e cole o <0>REST API host ou o <0>.onion endereço para conectar -se através do TOR na entrada abaixo." }, "rest_api_host": { "label": "REST API host", @@ -304,9 +304,11 @@ "title": "Gerenciar sua chave", "successfully_removed": "Chave privada removida com sucesso.", "label": "Chave privada", - "warning": "Esta ação excluirá sua chave privada antiga. Tem certeza de que deseja continuar?", - "subtitle": "Cole sua chave privada ou gere uma nova. Certifique-se de fazer backup de sua chave privada antes de gerar uma nova. <0>Saiba mais »", - "success": "Chave privada encriptada e salva com sucesso." + "warning": "Digite o nome da conta para confirmar a exclusão da chave privada:", + "subtitle": "Cole sua chave privada ou gere uma nova. <0>Saiba mais »", + "success": "Chave privada encriptada e salva com sucesso.", + "failed_to_remove": "O nome da conta inserido não está correto, sua chave privada antiga foi restaurada.", + "backup": "⚠️ Faça o backup da sua chave privada! Não fazer o backup da sua chave pode resultar na perda permanente de acesso." }, "public_key": { "label": "Chave pública" @@ -323,6 +325,9 @@ }, "actions": { "generate": "Gerar uma nova chave" + }, + "errors": { + "failed_to_load": "Falha ao carregar a chave Nostr. Esta é uma chave Nostr válida?" } }, "remove": { @@ -592,7 +597,13 @@ "title": "Nostr", "content": "Este site solicita que você assine:", "block_added": "{{host}} adicionado na lista de bloqueio, por favor recarregue o site.", - "allow_sign": "Permitir {{host}} assinar:" + "allow_sign": "Permitir {{host}} assinar:", + "view_details": "Ver detalhes", + "allow_sign_event": "Permitir {{host}} assinar {{kind}}:", + "hide_details": "Ocultar detalhes", + "kinds": { + "unknown": "evento nostr do tipo {{kind}}" + } }, "confirm_request_permission": { "title": "Aprovar solicitação", @@ -697,6 +708,10 @@ "create_wallet_error1": "Falha ao fazer login ou criar uma nova conta." } } + }, + "transactions": { + "title": "Transações", + "description": "Transações enviadas usando suas contas" } }, "common": { @@ -733,7 +748,8 @@ "back": "Voltar", "log_in": "Fazer login", "remember": "Lembrar minha escolha e não perguntar novamente", - "receive_again": "Receber outro pagamento" + "receive_again": "Receber outro pagamento", + "transactions": "Transações" }, "errors": { "connection_failed": "Falha na conexão", @@ -748,7 +764,13 @@ "advanced": "Avançado", "discover": "Explorar", "confirm_password": "Confirmar senha", - "accounts": "Minhas contas" + "accounts": "Minhas contas", + "range": { + "between": "entre {{min}} e {{max}}", + "lessThan": "< {{max}}", + "greaterThan": "> {{min}}" + }, + "transactions": "Transações" }, "components": { "allowance_menu": { @@ -802,12 +824,6 @@ "label": "Limite de gastos" } }, - "companion_download_info": { - "description": "Você está tentando se conectar em um servidor que usa Tor. Para funcionar, você precisa ter o aplicativo complementar Alby instalado ou ter o Tor em execução. (Se tiver de dúvidas, recomendamos o aplicativo complementar Alby.)", - "download_here": "Faça o download do app complementar da Alby aqui!", - "using_tor": "clique aqui para continuar se você usa o navegador Tor", - "or": "Ou:" - }, "toasts": { "connection_error": { "what_you_can_do": "Aqui está o que você pode fazer:", diff --git a/src/i18n/locales/ro/translation.json b/src/i18n/locales/ro/translation.json index 06fc13ac7b..91d7d71ba8 100644 --- a/src/i18n/locales/ro/translation.json +++ b/src/i18n/locales/ro/translation.json @@ -239,8 +239,8 @@ "title": "RaspiBlitz", "page": { "title": "Conectare la nodul tau <0>RaspiBlitz", - "instructions1": "Ai nevoie de adresa onion a nodului tau, portul, si un macaroon cu permisiuni de citire si trimitere (ex. admin.macaroon).<1/><1/><0>SSH in al tau <0>RaspiBlitz.<1/>Ruleaza comanda <0>sudo cat /mnt/hdd/tor/lndrest/hostname.<1/>Copiaza si insereaza adresa <0>.onion in campul de mai jos.<1/>Si <0>portul tau dupa adresa onion, portul implicit este <0>:8080.", - "instructions2": "Selecteaza <0>CONNECT.<1/>Selecteaza <0>EXPORT.<1/>Selecteaza <0>HEX.<1/>Copiaza <0>adminMacaroon.<1/>Insereaza macaroon in campul de mai jos." + "instructions1": "Urmareste aceste pasi:<1/> 1. Conecteaza-te prin <0>SSH la <0>Raspiblitz<1/> 2. Selecteaza <0>Connect Apps & Show Credentials din lista <1/><0/> 3. Alege <0>Connect Alby to this node<1/> 4. Apasa <0>OK pentru a afisa credentialele conexiunii <1/><1/>Copiaza <0>REST API host sau adresa <0>.onion, pentru conectarea prin Tor, si insereaza in campul de mai jos.", + "instructions2": "Copiaza (admin) <0>macaroon si insereaza mai jos." }, "rest_api_host": { "label": "REST API host", @@ -398,10 +398,11 @@ "private_key": { "title": "Gestionarea cheii tale", "subtitle": "Insereaza cheia ta privata sau genereaza una noua. Inainte sa generezi o noua cheie asigura-te ca ai salvat cheia privata. <0>Mai multe »", - "warning": "Vechea ta cheie privata va fi stearsa. Sigur doresti asta?", + "warning": "Te rugam sa introduci numele contului pentru a confirma stergerea cheii private:", "success": "Cheia privata a fost criptata si salvata cu succes.", "successfully_removed": "Cheia privata a fost indepartata cu succes.", - "label": "Cheia privata" + "label": "Cheia privata", + "failed_to_remove": "Numele contului pe care l-ai introdus nu corespunde; vechea ta cheie privata a fost restabilita." }, "public_key": { "label": "Cheia publica" @@ -836,12 +837,6 @@ "label": "" } }, - "companion_download_info": { - "description": "", - "download_here": "", - "using_tor": "", - "or": "" - }, "toasts": { "connection_error": { "what_you_can_do": "", diff --git a/src/i18n/locales/ru/translation.json b/src/i18n/locales/ru/translation.json index 3bcaf6e467..3846484dc6 100644 --- a/src/i18n/locales/ru/translation.json +++ b/src/i18n/locales/ru/translation.json @@ -837,12 +837,6 @@ "label": "" } }, - "companion_download_info": { - "description": "", - "download_here": "", - "using_tor": "", - "or": "" - }, "toasts": { "connection_error": { "what_you_can_do": "", diff --git a/src/i18n/locales/sv/translation.json b/src/i18n/locales/sv/translation.json index 3c8ae433be..dce7baacf0 100644 --- a/src/i18n/locales/sv/translation.json +++ b/src/i18n/locales/sv/translation.json @@ -588,12 +588,6 @@ "label": "Budget" } }, - "companion_download_info": { - "description": "Du försöker ansluta till en nod bakom Tor. Du behöver antingen ha Albys kompanjons-app installerad eller ha Tor i bakgrunden. (Om du är osäker rekommenderar vi Albys kompanjons-app.)", - "download_here": "Ladda ner Albys kompanjons-app här!", - "using_tor": "klicka här för att fortsätta använda Tor-webbläsaren", - "or": "Eller:" - }, "toasts": { "connection_error": { "what_you_can_do": "Du kan göra detta:", diff --git a/src/i18n/locales/tl/translation.json b/src/i18n/locales/tl/translation.json index cc58ce358f..b89614ff74 100644 --- a/src/i18n/locales/tl/translation.json +++ b/src/i18n/locales/tl/translation.json @@ -576,12 +576,6 @@ "label": "" } }, - "companion_download_info": { - "description": "", - "download_here": "", - "using_tor": "", - "or": "" - }, "toasts": { "connection_error": { "what_you_can_do": "", diff --git a/src/i18n/locales/uk/translation.json b/src/i18n/locales/uk/translation.json index c73b136597..f48373a380 100644 --- a/src/i18n/locales/uk/translation.json +++ b/src/i18n/locales/uk/translation.json @@ -837,12 +837,6 @@ "label": "" } }, - "companion_download_info": { - "description": "", - "download_here": "", - "using_tor": "", - "or": "" - }, "toasts": { "connection_error": { "what_you_can_do": "", diff --git a/src/i18n/locales/zh_Hans/translation.json b/src/i18n/locales/zh_Hans/translation.json index 3bcbe5d0f5..8e66855521 100644 --- a/src/i18n/locales/zh_Hans/translation.json +++ b/src/i18n/locales/zh_Hans/translation.json @@ -864,12 +864,6 @@ "auth": "登录" } }, - "companion_download_info": { - "or": "或:", - "using_tor": "如果你使用Tor浏览器,请点击这里继续", - "download_here": "在这里下载Alby伴侣!", - "description": "你正在尝试连接到 Tor 后面的节点。为此,你需要安装 Alby 配套应用程序或运行 Tor。 (当你不确定时,我们建议使用 Alby 配套应用程序。)" - }, "publishers_table": { "used": "已使用", "payments": "付款" diff --git a/src/i18n/locales/zh_Hant/translation.json b/src/i18n/locales/zh_Hant/translation.json index d6af6b58c5..e7bdb21718 100644 --- a/src/i18n/locales/zh_Hant/translation.json +++ b/src/i18n/locales/zh_Hant/translation.json @@ -837,12 +837,6 @@ "label": "" } }, - "companion_download_info": { - "description": "", - "download_here": "", - "using_tor": "", - "or": "" - }, "toasts": { "connection_error": { "what_you_can_do": "", diff --git a/src/types.ts b/src/types.ts index 8a017c646a..8e3738e3ad 100644 --- a/src/types.ts +++ b/src/types.ts @@ -60,6 +60,7 @@ export interface OriginData { } export interface PaymentNotificationData { + accountId: Account["id"]; paymentRequestDetails?: PaymentRequestObject | undefined; response: SendPaymentResponse | { error: string }; origin?: OriginData; @@ -168,6 +169,14 @@ export interface MessagePaymentAll extends MessageDefault { }; } +export interface MessagePaymentListByAccount extends MessageDefault { + action: "getPaymentsByAccount"; + args: { + accountId: Account["id"]; + limit?: number; + }; +} + export interface MessageAccountGet extends MessageDefault { args?: { id?: Account["id"] }; action: "getAccount"; @@ -219,6 +228,7 @@ export interface MessagePermissionDelete extends MessageDefault { args: { host: Permission["host"]; method: Permission["method"]; + accountId: Account["id"]; }; action: "deletePermission"; } @@ -226,6 +236,7 @@ export interface MessagePermissionDelete extends MessageDefault { export interface MessagePermissionsList extends MessageDefault { args: { id: Allowance["id"]; + accountId: Account["id"]; }; action: "listPermissions"; } @@ -233,6 +244,7 @@ export interface MessagePermissionsList extends MessageDefault { export interface MessagePermissionsDelete extends MessageDefault { args: { ids: Permission["id"][]; + accountId: Account["id"]; }; action: "deletePermissions"; } @@ -583,6 +595,7 @@ export type Transaction = { }; export interface DbPayment { + accountId: string; allowanceId: string; createdAt: string; description: string; @@ -613,6 +626,7 @@ export enum PermissionMethodNostr { export interface DbPermission { id?: number; createdAt: string; + accountId: string; allowanceId: number; host: string; method: string | PermissionMethodNostr; @@ -697,7 +711,6 @@ export interface SettingsStorage { showFiat: boolean; currency: CURRENCIES; exchange: SupportedExchanges; - debug: boolean; nostrEnabled: boolean; closedTips: TIPS[]; } diff --git a/tests/e2e/001-createWallets.spec.ts b/tests/e2e/001-createWallets.spec.ts index 7853175225..c76aa5de10 100644 --- a/tests/e2e/001-createWallets.spec.ts +++ b/tests/e2e/001-createWallets.spec.ts @@ -56,7 +56,7 @@ const commonCreateWalletUserCreate = async ( await findByText( $document, - "To start using Alby to make online payments, connect your lightning wallet to the extension." + "To start using the Alby Extension, connect your lightning wallet." ); if (options.connectToLightningWallet) { @@ -101,7 +101,7 @@ test.describe("Create or connect wallets", () => { const createNewWalletButton = await getByText($document, "Sign up"); createNewWalletButton.click(); - await findByText($document, "Your Alby account"); + await findByText($document, "Your Alby Account"); // type user email const emailField = await getByLabelText($document, "Email Address"); @@ -136,7 +136,7 @@ test.describe("Create or connect wallets", () => { const loginButton = await getByText($document, "Log in"); loginButton.click(); - await findByText($document, "Your Alby account"); + await findByText($document, "Your Alby Account"); // type user email const emailField = await getByLabelText( diff --git a/yarn.lock b/yarn.lock index a861684718..133398cf78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,27 +34,6 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== -"@babel/core@7.17.8": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a" - integrity sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.7" - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.8" - "@babel/parser" "^7.17.8" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - "@babel/core@^7.11.6", "@babel/core@^7.12.3": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" @@ -85,7 +64,7 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.17.3", "@babel/generator@^7.17.7", "@babel/generator@^7.18.9", "@babel/generator@^7.7.2": +"@babel/generator@^7.17.3", "@babel/generator@^7.18.9", "@babel/generator@^7.7.2": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== @@ -94,7 +73,7 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": +"@babel/helper-compilation-targets@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== @@ -139,7 +118,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.17.7", "@babel/helper-module-transforms@^7.18.9": +"@babel/helper-module-transforms@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== @@ -182,7 +161,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helpers@^7.17.8", "@babel/helpers@^7.18.9": +"@babel/helpers@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== @@ -200,11 +179,16 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@7.18.9", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.8", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.17.3", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== +"@babel/parser@^7.20.5": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -364,7 +348,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.17.3", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== @@ -584,14 +568,14 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== -"@eslint/eslintrc@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" - integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== +"@eslint/eslintrc@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.1.tgz#7888fe7ec8f21bc26d646dbd2c11cd776e21192d" + integrity sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" + espree "^9.5.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -599,10 +583,15 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@headlessui/react@^1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.8.tgz#d7b4a95d50f9a386f7d1259d5ff8a6d7eb552ef0" - integrity sha512-zcwb0kd7L05hxmoAMIioEaOn235Dg0fUO+iGbLPgLVSjzl/l39V6DTpC2Df49PE5aG5/f5q0PZ9ZHZ78ENNV+A== +"@eslint/js@8.35.0": + version "8.35.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.35.0.tgz#b7569632b0b788a0ca0e438235154e45d42813a7" + integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw== + +"@headlessui/react@^1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.12.tgz#9ab2baa3c4f632782631e00937f9531a34033619" + integrity sha512-FhSx5V+Qp0GvbTpaxyS+ymGDDNntCacClWsk/d8Upbr19g3AsPbjfPk4+m2CgJGcuCB5Dz7LpUIOAbvQTyjL2g== dependencies: client-only "^0.0.1" @@ -641,49 +630,49 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.3.tgz#1f25a99f7f860e4c46423b5b1038262466fadde1" - integrity sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A== +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.4.3" - jest-util "^29.4.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" -"@jest/core@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.3.tgz#829dd65bffdb490de5b0f69e97de8e3b5eadd94b" - integrity sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ== - dependencies: - "@jest/console" "^29.4.3" - "@jest/reporters" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.4.3" - jest-config "^29.4.3" - jest-haste-map "^29.4.3" - jest-message-util "^29.4.3" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" jest-regex-util "^29.4.3" - jest-resolve "^29.4.3" - jest-resolve-dependencies "^29.4.3" - jest-runner "^29.4.3" - jest-runtime "^29.4.3" - jest-snapshot "^29.4.3" - jest-util "^29.4.3" - jest-validate "^29.4.3" - jest-watcher "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" micromatch "^4.0.4" - pretty-format "^29.4.3" + pretty-format "^29.5.0" slash "^3.0.0" strip-ansi "^6.0.0" @@ -694,63 +683,63 @@ dependencies: "@jest/types" "^27.5.1" -"@jest/environment@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.3.tgz#9fe2f3169c3b33815dc4bd3960a064a83eba6548" - integrity sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA== +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== dependencies: - "@jest/fake-timers" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^29.4.3" + jest-mock "^29.5.0" -"@jest/expect-utils@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.3.tgz#95ce4df62952f071bcd618225ac7c47eaa81431e" - integrity sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ== +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: jest-get-type "^29.4.3" -"@jest/expect@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.3.tgz#d31a28492e45a6bcd0f204a81f783fe717045c6e" - integrity sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ== +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== dependencies: - expect "^29.4.3" - jest-snapshot "^29.4.3" + expect "^29.5.0" + jest-snapshot "^29.5.0" -"@jest/fake-timers@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.3.tgz#31e982638c60fa657d310d4b9d24e023064027b0" - integrity sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw== +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.4.3" - jest-mock "^29.4.3" - jest-util "^29.4.3" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" -"@jest/globals@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.3.tgz#63a2c4200d11bc6d46f12bbe25b07f771fce9279" - integrity sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA== +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== dependencies: - "@jest/environment" "^29.4.3" - "@jest/expect" "^29.4.3" - "@jest/types" "^29.4.3" - jest-mock "^29.4.3" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" -"@jest/reporters@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.3.tgz#0a68a0c0f20554760cc2e5443177a0018969e353" - integrity sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg== +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" @@ -763,9 +752,9 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.4.3" - jest-util "^29.4.3" - jest-worker "^29.4.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" @@ -794,42 +783,42 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.3.tgz#e13d973d16c8c7cc0c597082d5f3b9e7f796ccb8" - integrity sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA== +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== dependencies: - "@jest/console" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.3.tgz#0862e876a22993385a0f3e7ea1cc126f208a2898" - integrity sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw== +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== dependencies: - "@jest/test-result" "^29.4.3" + "@jest/test-result" "^29.5.0" graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" + jest-haste-map "^29.5.0" slash "^3.0.0" -"@jest/transform@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.3.tgz#f7d17eac9cb5bb2e1222ea199c7c7e0835e0c037" - integrity sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg== +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" + jest-haste-map "^29.5.0" jest-regex-util "^29.4.3" - jest-util "^29.4.3" + jest-util "^29.5.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" @@ -869,10 +858,10 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.3.tgz#9069145f4ef09adf10cec1b2901b2d390031431f" - integrity sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA== +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== dependencies: "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" @@ -898,7 +887,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -916,7 +905,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== @@ -937,7 +926,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.15": +"@jridgewell/trace-mapping@^0.3.15": version "0.3.15" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== @@ -945,6 +934,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz#0300943770e04231041a51bd39f0439b5c7ab4f0" @@ -985,6 +982,11 @@ strict-event-emitter "^0.2.4" web-encoding "^1.1.5" +"@noble/hashes@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + "@noble/secp256k1@^1.7.1": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -1016,23 +1018,25 @@ resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== -"@playwright/test@^1.30.0": - version "1.30.0" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.30.0.tgz#8c0c4930ff2c7be7b3ec3fd434b2a3b4465ed7cb" - integrity sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw== +"@playwright/test@^1.31.1": + version "1.31.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.31.1.tgz#39d6873dc46af135f12451d79707db7d1357455d" + integrity sha512-IsytVZ+0QLDh1Hj83XatGp/GsI1CDJWbyDaBGbainsh0p2zC7F4toUocqowmjS6sQff2NGT3D9WbDj/3K2CJiA== dependencies: "@types/node" "*" - playwright-core "1.30.0" + playwright-core "1.31.1" + optionalDependencies: + fsevents "2.3.2" "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== -"@remix-run/router@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.2.tgz#58cd2bd25df2acc16c628e1b6f6150ea6c7455bc" - integrity sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA== +"@remix-run/router@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.3.tgz#d6d531d69c0fa3a44fda7dc00b20d49b44549164" + integrity sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w== "@sinclair/typebox@^0.24.1": version "0.24.20" @@ -1206,18 +1210,17 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@trivago/prettier-plugin-sort-imports@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.0.0.tgz#e0936d87fb8d65865c857e6a6dba644103db1b30" - integrity sha512-Tyuk5ZY4a0e2MNFLdluQO9F6d1awFQYXVVujEPFfvKPPXz8DADNHzz73NMhwCSXGSuGGZcA/rKOyZBrxVNMxaA== +"@trivago/prettier-plugin-sort-imports@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.1.1.tgz#71c3c1ae770c3738b6fc85710714844477574ffd" + integrity sha512-dQ2r2uzNr1x6pJsuh/8x0IRA3CBUB+pWEW3J/7N98axqt7SQSm+2fy0FLNXvXGg77xEDC7KHxJlHfLYyi7PDcw== dependencies: - "@babel/core" "7.17.8" "@babel/generator" "7.17.7" - "@babel/parser" "7.18.9" + "@babel/parser" "^7.20.5" "@babel/traverse" "7.17.3" "@babel/types" "7.17.0" javascript-natural-sort "0.7.1" - lodash "4.17.21" + lodash "^4.17.21" "@trysound/sax@0.2.0": version "0.2.0" @@ -1323,10 +1326,10 @@ dependencies: "@types/node" "*" -"@types/chrome@^0.0.218": - version "0.0.218" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.218.tgz#d354cf0ac85204c17cfbe03ba7eb8f58c75d03a4" - integrity sha512-GC/c9B3Eo3h3l+fV5G6A9cRMEZOYo46E21mjHHfkXz+/A5uypXstMVAMk04IeGY2DJ7PxVxbn26oFBPZOa4Dkw== +"@types/chrome@^0.0.224": + version "0.0.224" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.224.tgz#0138497299eaaf261d61ece62d7d6af3868ce856" + integrity sha512-YkL7q3KDV7OAKgVCBNIfH73rnjNMbIzAYHzTa2DKhSK/2z0Wf/n8yJnK/UoW+lvuYJJR4LtAkG3YvsIZTy7BOA== dependencies: "@types/filesystem" "*" "@types/har-format" "*" @@ -1697,10 +1700,10 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== -"@types/uuid@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.0.tgz#53ef263e5239728b56096b0a869595135b7952d2" - integrity sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q== +"@types/uuid@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.1.tgz#98586dc36aee8dacc98cc396dbca8d0429647aa6" + integrity sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA== "@types/webextension-polyfill@^0.10.0": version "0.10.0" @@ -1747,14 +1750,14 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz#5fb0d43574c2411f16ea80f5fc335b8eaa7b28a8" - integrity sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg== +"@typescript-eslint/eslint-plugin@^5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e" + integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== dependencies: - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/type-utils" "5.52.0" - "@typescript-eslint/utils" "5.52.0" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/type-utils" "5.54.1" + "@typescript-eslint/utils" "5.54.1" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -1763,72 +1766,72 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.52.0.tgz#73c136df6c0133f1d7870de7131ccf356f5be5a4" - integrity sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA== +"@typescript-eslint/parser@^5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.54.1.tgz#05761d7f777ef1c37c971d3af6631715099b084c" + integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg== dependencies: - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/typescript-estree" "5.52.0" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz#a993d89a0556ea16811db48eabd7c5b72dcb83d1" - integrity sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw== +"@typescript-eslint/scope-manager@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" + integrity sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg== dependencies: - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/visitor-keys" "5.52.0" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" -"@typescript-eslint/type-utils@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz#9fd28cd02e6f21f5109e35496df41893f33167aa" - integrity sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw== +"@typescript-eslint/type-utils@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" + integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== dependencies: - "@typescript-eslint/typescript-estree" "5.52.0" - "@typescript-eslint/utils" "5.52.0" + "@typescript-eslint/typescript-estree" "5.54.1" + "@typescript-eslint/utils" "5.54.1" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.52.0.tgz#19e9abc6afb5bd37a1a9bea877a1a836c0b3241b" - integrity sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ== +"@typescript-eslint/types@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" + integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== -"@typescript-eslint/typescript-estree@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz#6408cb3c2ccc01c03c278cb201cf07e73347dfca" - integrity sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ== +"@typescript-eslint/typescript-estree@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz#df7b6ae05fd8fef724a87afa7e2f57fa4a599be1" + integrity sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg== dependencies: - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/visitor-keys" "5.52.0" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.52.0.tgz#b260bb5a8f6b00a0ed51db66bdba4ed5e4845a72" - integrity sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA== +"@typescript-eslint/utils@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" + integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/typescript-estree" "5.52.0" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz#e38c971259f44f80cfe49d97dbffa38e3e75030f" - integrity sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA== +"@typescript-eslint/visitor-keys@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz#d7a8a0f7181d6ac748f4d47b2306e0513b98bf8b" + integrity sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg== dependencies: - "@typescript-eslint/types" "5.52.0" + "@typescript-eslint/types" "5.54.1" eslint-visitor-keys "^3.3.0" "@vespaiach/axios-fetch-adapter@^0.3.0": @@ -2368,13 +2371,13 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -autoprefixer@^10.4.13: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== +autoprefixer@^10.4.14: + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -2400,15 +2403,15 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" -babel-jest@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.3.tgz#478b84d430972b277ad67dd631be94abea676792" - integrity sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw== +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== dependencies: - "@jest/transform" "^29.4.3" + "@jest/transform" "^29.5.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.4.3" + babel-preset-jest "^29.5.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -2424,10 +2427,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.3.tgz#ad1dfb5d31940957e00410ef7d9b2aa94b216101" - integrity sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q== +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -2452,12 +2455,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.3.tgz#bb926b66ae253b69c6e3ef87511b8bb5c53c5b52" - integrity sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw== +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== dependencies: - babel-plugin-jest-hoist "^29.4.3" + babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -2636,15 +2639,15 @@ browserslist@^4.20.2: node-releases "^2.0.6" update-browserslist-db "^1.0.4" -browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" bs58@^4.0.0: version "4.0.1" @@ -2780,15 +2783,10 @@ caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001366: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001369.tgz#58ca6974acf839a72a02003258a005cbb0cb340d" integrity sha512-OY1SBHaodJc4wflDIKnlkdqWzJZd1Ls/2zbVJHBSv3AT7vgOJ58yAhd2CN4d57l2kPJrgMb7P9+N1Mhy4tNSQA== -caniuse-lite@^1.0.30001400: - version "1.0.30001419" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001419.tgz#3542722d57d567c8210d5e4d0f9f17336b776457" - integrity sha512-aFO1r+g6R7TW+PNQxKzjITwLOyDhVRLjW0LcwS/HCZGUUKTGNp9+IwLC4xyDSZBygVL/mxaFR3HIV6wEKQuSzw== - -caniuse-lite@^1.0.30001426: - version "1.0.30001431" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" - integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== +caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: + version "1.0.30001467" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001467.tgz#1afc9c16ed61f50dd87139da87ca43a3e0051c77" + integrity sha512-cEdN/5e+RPikvl9AHm4uuLXxeCNq8rFsQ+lPHTfe/OtypP3WwnVVbjn+6uBV7PaFL6xUFzTh+sSCOz1rKhcO+Q== chalk@4.1.1, chalk@^4.1.0: version "4.1.1" @@ -2798,6 +2796,11 @@ chalk@4.1.1, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2873,6 +2876,13 @@ chrome-trace-event@^1.0.2: resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chromium-bidi@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.4.tgz#44f25d4fa5d2f3debc3fc3948d0657194cac4407" + integrity sha512-4BX5cSaponuvVT1+SbLYTOAgDoVtX/Khoc9UsbFJ/AsPVUeFAM3RiIDFI6XFhLYMi9WmVJqh1ZH+dRpNKkKwiQ== + dependencies: + mitt "3.0.0" + ci-info@^3.2.0: version "3.3.2" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" @@ -3049,6 +3059,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" + integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3639,10 +3654,10 @@ detective@^5.2.1: defined "^1.0.0" minimist "^1.2.6" -devtools-protocol@0.0.1082910: - version "0.0.1082910" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1082910.tgz#d79490dc66ef23eb17a24423c9ce5ce661714a91" - integrity sha512-RqoZ2GmqaNxyx+99L/RemY5CkwG9D0WEfOKxekwCRXOGrDCep62ngezEJUVMq6rISYQ+085fJnWDQqGHlxVNww== +devtools-protocol@0.0.1094867: + version "0.0.1094867" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1094867.tgz#2ab93908e9376bd85d4e0604aa2651258f13e374" + integrity sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ== dexie@^3.2.3: version "3.2.3" @@ -3808,10 +3823,10 @@ electron-to-chromium@^1.4.118, electron-to-chromium@^1.4.188: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.199.tgz#e0384fde79fdda89880e8be58196a9153e04db3b" integrity sha512-WIGME0Cs7oob3mxsJwHbeWkH0tYkIE/sjkJ8ML2BYmuRcjhRl/q5kVDXG7W9LOOKwzPU5M0LBlXRq9rlSgnNlg== -electron-to-chromium@^1.4.251: - version "1.4.283" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.283.tgz#d4f263f5df402fd799c0a06255d580dcf8aa9a8e" - integrity sha512-g6RQ9zCOV+U5QVHW9OpFR7rdk/V7xfopNXnyAamdpFgCHgZ1sjI8VuR1+zG2YG/TZk+tQ8mpNkug4P8FU0fuOA== +electron-to-chromium@^1.4.284: + version "1.4.333" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.333.tgz#ebb21f860f8a29923717b06ec0cb54e77ed34c04" + integrity sha512-YyE8+GKyGtPEP1/kpvqsdhD6rA/TP1DUFDN4uiU/YI52NzDxmwHkEb3qjId8hLBa5siJvG0sfC3O66501jMruQ== elliptic@^6.5.4: version "6.5.4" @@ -4071,10 +4086,10 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^8.6.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" - integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== +eslint-config-prettier@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz#f1cc58a8afebc50980bd53475451df146c13182d" + integrity sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA== eslint-import-resolver-node@^0.3.7: version "0.3.7" @@ -4172,12 +4187,13 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^8.34.0: - version "8.34.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.34.0.tgz#fe0ab0ef478104c1f9ebc5537e303d25a8fb22d6" - integrity sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg== +eslint@^8.35.0: + version "8.35.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.35.0.tgz#fffad7c7e326bae606f0e8f436a6158566d42323" + integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw== dependencies: - "@eslint/eslintrc" "^1.4.1" + "@eslint/eslintrc" "^2.0.0" + "@eslint/js" "8.35.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -4191,7 +4207,7 @@ eslint@^8.34.0: eslint-utils "^3.0.0" eslint-visitor-keys "^3.3.0" espree "^9.4.0" - esquery "^1.4.0" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" @@ -4226,15 +4242,24 @@ espree@^9.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" +espree@^9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.0.tgz#3646d4e3f58907464edba852fa047e6a27bdf113" + integrity sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -4295,14 +4320,14 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" - integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== +execa@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== dependencies: cross-spawn "^7.0.3" get-stream "^6.0.1" - human-signals "^3.0.1" + human-signals "^4.3.0" is-stream "^3.0.0" merge-stream "^2.0.0" npm-run-path "^5.1.0" @@ -4325,16 +4350,16 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.3.tgz#5e47757316df744fe3b8926c3ae8a3ebdafff7fe" - integrity sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg== +expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== dependencies: - "@jest/expect-utils" "^29.4.3" + "@jest/expect-utils" "^29.5.0" jest-get-type "^29.4.3" - jest-matcher-utils "^29.4.3" - jest-message-util "^29.4.3" - jest-util "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" express@^4.17.3: version "4.17.3" @@ -4620,7 +4645,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@2.3.2, fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -5032,10 +5057,10 @@ html-webpack-plugin@^5.5.0: pretty-error "^4.0.0" tapable "^2.0.0" -html5-qrcode@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/html5-qrcode/-/html5-qrcode-2.3.6.tgz#95f572fd79b84cbce0e509da80eda43a394cec3c" - integrity sha512-yuCJUFzm04xGPM2a40XYPptpioV6K5uJA3Ogy0Xi/a7tAYrcD7T4ZCsbg0T1H2qX/143SZfDG1EINnNFh5rH0A== +html5-qrcode@^2.3.7: + version "2.3.7" + resolved "https://registry.yarnpkg.com/html5-qrcode/-/html5-qrcode-2.3.7.tgz#09ed2ca7473a47bd551088c15fcfcb7cb409a5be" + integrity sha512-Jmlok9Ynm49hgVXkdupWryf8o430proIFoQsRl1LmTg4Rq461W72omylR9yw9tsEMtswMEw3wacUM5y0agOBQA== htmlparser2@^6.1.0: version "6.1.0" @@ -5120,10 +5145,10 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" - integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== +human-signals@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.0.tgz#2095c3cd5afae40049403d4b811235b03879db50" + integrity sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ== husky@^8.0.3: version "8.0.3" @@ -5643,82 +5668,83 @@ javascript-natural-sort@0.7.1: resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== -jest-changed-files@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.3.tgz#7961fe32536b9b6d5c28dfa0abcfab31abcf50a7" - integrity sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ== +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.3.tgz#fff7be1cf5f06224dd36a857d52a9efeb005ba04" - integrity sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw== +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== dependencies: - "@jest/environment" "^29.4.3" - "@jest/expect" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^29.4.3" - jest-matcher-utils "^29.4.3" - jest-message-util "^29.4.3" - jest-runtime "^29.4.3" - jest-snapshot "^29.4.3" - jest-util "^29.4.3" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" p-limit "^3.1.0" - pretty-format "^29.4.3" + pretty-format "^29.5.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.3.tgz#fe31fdd0c90c765f392b8b7c97e4845071cd2163" - integrity sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg== +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== dependencies: - "@jest/core" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.4.3" - jest-util "^29.4.3" - jest-validate "^29.4.3" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.3.tgz#fca9cdfe6298ae6d04beef1624064d455347c978" - integrity sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ== +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.4.3" - "@jest/types" "^29.4.3" - babel-jest "^29.4.3" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.4.3" - jest-environment-node "^29.4.3" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" jest-get-type "^29.4.3" jest-regex-util "^29.4.3" - jest-resolve "^29.4.3" - jest-runner "^29.4.3" - jest-util "^29.4.3" - jest-validate "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.4.3" + pretty-format "^29.5.0" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -5732,15 +5758,15 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-diff@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.3.tgz#42f4eb34d0bf8c0fb08b0501069b87e8e84df347" - integrity sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA== +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== dependencies: chalk "^4.0.0" diff-sequences "^29.4.3" jest-get-type "^29.4.3" - pretty-format "^29.4.3" + pretty-format "^29.5.0" jest-docblock@^29.4.3: version "29.4.3" @@ -5749,42 +5775,42 @@ jest-docblock@^29.4.3: dependencies: detect-newline "^3.0.0" -jest-each@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.3.tgz#a434c199a2f6151c5e3dc80b2d54586bdaa72819" - integrity sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q== +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" chalk "^4.0.0" jest-get-type "^29.4.3" - jest-util "^29.4.3" - pretty-format "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" -jest-environment-jsdom@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.4.3.tgz#bd8ed3808e6d3f616403fbaf8354f77019613d90" - integrity sha512-rFjf8JXrw3OjUzzmSE5l0XjMj0/MSVEUMCSXBGPDkfwb1T03HZI7iJSL0cGctZApPSyJxbjyKDVxkZuyhHkuTw== +jest-environment-jsdom@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" + integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== dependencies: - "@jest/environment" "^29.4.3" - "@jest/fake-timers" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^29.4.3" - jest-util "^29.4.3" + jest-mock "^29.5.0" + jest-util "^29.5.0" jsdom "^20.0.0" -jest-environment-node@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.3.tgz#579c4132af478befc1889ddc43c2413a9cdbe014" - integrity sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg== +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== dependencies: - "@jest/environment" "^29.4.3" - "@jest/fake-timers" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^29.4.3" - jest-util "^29.4.3" + jest-mock "^29.5.0" + jest-util "^29.5.0" jest-get-type@^27.5.1: version "27.5.1" @@ -5796,32 +5822,32 @@ jest-get-type@^29.4.3: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== -jest-haste-map@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.3.tgz#085a44283269e7ace0645c63a57af0d2af6942e2" - integrity sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ== +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" jest-regex-util "^29.4.3" - jest-util "^29.4.3" - jest-worker "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.3.tgz#2b35191d6b35aa0256e63a9b79b0f949249cf23a" - integrity sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA== +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== dependencies: jest-get-type "^29.4.3" - pretty-format "^29.4.3" + pretty-format "^29.5.0" jest-matcher-utils@^27.0.0: version "27.5.1" @@ -5833,39 +5859,39 @@ jest-matcher-utils@^27.0.0: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz#ea68ebc0568aebea4c4213b99f169ff786df96a0" - integrity sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg== +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: chalk "^4.0.0" - jest-diff "^29.4.3" + jest-diff "^29.5.0" jest-get-type "^29.4.3" - pretty-format "^29.4.3" + pretty-format "^29.5.0" -jest-message-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.3.tgz#65b5280c0fdc9419503b49d4f48d4999d481cb5b" - integrity sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw== +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.4.3" + pretty-format "^29.5.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.3.tgz#23d84a20a74cdfff0510fdbeefb841ed57b0fe7e" - integrity sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg== +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-util "^29.4.3" + jest-util "^29.5.0" jest-pnp-resolver@^1.2.2: version "1.2.2" @@ -5877,88 +5903,88 @@ jest-regex-util@^29.4.3: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== -jest-resolve-dependencies@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.3.tgz#9ad7f23839a6d88cef91416bda9393a6e9fd1da5" - integrity sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw== +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== dependencies: jest-regex-util "^29.4.3" - jest-snapshot "^29.4.3" + jest-snapshot "^29.5.0" -jest-resolve@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.3.tgz#3c5b5c984fa8a763edf9b3639700e1c7900538e2" - integrity sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw== +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" + jest-haste-map "^29.5.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.4.3" - jest-validate "^29.4.3" + jest-util "^29.5.0" + jest-validate "^29.5.0" resolve "^1.20.0" resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.3.tgz#68dc82c68645eda12bea42b5beece6527d7c1e5e" - integrity sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA== - dependencies: - "@jest/console" "^29.4.3" - "@jest/environment" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" jest-docblock "^29.4.3" - jest-environment-node "^29.4.3" - jest-haste-map "^29.4.3" - jest-leak-detector "^29.4.3" - jest-message-util "^29.4.3" - jest-resolve "^29.4.3" - jest-runtime "^29.4.3" - jest-util "^29.4.3" - jest-watcher "^29.4.3" - jest-worker "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.3.tgz#f25db9874dcf35a3ab27fdaabca426666cc745bf" - integrity sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q== +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== dependencies: - "@jest/environment" "^29.4.3" - "@jest/fake-timers" "^29.4.3" - "@jest/globals" "^29.4.3" + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" - jest-message-util "^29.4.3" - jest-mock "^29.4.3" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" jest-regex-util "^29.4.3" - jest-resolve "^29.4.3" - jest-snapshot "^29.4.3" - jest-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.3.tgz#183d309371450d9c4a3de7567ed2151eb0e91145" - integrity sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw== +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -5966,23 +5992,22 @@ jest-snapshot@^29.4.3: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.4.3" + expect "^29.5.0" graceful-fs "^4.2.9" - jest-diff "^29.4.3" + jest-diff "^29.5.0" jest-get-type "^29.4.3" - jest-haste-map "^29.4.3" - jest-matcher-utils "^29.4.3" - jest-message-util "^29.4.3" - jest-util "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" natural-compare "^1.4.0" - pretty-format "^29.4.3" + pretty-format "^29.5.0" semver "^7.3.5" jest-util@^29.1.2: @@ -5997,48 +6022,48 @@ jest-util@^29.1.2: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.3.tgz#851a148e23fc2b633c55f6dad2e45d7f4579f496" - integrity sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q== +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.3.tgz#a13849dec4f9e95446a7080ad5758f58fa88642f" - integrity sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw== +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^29.4.3" leven "^3.1.0" - pretty-format "^29.4.3" + pretty-format "^29.5.0" -jest-watcher@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.3.tgz#e503baa774f0c2f8f3c8db98a22ebf885f19c384" - integrity sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA== +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== dependencies: - "@jest/test-result" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.4.3" + jest-util "^29.5.0" string-length "^4.0.1" -jest-webextension-mock@^3.8.8: - version "3.8.8" - resolved "https://registry.yarnpkg.com/jest-webextension-mock/-/jest-webextension-mock-3.8.8.tgz#30d825d73c274a4fd531bda48f050a6e142a5d11" - integrity sha512-W3Yi/+zIgoUayVikGBZcZp+RrBy0h0Ol3Fy6+a72b6GaezXKFcZmTj9sE77E3BJ6Y0UifLuR3fImo5+D4jp+ww== +jest-webextension-mock@^3.8.9: + version "3.8.9" + resolved "https://registry.yarnpkg.com/jest-webextension-mock/-/jest-webextension-mock-3.8.9.tgz#f8f90357e077b5ae8faecfb2a5ae39639cb07e92" + integrity sha512-PglflLBEhqAtfKOmwEcP2iV2YdQK3Xwa7e/SELIK/4+y1NiKSJnba7DdPe32HavHJCJwuL8bpVwFrxGZFD2m+A== jest-worker@^27.0.2: version "27.0.2" @@ -6068,25 +6093,25 @@ jest-worker@^29.1.2: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.3.tgz#9a4023e1ea1d306034237c7133d7da4240e8934e" - integrity sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA== +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== dependencies: "@types/node" "*" - jest-util "^29.4.3" + jest-util "^29.5.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.3.tgz#1b8be541666c6feb99990fd98adac4737e6e6386" - integrity sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA== +jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== dependencies: - "@jest/core" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" import-local "^3.0.2" - jest-cli "^29.4.3" + jest-cli "^29.5.0" js-levenshtein@^1.1.6: version "1.1.6" @@ -6183,11 +6208,16 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.1: +json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonc-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" @@ -6263,10 +6293,10 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lilconfig@2.0.6, lilconfig@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" - integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== +lilconfig@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lilconfig@^2.0.3: version "2.0.3" @@ -6278,53 +6308,59 @@ lilconfig@^2.0.5: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== +lilconfig@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.1.2.tgz#443636a0cfd834d5518d57d228130dc04c83d6fb" - integrity sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w== +lint-staged@^13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.0.tgz#b7abaf79c91cd36d824f17b23a4ce5209206126a" + integrity sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw== dependencies: + chalk "5.2.0" cli-truncate "^3.1.0" - colorette "^2.0.19" - commander "^9.4.1" + commander "^10.0.0" debug "^4.3.4" - execa "^6.1.0" - lilconfig "2.0.6" - listr2 "^5.0.5" + execa "^7.0.0" + lilconfig "2.1.0" + listr2 "^5.0.7" micromatch "^4.0.5" normalize-path "^3.0.0" - object-inspect "^1.12.2" + object-inspect "^1.12.3" pidtree "^0.6.0" string-argv "^0.3.1" - yaml "^2.1.3" + yaml "^2.2.1" -listr2@^5.0.5: - version "5.0.6" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.6.tgz#3c61153383869ffaad08a8908d63edfde481dff8" - integrity sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag== +listr2@^5.0.7: + version "5.0.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" + integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== dependencies: cli-truncate "^2.1.0" colorette "^2.0.19" log-update "^4.0.0" p-map "^4.0.0" rfdc "^1.3.0" - rxjs "^7.5.7" + rxjs "^7.8.0" through "^2.3.8" wrap-ansi "^7.0.0" -lnmessage@^0.0.19: - version "0.0.19" - resolved "https://registry.yarnpkg.com/lnmessage/-/lnmessage-0.0.19.tgz#269b47b7c806fdc0002953ed133e287ec3395765" - integrity sha512-WnDG82Imis42duRblXVfi6geyjDbdcSDwETDb+ZveKgpe8/kEbdSg8r/wxD2znNUwuCXdbSxdck/aaFrCWc1Rw== +lnmessage@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lnmessage/-/lnmessage-0.1.0.tgz#b5250744aff960a6ec7cdadf61612e81a74f5f2a" + integrity sha512-WyX/cTjLYX0gTBLatcAVMFPsBXwM//SqDx7qwa4KtL0RTiWkwLQ+Z/H8XFUAcd2/d9v1ou+pDUG05LiuRn4P9A== dependencies: + "@noble/hashes" "^1.2.0" buffer "^6.0.3" - crypto-js "^4.1.1" rxjs "^7.5.7" - secp256k1 "^4.0.3" + secp256k1 "^5.0.0" + ws "^8.12.1" loader-runner@^4.2.0: version "4.2.0" @@ -6450,7 +6486,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6673,10 +6709,10 @@ min-indent@^1.0.0, min-indent@^1.0.1: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -mini-css-extract-plugin@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz#e049d3ea7d3e4e773aad585c6cb329ce0c7b72d7" - integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== +mini-css-extract-plugin@^2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.3.tgz#794aa4d598bf178a66b2a35fe287c3df3eac394e" + integrity sha512-CD9cXeKeXLcnMw8FZdtfrRrLaM7gwCl4nKuKn2YkY2Bw5wdlB8zU2cCzw+w2zS9RFvbrufTBkMCJACNPwqQA0w== dependencies: schema-utils "^4.0.0" @@ -6716,6 +6752,11 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +mitt@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" + integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== + mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" @@ -6741,10 +6782,10 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -msw@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/msw/-/msw-1.0.1.tgz#f55b36b3d7e911ee75a73d6346585e01af3fbcfb" - integrity sha512-fBwQRCmf+jh0zlGlasBfpCaxLqb4QLMsY1Q+nkXkO0nnUYopl50NcNRvP4V+TAiqOwJSd0LrQ5NcJqwbrnTBqw== +msw@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/msw/-/msw-1.1.0.tgz#f88806b7ce4cade89b5bf629fa98c17218a4f036" + integrity sha512-oqMvUXm1bMbwvGpoXAQVz8vXXQyQyx52HBDg3EDOK+dFXkQHssgkXEG4LfMwwZyr2Qt18I/w04XPaY4BkFTkzA== dependencies: "@mswjs/cookies" "^0.2.2" "@mswjs/interceptors" "^0.17.5" @@ -6822,6 +6863,11 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + node-fetch@2.6.7, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -6854,6 +6900,11 @@ node-releases@^2.0.3, node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -6945,6 +6996,11 @@ object-inspect@^1.12.2: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -7310,10 +7366,10 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -playwright-core@1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.30.0.tgz#de987cea2e86669e3b85732d230c277771873285" - integrity sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g== +playwright-core@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.31.1.tgz#4deeebbb8fb73b512593fe24bea206d8fd85ff7f" + integrity sha512-JTyX4kV3/LXsvpHkLzL2I36aCdml4zeE35x+G5aPc4bkLsiRiQshU5lWeVpHFAuC8xAcbI6FDcw/8z3q2xtJSQ== postcss-calc@^8.2.3: version "8.2.4" @@ -7729,10 +7785,10 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" - integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== dependencies: "@jest/schemas" "^29.4.3" ansi-styles "^5.0.0" @@ -7825,14 +7881,15 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -puppeteer-core@19.6.3: - version "19.6.3" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.6.3.tgz#e3334fbb4ccb2c1ca6f4597e2f082de5a80599da" - integrity sha512-8MbhioSlkDaHkmolpQf9Z7ui7jplFfOFTnN8d5kPsCazRRTNIH6/bVxPskn0v5Gh9oqOBlknw0eHH0/OBQAxpQ== +puppeteer-core@19.7.2: + version "19.7.2" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.7.2.tgz#deee9ef915829b6a1d1a3a008625c29eeb251161" + integrity sha512-PvI+fXqgP0uGJxkyZcX51bnzjFA73MODZOAv0fSD35yR7tvbqwtMV3/Y+hxQ0AMMwzxkEebP6c7po/muqxJvmQ== dependencies: + chromium-bidi "0.4.4" cross-fetch "3.1.5" debug "4.3.4" - devtools-protocol "0.0.1082910" + devtools-protocol "0.0.1094867" extract-zip "2.0.1" https-proxy-agent "5.0.1" proxy-from-env "1.1.0" @@ -7841,16 +7898,21 @@ puppeteer-core@19.6.3: unbzip2-stream "1.4.3" ws "8.11.0" -puppeteer@^19.6.3: - version "19.6.3" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.6.3.tgz#4edc7ea87f7e7e7b2885395326a6c9e5a222a10b" - integrity sha512-K03xTtGDwS6cBXX/EoqoZxglCUKcX2SLIl92fMnGMRjYpPGXoAV2yKEh3QXmXzKqfZXd8TxjjFww+tEttWv8kw== +puppeteer@^19.7.2: + version "19.7.2" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.7.2.tgz#1b3ce99a093cc2f8f84dfb06f066d0757ea79d4b" + integrity sha512-4Lm7Qpe/LU95Svirei/jDLDvR5oMrl9BPGd7HMY5+Q28n+BhvKuW97gKkR+1LlI86bO8J3g8rG/Ll5kv9J1nlQ== dependencies: cosmiconfig "8.0.0" https-proxy-agent "5.0.1" progress "2.0.3" proxy-from-env "1.1.0" - puppeteer-core "19.6.3" + puppeteer-core "19.7.2" + +pure-rand@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.1.tgz#31207dddd15d43f299fdcdb2f572df65030c19af" + integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg== q@^1.5.1: version "1.5.1" @@ -7919,10 +7981,10 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-i18next@^12.1.5: - version "12.1.5" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.1.5.tgz#b65f5733dd2f96188a9359c009b7dbe27443f009" - integrity sha512-7PQAv6DA0TcStG96fle+8RfTwxVbHVlZZJPoEszwUNvDuWpGldJmNWa3ZPesEsZQZGF6GkzwvEh6p57qpFD2gQ== +react-i18next@^12.2.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.2.0.tgz#010e3f6070b8d700442947233352ebe4b252d7a1" + integrity sha512-5XeVgSygaGfyFmDd2WcXvINRw2WEC1XviW1LXY/xLOEMzsCFRwKqfnHN+hUjla8ZipbVJR27GCMSuTr0BhBBBQ== dependencies: "@babel/runtime" "^7.20.6" html-parse-stringify "^3.0.1" @@ -7947,10 +8009,10 @@ react-lifecycles-compat@^3.0.0: resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-loading-skeleton@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/react-loading-skeleton/-/react-loading-skeleton-3.1.1.tgz#50cc5302d2e48d6cd419973a5c981a76fe9a15f4" - integrity sha512-gQeNzzKXlevvquRDOhN5kas5VE7toTKrpmE9BpUdf0iip9c5ae0LcVbulh5ebO2CFl4RrYsyLuDtYGyrh1h1iA== +react-loading-skeleton@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-loading-skeleton/-/react-loading-skeleton-3.2.0.tgz#c79f1390195bcd8625c30e68454a1b95508a9c74" + integrity sha512-kN12x4Ud69jbksr2EdhYywAFeW4bPdvFQ9p3ID1OM/QeFjgwFSmSUY2a6P6uOb5ACzWp3ozY8C+7+04KR6+PHA== react-modal@^3.16.1: version "3.16.1" @@ -7970,20 +8032,20 @@ react-qr-code@^2.0.11: prop-types "^15.8.1" qr.js "0.0.0" -react-router-dom@^6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.1.tgz#7e136b67d9866f55999e9a8482c7008e3c575ac9" - integrity sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ== +react-router-dom@^6.8.2: + version "6.8.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.2.tgz#a6654a3400be9aafd504d7125573568921b78b57" + integrity sha512-N/oAF1Shd7g4tWy+75IIufCGsHBqT74tnzHQhbiUTYILYF0Blk65cg+HPZqwC+6SqEyx033nKqU7by38v3lBZg== dependencies: - "@remix-run/router" "1.3.2" - react-router "6.8.1" + "@remix-run/router" "1.3.3" + react-router "6.8.2" -react-router@6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.1.tgz#e362caf93958a747c649be1b47cd505cf28ca63e" - integrity sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg== +react-router@6.8.2: + version "6.8.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.2.tgz#98f83582a73f316a3287118b440f0cee30ed6f33" + integrity sha512-lF7S0UmXI5Pd8bmHvMdPKI4u4S5McxmHnzJhrYi9ZQ6wE+DA8JN5BzVC5EEBuduWWDaiJ8u6YhVOCmThBli+rw== dependencies: - "@remix-run/router" "1.3.2" + "@remix-run/router" "1.3.3" react-toastify@^9.1.1: version "9.1.1" @@ -8299,6 +8361,13 @@ rxjs@^7.5.7: dependencies: tslib "^2.1.0" +rxjs@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -8331,10 +8400,10 @@ sass-loader@^13.2.0: klona "^2.0.4" neo-async "^2.6.2" -sass@^1.58.0: - version "1.58.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.0.tgz#ee8aea3ad5ea5c485c26b3096e2df6087d0bb1cc" - integrity sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg== +sass@^1.58.3: + version "1.58.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d" + integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -8382,7 +8451,7 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.0.0" -secp256k1@^4.0.2, secp256k1@^4.0.3: +secp256k1@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== @@ -8391,6 +8460,15 @@ secp256k1@^4.0.2, secp256k1@^4.0.3: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" +secp256k1@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.0.tgz#be6f0c8c7722e2481e9773336d351de8cddd12f7" + integrity sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^5.0.0" + node-gyp-build "^4.2.0" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" @@ -8460,6 +8538,13 @@ serialize-javascript@^6.0.0: dependencies: randombytes "^2.1.0" +serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" @@ -8947,10 +9032,10 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tailwindcss@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.6.tgz#9bedbc744a4a85d6120ce0cc3db024c551a5c733" - integrity sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw== +tailwindcss@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.7.tgz#5936dd08c250b05180f0944500c01dce19188c07" + integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ== dependencies: arg "^5.0.2" chokidar "^3.5.3" @@ -9014,18 +9099,18 @@ terser-webpack-plugin@^5.1.3: source-map "^0.6.1" terser "^5.7.0" -terser-webpack-plugin@^5.3.6: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== +terser-webpack-plugin@^5.3.7: + version "5.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" -terser@^5.10.0, terser@^5.14.1, terser@^5.7.0: +terser@^5.10.0, terser@^5.7.0: version "5.14.2" resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== @@ -9035,6 +9120,16 @@ terser@^5.10.0, terser@^5.14.1, terser@^5.7.0: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.16.5: + version "5.16.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.6.tgz#f6c7a14a378ee0630fbe3ac8d1f41b4681109533" + integrity sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -9162,14 +9257,14 @@ ts-node@^10.8.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tsconfig-paths-webpack-plugin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz#84008fc3e3e0658fdb0262758b07b4da6265ff1a" - integrity sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ== +tsconfig-paths-webpack-plugin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz#a24651d0f69668a1abad38d3c2489855c257460d" + integrity sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw== dependencies: chalk "^4.1.0" enhanced-resolve "^5.7.0" - tsconfig-paths "^4.0.0" + tsconfig-paths "^4.1.2" tsconfig-paths@^3.14.1: version "3.14.1" @@ -9181,12 +9276,12 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz#1082f5d99fd127b72397eef4809e4dd06d229b64" - integrity sha512-SLBg2GBKlR6bVtMgJJlud/o3waplKtL7skmLkExomIiaAtLGtVsoXIqP3SYdjbcH9lq/KVv7pMZeCBpLYOit6Q== +tsconfig-paths@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz#4819f861eef82e6da52fb4af1e8c930a39ed979a" + integrity sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw== dependencies: - json5 "^2.2.1" + json5 "^2.2.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -9351,18 +9446,18 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -update-browserslist-db@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" picocolors "^1.0.0" -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -9633,10 +9728,10 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.75.0: - version "5.75.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" - integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== +webpack@^5.76.1: + version "5.76.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c" + integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" @@ -9817,6 +9912,11 @@ ws@^7.3.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.12.1: + version "8.12.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" + integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== + ws@^8.4.2: version "8.5.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" @@ -9862,10 +9962,10 @@ yaml@^2.1.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.1.tgz#1e06fb4ca46e60d9da07e4f786ea370ed3c3cfec" integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw== -yaml@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207" - integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== +yaml@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== yargs-parser@^20.2.3, yargs-parser@^20.2.9: version "20.2.9"