From 9ed8f538bc786a6483c53814f7893670cfb2c8ad Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 29 Aug 2024 13:44:38 +0300 Subject: [PATCH 01/58] refactor current selected wallet prop --- packages/yoroi-extension/app/Routes.js | 14 +- .../UI/features/governace/common/helpers.ts | 60 ------ .../portfolio/common/helpers/constants.ts | 2 + .../UI/features/portfolio/common/mockData.ts | 20 +- .../features/portfolio/common/types/index.ts | 2 +- .../useCases/TokenDetails/TokenDetails.tsx | 2 +- .../portfolio/useCases/Wallet/StatsTable.tsx | 2 +- .../app/UI/utils/createCurrentWalletInfo.ts | 179 ++++++++++++++++++ .../app/stores/stateless/sidebarCategories.js | 2 +- .../webpack-mv2/commonConfig.js | 1 + 10 files changed, 208 insertions(+), 76 deletions(-) delete mode 100644 packages/yoroi-extension/app/UI/features/governace/common/helpers.ts create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/helpers/constants.ts create mode 100644 packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index dd24adae2f..eb328c1c87 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -30,7 +30,7 @@ import RestoreWalletPage, { RestoreWalletPagePromise } from './containers/wallet // New UI pages // $FlowIgnore: suppressing this error -import { createCurrrentWalletInfo } from './UI/features/governace/common/helpers'; +import { createCurrrentWalletInfo } from './UI/utils/createCurrentWalletInfo'; // $FlowIgnore: suppressing this error import { GovernanceContextProvider } from './UI/features/governace/module/GovernanceContextProvider'; // $FlowIgnore: suppressing this error @@ -562,9 +562,19 @@ export function wrapGovernance(governanceProps: StoresAndActionsProps, children: ); } export function wrapPortfolio(portfolioProps: StoresAndActionsProps, children: Node): Node { + const currentWalletInfo = createCurrrentWalletInfo(portfolioProps.stores); + + console.log('currentWalletInfo', currentWalletInfo); + return ( - {children} + + {children} + ); } diff --git a/packages/yoroi-extension/app/UI/features/governace/common/helpers.ts b/packages/yoroi-extension/app/UI/features/governace/common/helpers.ts deleted file mode 100644 index 3c94a962af..0000000000 --- a/packages/yoroi-extension/app/UI/features/governace/common/helpers.ts +++ /dev/null @@ -1,60 +0,0 @@ -export const mapStakingKeyStateToGovernanceAction = (state: any) => { - if (!state.drepDelegation) return null; - const vote = state.drepDelegation; - return vote.action === 'abstain' - ? { kind: 'abstain' } - : vote.action === 'no-confidence' - ? { kind: 'no-confidence' } - : { kind: 'delegate', drepID: vote.drepID }; -}; - -const getStakePoolMeta = (stores: any) => { - const publicDeriver = stores.wallets.selected; - const delegationStore = stores.delegation; - const currentPool = delegationStore.getDelegatedPoolId(publicDeriver); - if (currentPool == null) return null; - const networkInfo = publicDeriver.getParent().getNetworkInfo(); - const poolMeta = delegationStore.getLocalPoolInfo(networkInfo, currentPool); - const poolInfo = delegationStore.getLocalRemotePoolInfo(networkInfo, currentPool) ?? {}; - if (poolMeta == null) { - // server hasn't returned information about the stake pool yet - return null; - } - const name = poolMeta.info?.name ?? 'unknown'; - const delegatedPool = { - id: String(currentPool), - name, - websiteUrl: poolMeta.info?.homepage, - ticker: poolMeta.info?.ticker, - ...poolInfo, - }; - - return { - ...delegatedPool, - ...poolMeta, - }; -}; - -export const createCurrrentWalletInfo = (stores: any) => { - const { wallets } = stores; - const walletCurrentPoolInfo = getStakePoolMeta(stores); - - const selectedWallet = wallets.selected; - if (selectedWallet == null) { - throw new Error(`no selected Wallet. Should never happen`); - } - - const currentWalletId = selectedWallet.getPublicDeriverId(); - const networkInfo = selectedWallet.getParent().getNetworkInfo(); - const networkId = networkInfo.NetworkId; - const backendService = selectedWallet.getParent().getNetworkInfo().Backend.BackendService; - const backendServiceZero = selectedWallet.getParent().getNetworkInfo().Backend.BackendServiceZero; - return { - currentPool: walletCurrentPoolInfo, - networkId, - walletId: currentWalletId, - selectedWallet: selectedWallet, - backendService, - backendServiceZero, - }; -}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/constants.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/constants.ts new file mode 100644 index 0000000000..9049e8dfe9 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/constants.ts @@ -0,0 +1,2 @@ +export const cardanoAdaBase64Logo: string = + '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'; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/mockData.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/mockData.ts index 7833b97b5a..a35170768a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/mockData.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/mockData.ts @@ -30,7 +30,7 @@ const mockData = { '1W': 10 * Math.random(), '1M': 10 * Math.random(), totalAmount: 0.0, - totalAmountUsd: 0.0, + totalAmountFiat: 0.0, overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -70,7 +70,7 @@ const mockData = { '1W': 10 * Math.random(), '1M': -(10 * Math.random()), totalAmount: Math.round(100000 * Math.random()), - totalAmountUsd: Math.round(100000 * Math.random()), + totalAmountFiat: Math.round(100000 * Math.random()), overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -110,7 +110,7 @@ const mockData = { '1W': -(10 * Math.random()), '1M': 10 * Math.random(), totalAmount: Math.round(100000 * Math.random()), - totalAmountUsd: Math.round(100000 * Math.random()), + totalAmountFiat: Math.round(100000 * Math.random()), overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -150,7 +150,7 @@ const mockData = { '1W': -(10 * Math.random()), '1M': 10 * Math.random(), totalAmount: Math.round(100000 * Math.random()), - totalAmountUsd: Math.round(100000 * Math.random()), + totalAmountFiat: Math.round(100000 * Math.random()), overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -190,7 +190,7 @@ const mockData = { '1W': 10 * Math.random(), '1M': -(10 * Math.random()), totalAmount: Math.round(100000 * Math.random()), - totalAmountUsd: Math.round(100000 * Math.random()), + totalAmountFiat: Math.round(100000 * Math.random()), overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -230,7 +230,7 @@ const mockData = { '1W': 10 * Math.random(), '1M': 10 * Math.random(), totalAmount: Math.round(100000 * Math.random()), - totalAmountUsd: Math.round(100000 * Math.random()), + totalAmountFiat: Math.round(100000 * Math.random()), overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -270,7 +270,7 @@ const mockData = { '1W': -(10 * Math.random()), '1M': -(10 * Math.random()), totalAmount: Math.round(100000 * Math.random()), - totalAmountUsd: Math.round(100000 * Math.random()), + totalAmountFiat: Math.round(100000 * Math.random()), overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -310,7 +310,7 @@ const mockData = { '1W': 10 * Math.random(), '1M': -(10 * Math.random()), totalAmount: Math.round(100000 * Math.random()), - totalAmountUsd: Math.round(100000 * Math.random()), + totalAmountFiat: Math.round(100000 * Math.random()), overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -350,7 +350,7 @@ const mockData = { '1W': 10 * Math.random(), '1M': 10 * Math.random(), totalAmount: Math.round(100000 * Math.random()), - totalAmountUsd: Math.round(100000 * Math.random()), + totalAmountFiat: Math.round(100000 * Math.random()), overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -390,7 +390,7 @@ const mockData = { '1W': 10 * Math.random(), '1M': -(10 * Math.random()), totalAmount: Math.round(100000 * Math.random()), - totalAmountUsd: Math.round(100000 * Math.random()), + totalAmountFiat: Math.round(100000 * Math.random()), overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/types/index.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/types/index.ts index f4c9043bac..5a2a31be8f 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/types/index.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/types/index.ts @@ -40,7 +40,7 @@ export type TokenType = { '1W': number; '1M': number; totalAmount: number; - totalAmountUsd: number; + totalAmountFiat: number; overview: IDetailOverview; performance: IDetailPerformanceItem[]; chartData: IChartData; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index 80315627a2..18db42edbf 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -134,7 +134,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { ) : ( - {formatNumber(tokenInfo.totalAmountUsd)} {isAda && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} + {formatNumber(tokenInfo.totalAmountFiat)} {isAda && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} )} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index fb92ecbc43..9613b6ddb9 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -227,7 +227,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { {row.name === 'ADA' && unitOfAccount === 'ADA' ? null : ( - {formatNumber(row.totalAmountUsd)} {unitOfAccount} + {formatNumber(row.totalAmountFiat)} {unitOfAccount} )} diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts new file mode 100644 index 0000000000..a9a4d71820 --- /dev/null +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -0,0 +1,179 @@ +import { getNetworkById } from '../../api/ada/lib/storage/database/prepackaged/networks'; +import { maybe } from '../../coreUtils'; +import { genLookupOrFail, getTokenIdentifierIfExists, getTokenStrictName } from '../../stores/stateless/tokenHelpers'; +import { splitAmount, truncateToken } from '../../utils/formatters.js'; +import { calculateAndFormatValue } from '../../utils/unit-of-account'; +import { cardanoAdaBase64Logo } from '../features/portfolio/common/helpers/constants'; +import { createChartData } from '../features/portfolio/common/helpers/mockHelper'; + +export const mapStakingKeyStateToGovernanceAction = (state: any) => { + if (!state.drepDelegation) return null; + const vote = state.drepDelegation; + return vote.action === 'abstain' + ? { kind: 'abstain' } + : vote.action === 'no-confidence' + ? { kind: 'no-confidence' } + : { kind: 'delegate', drepID: vote.drepID }; +}; + +const getStakePoolMeta = (stores: any) => { + const publicDeriver = stores.wallets.selected; + const delegationStore = stores.delegation; + const currentPool = delegationStore.getDelegatedPoolId(publicDeriver); + if (currentPool == null) return null; + const networkInfo = publicDeriver.getParent().getNetworkInfo(); + const poolMeta = delegationStore.getLocalPoolInfo(networkInfo, currentPool); + const poolInfo = delegationStore.getLocalRemotePoolInfo(networkInfo, currentPool) ?? {}; + if (poolMeta == null) { + // server hasn't returned information about the stake pool yet + return null; + } + const name = poolMeta.info?.name ?? 'unknown'; + const delegatedPool = { + id: String(currentPool), + name, + websiteUrl: poolMeta.info?.homepage, + ticker: poolMeta.info?.ticker, + ...poolInfo, + }; + + return { + ...delegatedPool, + ...poolMeta, + }; +}; + +const getTotalAmount = (walletAmount, rewards) => { + return maybe(walletAmount, w => rewards.joinAddCopy(w)); +}; + +const getAssetWalletAssetList = stores => { + const spendableBalance = stores.transactions.balance; + const getTokenInfo = genLookupOrFail(stores.tokenInfoStore.tokenInfo); + if (spendableBalance == null) return []; + return [spendableBalance.getDefaultEntry(), ...spendableBalance.nonDefaultEntries()] + .map(entry => ({ + entry, + info: getTokenInfo(entry), + })) + .filter(item => item.info.IsNFT === false) + .map(token => { + const numberOfDecimals = token.info?.Metadata.numberOfDecimals ?? 0; + const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); + const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); + const tokenName = truncateToken(getTokenStrictName(token.info).name ?? '-'); + const tokenId = getTokenIdentifierIfExists(token.info) ?? '-'; + const tokenLogo = `data:image/png;base64,${ + token.info.Metadata.policyId === '' ? cardanoAdaBase64Logo : token.info.Metadata.logo + }`; + return { + name: tokenName, + id: tokenId, + totalAmount: [beforeDecimal, afterDecimal].join(''), + amountForSorting: shiftedAmount, + tokenLogo: tokenLogo, + ...token.info.Metadata, + totalAmountFiat: Math.round(100000 * Math.random()), // MOCKED + price: 0.223, // MOCKED + '24h': -(10 * Math.random()), // MOCKED + '1W': 10 * Math.random(), // MOCKED + '1M': 10 * Math.random(), // MOCKED + portfolioPercents: Math.round(100 * Math.random()), // MOCKED + + // The below properties are used only in token details page + chartData: { + start24HoursAgo: createChartData('24H'), // MOCKED + start1WeekAgo: createChartData('1W'), // MOCKED + start1MonthAgo: createChartData('1M'), // MOCKED + start6MonthAgo: createChartData('6M'), // MOCKED + start1YearAgo: createChartData('1Y'), // MOCKED + ALL: createChartData('1Y'), // MOCKED + }, + performance: [ + { value: Math.random() }, // MOCKED + { value: Math.random() }, // MOCKED + { value: `${Math.round(1000 * Math.random())}M` }, // MOCKED + { value: `${Math.round(100 * Math.random())}M` }, // MOCKED + { value: `${Math.round(100 * Math.random())}` }, // MOCKED + { value: 100 * Math.random() }, // MOCKED + { value: 1000 * Math.random() }, // MOCKED + { value: '45B' }, // MOCKED + { value: 10 * Math.random() }, // MOCKED + { value: Math.random() / 100 }, // MOCKED + ], + overview: { + description: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", + website: 'https://www.cardano.org', + detailOn: 'https://www.yoroiwallet.com', + policyId: '2aa9c1557fcf8e7caa049fa0911a8724a1cdaf8037fe0b431c6ac664', + fingerprint: + 'asset311q8dhlxmgagkx0ldt4xc7wzdv2wza8gu2utxw294sr23zuc8dhlxmgagkx0ldt4xc7wzk8213yjnad98h1n1j99naskajsj6789', + }, + }; + }); +}; + +export const createCurrrentWalletInfo = (stores: any): any => { + const { wallets, delegation, tokenInfoStore, coinPriceStore, profile } = stores; + + try { + const walletCurrentPoolInfo = getStakePoolMeta(stores); + + const selectedWallet = wallets.selected; + if (selectedWallet == null) { + throw new Error(`no selected Wallet. Should never happen`); + } + console.log('createCurrrentWalletInfo selectedWallet', selectedWallet); + // newwwwwwwwww + + const currentWalletId = selectedWallet.publicDeriverId; + const networkId = selectedWallet.networkId; + + // Backend services + const { Backend } = getNetworkById(networkId); + const { BackendService, BackendServiceZero } = Backend; + + // Total Ada balance calculation + const rewards = delegation.getRewardBalanceOrZero(selectedWallet); + const balance = selectedWallet.balance; + const totalBalanceAmount = getTotalAmount(balance, rewards); + + const defaultEntry = totalBalanceAmount?.getDefaultEntry(); + const getTokenInfo = genLookupOrFail(tokenInfoStore?.tokenInfo); + const tokenInfo = getTokenInfo(defaultEntry); + const shiftedAmount = defaultEntry.amount.shiftedBy(-tokenInfo.Metadata.numberOfDecimals); + const [beforeDecimalRewards, afterDecimalRewards] = splitAmount(shiftedAmount, tokenInfo.Metadata.numberOfDecimals); + + // Get Fiat price + const ticker = tokenInfo.Metadata.ticker; + const { currency } = profile.unitOfAccount; + const getFiatCurrentPrice = coinPriceStore.getCurrentPrice; + const fiatPrice = getFiatCurrentPrice(ticker, currency === null ? 'USD' : currency); + const fiatDisplay = calculateAndFormatValue(shiftedAmount, fiatPrice); + + // Asset List + const assetList = getAssetWalletAssetList(stores); + + return { + currentPool: walletCurrentPoolInfo, + networkId, + walletId: currentWalletId, + selectedWallet: selectedWallet, + backendService: BackendService, + backendServiceZero: BackendServiceZero, + primaryTokenInfo: tokenInfo, + walletBalance: { + ada: `${beforeDecimalRewards}${afterDecimalRewards}`, + fiatAmount: fiatDisplay || 0, + currency: currency === null ? 'USD' : currency, + percents: 0.0, //(Math.random()), NOT USED - will be deteled + amount: 0.0, //(Math.random()), NOT USED - will be deteled + }, + assetList: assetList, + nftList: [], + }; + } catch (error) { + console.warn('ERROR trying to create wallet info', error); + } +}; diff --git a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js index b98b61f277..3cf016a602 100644 --- a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js +++ b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js @@ -141,7 +141,7 @@ export const allCategoriesRevamp: Array = [ route: ROUTES.PORTFOLIO.ROOT, icon: portfolioIcon, label: globalMessages.sidebarPortfolio, - isVisible: ({ selected }) => environment.isDev() && selected?.networkId === 250, + isVisible: ({ selected }) => environment.isDev(), }, { className: 'nfts', diff --git a/packages/yoroi-extension/webpack-mv2/commonConfig.js b/packages/yoroi-extension/webpack-mv2/commonConfig.js index 462e814019..b7a4849f8e 100644 --- a/packages/yoroi-extension/webpack-mv2/commonConfig.js +++ b/packages/yoroi-extension/webpack-mv2/commonConfig.js @@ -238,6 +238,7 @@ const resolve = () /*: * */ => ({ // need these so that @yoroi/common (a dependent of @yoroi/exchange) doesn't break Webpack 'react-native': false, 'react-native-mmkv': false, + 'process/browser': require.resolve('process/browser'), }, alias: { process: 'process/browser' }, }); From a70e73021cb181325fdd8c2be43268e2a6e4c250 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Tue, 3 Sep 2024 12:54:55 +0300 Subject: [PATCH 02/58] WIP - add header integration --- packages/yoroi-extension/app/Routes.js | 7 +- .../common/components/PortfolioHeader.tsx | 81 +++++++++++-------- .../module/PortfolioContextProvider.tsx | 32 +++++++- .../app/UI/features/portfolio/module/state.ts | 27 +++++-- .../useCases/Wallet/PortfolioWallet.tsx | 47 ++++++----- .../portfolio/useCases/Wallet/StatsTable.tsx | 59 +++++++------- .../app/UI/pages/portfolio/layout.tsx | 33 ++++---- 7 files changed, 179 insertions(+), 107 deletions(-) diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index eb328c1c87..9df9737c21 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -564,10 +564,13 @@ export function wrapGovernance(governanceProps: StoresAndActionsProps, children: export function wrapPortfolio(portfolioProps: StoresAndActionsProps, children: Node): Node { const currentWalletInfo = createCurrrentWalletInfo(portfolioProps.stores); - console.log('currentWalletInfo', currentWalletInfo); + console.log('ROUTES currentWalletInfo', currentWalletInfo); return ( - + void; isLoading: boolean; tooltipTitle: JSX.Element; } -const PortfolioHeader = ({ balance, setKeyword, isLoading, tooltipTitle }: Props): JSX.Element => { +const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: Props): JSX.Element => { const strings = useStrings(); const theme: any = useTheme(); - const { unitOfAccount, settingFiatPairUnit, changeUnitOfAccount } = usePortfolio(); - const [isAdaMainUnit, setIsAdaMainUnit] = useState(unitOfAccount === 'ADA'); + const { unitOfAccount, changeUnitOfAccountPair, accountPair } = usePortfolio(); const handleCurrencyChange = () => { - if (isAdaMainUnit) { - changeUnitOfAccount(settingFiatPairUnit.currency || 'USD'); - setIsAdaMainUnit(false); + if (unitOfAccount !== accountPair?.from.name) { + changeUnitOfAccountPair({ + from: { name: unitOfAccount || 'USD', value: walletBalance.fiatAmount }, + to: { name: 'ADA', value: walletBalance.ada }, + }); } else { - changeUnitOfAccount('ADA'); - setIsAdaMainUnit(true); + changeUnitOfAccountPair({ + from: { name: 'ADA', value: walletBalance.ada }, + to: { name: unitOfAccount, value: walletBalance.fiatAmount }, + }); } }; @@ -39,17 +42,17 @@ const PortfolioHeader = ({ balance, setKeyword, isLoading, tooltipTitle }: Props {isLoading ? ( ) : ( - - {isAdaMainUnit ? formatNumber(balance.usd) : formatNumber(balance.ada)} + + {String(accountPair?.from.value)} )} - {isAdaMainUnit ? 'ADA' : unitOfAccount} + {accountPair?.from.name} - {isAdaMainUnit ? (settingFiatPairUnit.currency ? `/${settingFiatPairUnit.currency}` : '/USD') : '/ADA'} + /{accountPair?.to.name} @@ -66,9 +69,8 @@ const PortfolioHeader = ({ balance, setKeyword, isLoading, tooltipTitle }: Props {isLoading ? ( ) : ( - - {isAdaMainUnit ? formatNumber(balance.ada) : formatNumber(balance.usd)}{' '} - {isAdaMainUnit ? settingFiatPairUnit.currency || 'USD' : 'ADA'} + + {accountPair?.to.value} {accountPair?.to.name} )} {isLoading ? ( @@ -80,28 +82,43 @@ const PortfolioHeader = ({ balance, setKeyword, isLoading, tooltipTitle }: Props {tooltipTitle}} placement="right"> 0 ? ChipTypes.ACTIVE : balance.percents < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} + type={ + walletBalance.percents > 0 + ? ChipTypes.ACTIVE + : walletBalance.percents < 0 + ? ChipTypes.INACTIVE + : ChipTypes.DISABLED + } label={ - {balance.percents > 0 ? ( - - ) : balance.percents < 0 ? ( - + {walletBalance.percents > 0 ? ( + + ) : walletBalance.percents < 0 ? ( + ) : null} {/* @ts-ignore */} - {balance.percents >= 0 ? formatNumber(balance.percents) : formatNumber(-1 * balance.percents)}% + {walletBalance.percents >= 0 + ? formatNumber(walletBalance.percents) + : formatNumber(-1 * walletBalance.percents)} + % } /> 0 ? ChipTypes.ACTIVE : balance.amount < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} + type={ + walletBalance.amount > 0 + ? ChipTypes.ACTIVE + : walletBalance.amount < 0 + ? ChipTypes.INACTIVE + : ChipTypes.DISABLED + } label={ // @ts-ignore - {balance.amount > 0 && '+'} - {formatNumber(balance.amount)} USD + {walletBalance.amount > 0 && '+'} + {formatNumber(walletBalance.amount)} {unitOfAccount} } /> diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index beec93c990..c6ca76c22b 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -1,6 +1,13 @@ import * as React from 'react'; -import { PortfolioActionType, PortfolioReducer, defaultPortfolioActions, defaultPortfolioState, CurrencyType } from './state'; +import { + AccountPair, + CurrencyType, + PortfolioActionType, + PortfolioReducer, + defaultPortfolioActions, + defaultPortfolioState, +} from './state'; const initialPortfolioProvider = { ...defaultPortfolioState, @@ -16,7 +23,9 @@ type PortfolioProviderProps = { }; initialState: { unitOfAccount: CurrencyType; + accountPair: AccountPair; }; + currentWalletInfo: any; // TODO to be defined }; export const PortfolioContextProvider = ({ @@ -24,8 +33,17 @@ export const PortfolioContextProvider = ({ settingFiatPairUnit, initialState = { unitOfAccount: settingFiatPairUnit.enabled ? settingFiatPairUnit.currency : 'USD', + accountPair: null, }, + currentWalletInfo, }: PortfolioProviderProps) => { + if (currentWalletInfo === undefined) { + return <>; + } + console.log('CONTEXTTTTT currentWalletInfo', currentWalletInfo); + + const { walletBalance, primaryTokenInfo, assetList } = currentWalletInfo; + const [state, dispatch] = React.useReducer(PortfolioReducer, { ...defaultPortfolioState, ...initialState, @@ -38,6 +56,15 @@ export const PortfolioContextProvider = ({ unitOfAccount: currency, }); }, + changeUnitOfAccountPair: (payload: any) => { + dispatch({ + type: PortfolioActionType.changeUnitOfAccountPair, + accountPair: { + from: { name: payload.from.name, value: payload.from.value }, + to: { name: payload.to.name, value: payload.to.value }, + }, + }); + }, }).current; const context = React.useMemo( @@ -45,6 +72,9 @@ export const PortfolioContextProvider = ({ ...state, ...actions, settingFiatPairUnit, + walletBalance, + primaryTokenInfo, + assetList, }), [state, actions] ); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts index fb6ea3762b..6339a53106 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts @@ -1,20 +1,31 @@ import { produce } from 'immer'; -export type CurrencyType = 'ADA' | 'USD' | 'BRL' | 'ETH' | 'BTC' | 'KRW' | 'CNY' | 'EUR' | 'JPY' | null; +export type CurrencyType = 'ADA' | 'USD' | 'BRL' | 'ETH' | 'BTC' | 'KRW' | 'CNY' | 'EUR' | 'JPY' | 'none' | null; +export type AccountPair = { + from: { name: string; value: number }; + to: { name: string; value: number }; +} | null; // Define types export type PortfolioActions = { changeUnitOfAccount: (currency: CurrencyType) => void; + changeUnitOfAccountPair: (payload: AccountPair) => void; }; export const PortfolioActionType = Object.freeze({ changeUnitOfAccount: 'changeUnitOfAccount', + changeUnitOfAccountPair: 'changeUnitOfAccountPair', }); -export type PortfolioAction = { - type: typeof PortfolioActionType.changeUnitOfAccount; - unitOfAccount: CurrencyType; -}; +export type PortfolioAction = + | { + type: typeof PortfolioActionType.changeUnitOfAccount; + unitOfAccount: CurrencyType; + } + | { + type: typeof PortfolioActionType.changeUnitOfAccountPair; + accountPair: AccountPair; + }; // Define state type export type PortfolioState = { @@ -23,6 +34,7 @@ export type PortfolioState = { currency: CurrencyType; enabled: boolean; }; + accountPair: AccountPair | null; }; // Define default state @@ -32,11 +44,13 @@ export const defaultPortfolioState: PortfolioState = { currency: null, enabled: false, }, + accountPair: null, }; // Define action handlers export const defaultPortfolioActions: PortfolioActions = { changeUnitOfAccount: () => console.log('missing init changeUnitOfAccount'), + changeUnitOfAccountPair: () => console.log('missing init changeUnitOfAccount'), }; // Reducer function @@ -46,6 +60,9 @@ export const PortfolioReducer = (state: PortfolioState, action: PortfolioAction) case PortfolioActionType.changeUnitOfAccount: draft.unitOfAccount = action.unitOfAccount; break; + case PortfolioActionType.changeUnitOfAccountPair: + draft.accountPair = action.accountPair; + break; default: return; } diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx index fc535c9ea1..252263a8e8 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx @@ -1,51 +1,56 @@ -import { Typography, Stack } from '@mui/material'; -import React, { useEffect, useState } from 'react'; +import { Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; -import StatsTable from './StatsTable'; -import mockData from '../../common/mockData'; +import React, { useEffect, useState } from 'react'; import PortfolioHeader from '../../common/components/PortfolioHeader'; +import WelcomeBanner from '../../common/components/WelcomeBanner'; import { useStrings } from '../../common/hooks/useStrings'; import { TokenType } from '../../common/types/index'; -import WelcomeBanner from '../../common/components/WelcomeBanner'; - -interface Props { - data: TokenType[]; -} +import { usePortfolio } from '../../module/PortfolioContextProvider'; +import StatsTable from './StatsTable'; -const PortfolioWallet = ({ data }: Props): JSX.Element => { +const PortfolioWallet = (): JSX.Element => { const theme = useTheme(); const strings = useStrings(); + const { walletBalance, assetList, changeUnitOfAccountPair, unitOfAccount } = usePortfolio(); + const [keyword, setKeyword] = useState(''); const [isLoading, setIsLoading] = useState(false); - const [tokenList, setTokenList] = useState(data); - const isShownWelcomeBanner: boolean = data.length === 1; // assumming only have ADA as default -> first time user + const [tokenList, setTokenList] = useState(assetList); + const isShownWelcomeBanner: boolean = assetList.length === 1; // assumming only have ADA as default -> first time user + + useEffect(() => { + changeUnitOfAccountPair({ + from: { name: 'ADA', value: walletBalance.ada }, + to: { name: unitOfAccount || 'USD', value: walletBalance.fiatAmount }, + }); + }, [walletBalance, unitOfAccount]); useEffect(() => { if (isShownWelcomeBanner) return; // FAKE FETCHING DATA TO SEE SKELETON - setIsLoading(true); + // setIsLoading(true); - const timer = setTimeout(() => { - setIsLoading(false); - }, 2000); + // const timer = setTimeout(() => { + // setIsLoading(false); + // }, 2000); - return () => clearTimeout(timer); + // return () => clearTimeout(timer); }, []); useEffect(() => { if (!keyword || isShownWelcomeBanner) { - setTokenList(data); + setTokenList(assetList); return; } const lowercaseKeyword = keyword.toLowerCase(); - const temp = data.filter(item => { + const temp = assetList.filter(item => { return ( item.name.toLowerCase().includes(lowercaseKeyword) || item.id.toLowerCase().includes(lowercaseKeyword) || - item.overview.fingerprint.toLowerCase().includes(lowercaseKeyword) + item.policyId.toLowerCase().includes(lowercaseKeyword) ); }); if (temp && temp.length > 0) { @@ -58,7 +63,7 @@ const PortfolioWallet = ({ data }: Props): JSX.Element => { return ( ( { const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); - const { unitOfAccount } = usePortfolio(); + const { unitOfAccount, accountPair } = usePortfolio(); const [{ order, orderBy }, setSortState] = useState({ order: null, orderBy: null, @@ -121,7 +120,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { borderRadius: `${theme.shape.borderRadius}px`, '& td': { border: 0 }, '&:hover': { - backgroundColor: theme.palette.ds.gray_50, + backgroundColor: theme.palette.ds.gray_c50, }, }} > @@ -134,22 +133,22 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { borderRadius: `${theme.shape.borderRadius}px`, }} component="img" - src={tokenPng} + src={row.tokenLogo || tokenPng} > - + {row.name} - - {row.id} + + {row.ticker} - - {formatNumber(row.price)} USD + + {formatNumber(row.price)} {unitOfAccount} @@ -159,9 +158,9 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { label={ {row['24h'] > 0 ? ( - + ) : row['24h'] < 0 ? ( - + ) : null} {/* @ts-ignore */} @@ -179,9 +178,9 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { label={ {row['1W'] > 0 ? ( - + ) : row['1W'] < 0 ? ( - + ) : null} {/* @ts-ignore */} @@ -199,9 +198,9 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { label={ {row['1M'] > 0 ? ( - + ) : row['1M'] < 0 ? ( - + ) : null} {/* @ts-ignore */} @@ -214,7 +213,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { - + {formatNumber(row.portfolioPercents)} % @@ -222,12 +221,14 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { - - {formatNumber(row.totalAmount)} {row.name} + + {row.totalAmount} {row.name} - {row.name === 'ADA' && unitOfAccount === 'ADA' ? null : ( - - {formatNumber(row.totalAmountFiat)} {unitOfAccount} + {row.name === accountPair?.to.name ? ( + + ) : ( + + {formatNumber(row.totalAmountFiat)} {accountPair?.to.name} )} diff --git a/packages/yoroi-extension/app/UI/pages/portfolio/layout.tsx b/packages/yoroi-extension/app/UI/pages/portfolio/layout.tsx index 765bf999d3..1991a9391a 100644 --- a/packages/yoroi-extension/app/UI/pages/portfolio/layout.tsx +++ b/packages/yoroi-extension/app/UI/pages/portfolio/layout.tsx @@ -1,11 +1,10 @@ import { ROUTES } from '../../../routes-config'; -import { buildRoute } from '../../../utils/routing'; -import PortfolioMenu from '../../features/portfolio/common/components/PortfolioMenu'; +// import { buildRoute } from '../../../utils/routing'; +// import PortfolioMenu from '../../features/portfolio/common/components/PortfolioMenu'; import React, { ReactNode } from 'react'; -import GeneralPageLayout from '../../layout/GeneralPageLayout'; -import NavBarContainerRevamp from '../../../containers/NavBarContainerRevamp'; import NavBarTitle from '../../../components/topbar/NavBarTitle'; -import mockData from '../../features/portfolio/common/mockData'; +import NavBarContainerRevamp from '../../../containers/NavBarContainerRevamp'; +import GeneralPageLayout from '../../layout/GeneralPageLayout'; type Props = { stores: any; @@ -14,18 +13,18 @@ type Props = { }; const PortfolioLayout = ({ stores, actions, children }: Props): JSX.Element => { - const isActivePage = (route: string) => { - const { location } = stores.router; - if (route && location) { - return location.pathname === buildRoute(route); - } - return false; - }; + // const isActivePage = (route: string) => { + // const { location } = stores.router; + // if (route && location) { + // return location.pathname === buildRoute(route); + // } + // return false; + // }; const isDetailPage = stores.router.location.pathname.startsWith(`${ROUTES.PORTFOLIO.ROOT}/details`); - const menu = - isDetailPage || mockData.dapps.liquidityList.length + mockData.dapps.orderList.length === 0 ? null : ( - actions.router.goToRoute.trigger({ route })} isActiveItem={isActivePage} /> - ); + // const menu = + // isDetailPage || mockData.dapps.liquidityList.length + mockData.dapps.orderList.length === 0 ? null : ( + // actions.router.goToRoute.trigger({ route })} isActiveItem={isActivePage} /> + // ); return ( { actions={actions} stores={stores} title={} - menu={menu} + // menu={menu} /> } > From 717410f6607523dabe46b29daafceea5683ad1f3 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Tue, 3 Sep 2024 15:14:07 +0300 Subject: [PATCH 03/58] add initial price api integration --- packages/yoroi-extension/app/Routes.js | 28 +++++--- .../app/UI/context/CurrencyContext.tsx | 32 +++++++++ .../portfolio/common/components/PlnTag.tsx | 70 +++++++++++++++++++ .../common/components/PortfolioHeader.tsx | 50 ++++++++++--- .../portfolio/common/helpers/priceChange.ts | 23 ++++++ .../yoroi-extension/app/UI/types/other.ts | 53 ++++++++++++++ .../yoroi-extension/app/UI/utils/constants.ts | 34 +++++++++ .../app/UI/utils/query-client.ts | 48 +++++++++++++ .../app/UI/utils/usePrimaryTokenActivity.tsx | 69 ++++++++++++++++++ 9 files changed, 386 insertions(+), 21 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/context/CurrencyContext.tsx create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/helpers/priceChange.ts create mode 100644 packages/yoroi-extension/app/UI/types/other.ts create mode 100644 packages/yoroi-extension/app/UI/utils/constants.ts create mode 100644 packages/yoroi-extension/app/UI/utils/query-client.ts create mode 100644 packages/yoroi-extension/app/UI/utils/usePrimaryTokenActivity.tsx diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index 9df9737c21..b654c0db78 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -28,6 +28,10 @@ import NFTsWrapper from './containers/wallet/NFTsWrapper'; import Wallet from './containers/wallet/Wallet'; import RestoreWalletPage, { RestoreWalletPagePromise } from './containers/wallet/restore/RestoreWalletPage'; +// GOLABL Context +// $FlowIgnore: suppressing this error +import { CurrencyProvider } from './UI/context/CurrencyContext'; + // New UI pages // $FlowIgnore: suppressing this error import { createCurrrentWalletInfo } from './UI/utils/createCurrentWalletInfo'; @@ -564,20 +568,22 @@ export function wrapGovernance(governanceProps: StoresAndActionsProps, children: export function wrapPortfolio(portfolioProps: StoresAndActionsProps, children: Node): Node { const currentWalletInfo = createCurrrentWalletInfo(portfolioProps.stores); - console.log('ROUTES currentWalletInfo', currentWalletInfo); + console.log('ROUTES currentWalletInfo', portfolioProps.stores.profile.unitOfAccount); return ( - - + - {children} - - + + {children} + + + ); } diff --git a/packages/yoroi-extension/app/UI/context/CurrencyContext.tsx b/packages/yoroi-extension/app/UI/context/CurrencyContext.tsx new file mode 100644 index 0000000000..7ded519ce9 --- /dev/null +++ b/packages/yoroi-extension/app/UI/context/CurrencyContext.tsx @@ -0,0 +1,32 @@ +import React from 'react'; + +import { configCurrencies } from '../types/other'; +import { supportedCurrencies } from '../utils/constants'; +import { usePrimaryTokenActivity } from '../utils/usePrimaryTokenActivity'; + +const CurrencyContext = React.createContext(undefined); +export const CurrencyProvider = ({ currency, children }: { currency: any; children: React.ReactNode }) => { + console.log('currency', currency); + const { ptActivity, isLoading } = usePrimaryTokenActivity({ to: currency }); + + console.log('ptActivity', ptActivity); + const value = React.useMemo( + () => ({ + currency, + supportedCurrencies, + configCurrencies, + config: configCurrencies[currency], + ptActivity, + isLoading, + }), + [currency, ptActivity, isLoading] + ); + + return {children}; +}; + +export const useCurrencyPairing = () => React.useContext(CurrencyContext) || missingProvider(); + +const missingProvider = () => { + throw new Error('CurrencyProvider is missing'); +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx new file mode 100644 index 0000000000..4a1330d6a5 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx @@ -0,0 +1,70 @@ +import Box from '@mui/material/Box'; +import { styled, useTheme } from '@mui/material/styles'; +import Typography from '@mui/material/Typography'; +import React from 'react'; +import { Icon } from '../../../../components'; + +interface Props { + variant?: 'danger' | 'success' | 'neutral'; + withIcon?: boolean; + children: React.ReactNode; + style?: React.CSSProperties; +} + +const PnlTag = ({ children, withIcon = false, variant = 'neutral', style, ...etc }: Props) => { + const theme = useTheme(); + + const icon = variant === 'danger' ? : ; + + return ( + + {withIcon && variant !== 'neutral' && icon} + {children} + + ); +}; + +const TagContainer = styled(Box, { + shouldForwardProp: prop => prop !== 'mode', +})<{ + mode: 'danger' | 'success' | 'neutral'; +}>(({ theme, mode }) => ({ + display: 'flex', + alignItems: 'center', + borderRadius: '999px', + padding: '3px 6px', + backgroundColor: getBackgroundColor(theme, mode), +})); + +const StyledTypography = styled(Typography, { + shouldForwardProp: prop => prop !== 'mode', +})<{ + mode: 'danger' | 'success' | 'neutral'; +}>(({ theme, mode }) => ({ + // ...theme.typography.body2, + color: getTextColor(theme, mode), +})); + +const getBackgroundColor = (theme, mode) => { + switch (mode) { + case 'success': + return theme.palette.ds.secondary_100; + case 'danger': + return theme.palette.ds.sys_magenta_100; + default: + return theme.palette.ds.gray_100; + } +}; + +const getTextColor = (theme, mode) => { + switch (mode) { + case 'success': + return theme.palette.ds.secondary_700; + case 'danger': + return theme.palette.ds.sys_magenta_700; + default: + return theme.palette.ds.gray_600; + } +}; + +export default PnlTag; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index 10476eeb8c..183a782d1f 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -1,13 +1,12 @@ -import { Box, Stack, Typography } from '@mui/material'; -import { useTheme } from '@mui/material/styles'; +import { Box, Stack, Typography, useTheme } from '@mui/material'; import React from 'react'; -import { Chip, SearchInput, Skeleton, Tooltip } from '../../../../components'; -import { ChipTypes } from '../../../../components/Chip'; -import { Icon } from '../../../../components/icons'; +import { SearchInput, Skeleton, Tooltip } from '../../../../components'; +import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import { usePortfolio } from '../../module/PortfolioContextProvider'; -import { formatNumber } from '../helpers/formatHelper'; +import { formatPriceChange, priceChange } from '../helpers/priceChange'; import { useStrings } from '../hooks/useStrings'; import { BalanceType } from '../types/index'; +import PnlTag from './PlnTag'; interface Props { walletBalance: BalanceType; @@ -21,6 +20,13 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: const theme: any = useTheme(); const { unitOfAccount, changeUnitOfAccountPair, accountPair } = usePortfolio(); + const { + ptActivity: { close, open }, + config, + } = useCurrencyPairing(); + + const { changeValue, changePercent, variantPnl } = priceChange(open, close); + const handleCurrencyChange = () => { if (unitOfAccount !== accountPair?.from.name) { changeUnitOfAccountPair({ @@ -81,7 +87,10 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: ) : ( {tooltipTitle}} placement="right"> - + + + {/* 0 ? ChipTypes.ACTIVE @@ -96,7 +105,6 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: ) : walletBalance.percents < 0 ? ( ) : null} - {/* @ts-ignore */} {walletBalance.percents >= 0 ? formatNumber(walletBalance.percents) @@ -115,13 +123,12 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: : ChipTypes.DISABLED } label={ - // @ts-ignore {walletBalance.amount > 0 && '+'} {formatNumber(walletBalance.amount)} {unitOfAccount} } - /> + /> */} )} @@ -133,4 +140,27 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: ); }; +type PnlPercentChangeProps = { variantPnl: 'danger' | 'success' | 'neutral'; changePercent: string }; +const PnlPercentChange = ({ variantPnl, changePercent }: PnlPercentChangeProps) => { + return ( + + {changePercent}% + + ); +}; + +type PnlPairedChangeProps = { + variantPnl: 'danger' | 'success' | 'neutral'; + changeValue: string; +}; +const PnlPairedChange = ({ variantPnl, changeValue }: PnlPairedChangeProps) => { + const { currency } = useCurrencyPairing(); + + return ( + + {`${Number(changeValue) > 0 ? '+' : ''}${changeValue} ${currency}`} + + ); +}; + export default PortfolioHeader; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/priceChange.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/priceChange.ts new file mode 100644 index 0000000000..e02aa001db --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/priceChange.ts @@ -0,0 +1,23 @@ +import BigNumber from 'bignumber.js'; + +type Return = { + changeValue: number; + changePercent: number; + variantPnl: 'danger' | 'success' | 'neutral'; +}; + +export const priceChange = (previous: number, current: number): Return => { + if (previous === 0) + return { + changeValue: 0, + changePercent: 0, + variantPnl: 'neutral', + }; + const changeValue = current - previous; + const changePercent = (100 * changeValue) / previous; + const variantPnl = changeValue < 0 ? 'danger' : changeValue > 0 ? 'success' : 'neutral'; + + return { changeValue, changePercent, variantPnl }; +}; + +export const formatPriceChange = (change: number, decimals?: number) => new BigNumber(change).toFormat(decimals ?? 2); diff --git a/packages/yoroi-extension/app/UI/types/other.ts b/packages/yoroi-extension/app/UI/types/other.ts new file mode 100644 index 0000000000..bbbadfc246 --- /dev/null +++ b/packages/yoroi-extension/app/UI/types/other.ts @@ -0,0 +1,53 @@ +import { freeze } from 'immer'; +import { supportedCurrencies } from '../utils/constants'; + +export type CurrencySymbol = keyof typeof supportedCurrencies; + +export type PriceMultipleResponse = { + error: string | null; + tickers: Array<{ + from: 'ADA'; // we don't support ERG yet + timestamp: number; + signature: string; + prices: Record; + }>; +}; + +export const configCurrencies = freeze({ + [supportedCurrencies.ADA]: { + decimals: 6, + nativeName: 'Cardano', + }, + [supportedCurrencies.BRL]: { + decimals: 2, + nativeName: 'Real', + }, + [supportedCurrencies.BTC]: { + decimals: 8, + nativeName: 'Bitcoin', + }, + [supportedCurrencies.CNY]: { + decimals: 2, + nativeName: '人民币', + }, + [supportedCurrencies.ETH]: { + decimals: 8, + nativeName: 'Ethereum', + }, + [supportedCurrencies.EUR]: { + decimals: 2, + nativeName: 'Euro', + }, + [supportedCurrencies.JPY]: { + decimals: 2, + nativeName: '日本円', + }, + [supportedCurrencies.KRW]: { + decimals: 2, + nativeName: '대한민국 원', + }, + [supportedCurrencies.USD]: { + decimals: 2, + nativeName: 'US Dollar', + }, +}); diff --git a/packages/yoroi-extension/app/UI/utils/constants.ts b/packages/yoroi-extension/app/UI/utils/constants.ts new file mode 100644 index 0000000000..87b12cceec --- /dev/null +++ b/packages/yoroi-extension/app/UI/utils/constants.ts @@ -0,0 +1,34 @@ +import { freeze } from 'immer'; + +export const time = freeze({ + oneSecond: 1e3, + oneMinute: 60 * 1e3, + fiveMinutes: 5 * 60 * 1e3, + halfHour: 30 * 60 * 1e3, + oneHour: 60 * 60 * 1e3, + oneDay: 24 * 60 * 60 * 1e3, + oneWeek: 7 * 24 * 60 * 60 * 1e3, + oneMonth: 30 * 24 * 60 * 60 * 1e3, + sixMonths: 182.5 * 24 * 60 * 60 * 1e3, + oneYear: 365 * 24 * 60 * 60 * 1e3, + + // helpers + seconds: (seconds: number) => seconds * 1e3, + minutes: (minutes: number) => minutes * 60 * 1e3, + + // session here means while the wallet is open + session: Infinity, +}); + +// NOTE: to be moved into pairing module once it's implemented +export const supportedCurrencies = freeze({ + ADA: 'ADA', + BRL: 'BRL', + BTC: 'BTC', + CNY: 'CNY', + ETH: 'ETH', + EUR: 'EUR', + JPY: 'JPY', + KRW: 'KRW', + USD: 'USD', +} as const); diff --git a/packages/yoroi-extension/app/UI/utils/query-client.ts b/packages/yoroi-extension/app/UI/utils/query-client.ts new file mode 100644 index 0000000000..45066b6497 --- /dev/null +++ b/packages/yoroi-extension/app/UI/utils/query-client.ts @@ -0,0 +1,48 @@ +import { freeze } from 'immer'; +import { QueryClient } from 'react-query'; + +const queryClient = new QueryClient(); +const keyToPersist = 'persist'; +/* +const queryPersistorStorageKey = 'react-query-persistor' +const queryPersistorStorage: Persistor = { + persistClient: async (client: PersistedClient) => { + try { + const filteredState: DehydratedState = { + mutations: client.clientState.mutations, + queries: client.clientState.queries.filter((query) => query.queryKey[0] === keyToPersist), + } + const filteredClient: PersistedClient = { + ...client, + clientState: filteredState, + } + await rootStorage.setItem(queryPersistorStorageKey, JSON.stringify(filteredClient)) + } catch (error) { + logger.error('ReactQueryPersistor: Error saving data to AsyncStorage') + } + }, + restoreClient: async () => { + try { + const data = await rootStorage.getItem(queryPersistorStorageKey) + return data != null ? JSON.parse(data as never) : undefined + } catch (error) { + logger.error('ReactQueryPersistor: Error restoring data to AsyncStorage') + return undefined + } + }, + removeClient: async () => { + try { + await rootStorage.removeItem(queryPersistorStorageKey) + } catch (error) { + logger.error('ReactQueryPersistor: Error removing data to AsyncStorage') + } + }, +} +/* Persistor disabled: experimental hitting IO too much +persistQueryClient({ + queryClient, + persistor: queryPersistorStorage, + maxAge: 24 * 60 * 60 * 1000, // Optional, set the maximum age of persisted queries (in milliseconds) +}) +*/ +export const queryInfo = freeze({ keyToPersist, queryClient }); diff --git a/packages/yoroi-extension/app/UI/utils/usePrimaryTokenActivity.tsx b/packages/yoroi-extension/app/UI/utils/usePrimaryTokenActivity.tsx new file mode 100644 index 0000000000..e10b876746 --- /dev/null +++ b/packages/yoroi-extension/app/UI/utils/usePrimaryTokenActivity.tsx @@ -0,0 +1,69 @@ +import { fetchData, isRight } from '@yoroi/common'; +import { useQuery, UseQueryOptions } from 'react-query'; + +import { CurrencySymbol, PriceMultipleResponse } from '../types/other'; +import { time } from './constants'; +import { queryInfo } from './query-client'; + +// NOTE: this API should be moved inside portfolio token activity (support PT in the request) +// NOTE: price API is unique for all networks +const apiBaseUrl = 'https://api.yoroiwallet.com/api'; +const ptTicker = 'ADA'; + +type PrimaryTokenActivity = { + ts: number; + close: number; + open: number; +}; +const defaultPrimaryTokenActivity: PrimaryTokenActivity = { + ts: 0, + close: 1, + open: 1, +}; + +export const usePrimaryTokenActivity = ({ + to, + options, +}: { + to: CurrencySymbol; + options?: UseQueryOptions; +}) => { + const query = useQuery({ + enabled: to !== ptTicker, + staleTime: time.oneMinute, + cacheTime: time.fiveMinutes, + retryDelay: time.oneSecond, + optimisticResults: true, + refetchInterval: time.oneMinute, + queryKey: [queryInfo.keyToPersist, 'usePrimaryTokenActivity', to], + ...options, + queryFn: async () => { + const response = await fetchPtPriceActivity([Date.now(), Date.now() - time.oneDay]); + + if (isRight(response)) { + // NOTE: transformer + const tickers = response.value.data.tickers; + const ts = tickers[0]?.timestamp ?? 0; + const close = tickers[0]?.prices[to] ?? 1; + const open = tickers[1]?.prices[to] ?? 1; + return { + ts, + close, + open, + }; + } + + return defaultPrimaryTokenActivity; + }, + }); + + if (query.data) return { ptActivity: query.data, isLoading: query.isLoading }; + + return { ptActivity: defaultPrimaryTokenActivity, isLoading: query.isLoading }; +}; + +export const fetchPtPriceActivity = (timestamps: Array) => + fetchData({ + url: `${apiBaseUrl}/price/${ptTicker}/${timestamps.join()}`, + method: 'get', + }); From ffdc431d275a05c4f25ced36fd07e7efcba3b8c9 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 5 Sep 2024 18:30:23 +0300 Subject: [PATCH 04/58] add wallet manager context --- packages/yoroi-extension/app/Routes.js | 272 +++++++++--------- .../app/UI/context/WalletManagerProvider.tsx | 169 +++++++++++ .../module/PortfolioContextProvider.tsx | 9 +- .../portfolio/useCases/Wallet/StatsTable.tsx | 45 ++- .../app/UI/utils/createCurrentWalletInfo.ts | 25 +- .../app/UI/utils/useMultiTokenActivity.ts | 27 ++ ...ctivity.tsx => usePrimaryTokenActivity.ts} | 0 packages/yoroi-extension/package.json | 1 + 8 files changed, 380 insertions(+), 168 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx create mode 100644 packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts rename packages/yoroi-extension/app/UI/utils/{usePrimaryTokenActivity.tsx => usePrimaryTokenActivity.ts} (100%) diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index b654c0db78..4ac27ca9bb 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -52,6 +52,7 @@ import PortfolioDappsPage from './UI/pages/portfolio/PortfolioDappsPage'; // $FlowIgnore: suppressing this error import PortfolioDetailPage from './UI/pages/portfolio/PortfolioDetailPage'; // $FlowIgnore: suppressing this error +import { WalletManagerProvider } from './UI/context/WalletManagerProvider'; import PortfolioPage from './UI/pages/portfolio/PortfolioPage'; // $FlowIgnore: suppressing this error @@ -203,129 +204,139 @@ export const Routes = (stores: StoresMap, actions: ActionsMap): Node => { return ( - - } /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } /> - wrapAssets({ ...props, stores, actions }, AssetsSubpages(stores, actions))} - /> - wrapNFTs({ ...props, stores, actions }, NFTsSubPages(stores, actions))} - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - wrapWallet({ ...props, stores, actions }, WalletsSubpages(stores, actions))} - /> - wrapSettings({ ...props, stores, actions }, SettingsSubpages(stores, actions))} - /> - wrapSwap({ ...props, stores, actions }, SwapSubpages(stores, actions))} - /> - } /> - } - /> - } - /> - } /> - } - /> - } - /> - - {/* NEW UI Routes */} - wrapGovernance({ ...props, stores, actions }, GovernanceSubpages(stores, actions))} - /> - wrapPortfolio({ ...props, stores, actions }, PortfolioSubpages(stores, actions))} - /> - - - + + + } /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + wrapAssets({ ...props, stores, actions }, AssetsSubpages(stores, actions))} + /> + wrapNFTs({ ...props, stores, actions }, NFTsSubPages(stores, actions))} + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + wrapWallet({ ...props, stores, actions }, WalletsSubpages(stores, actions))} + /> + wrapSettings({ ...props, stores, actions }, SettingsSubpages(stores, actions))} + /> + wrapSwap({ ...props, stores, actions }, SwapSubpages(stores, actions))} + /> + } /> + } + /> + } + /> + } + /> + } + /> + } + /> + + {/* NEW UI Routes */} + wrapGovernance({ ...props, stores, actions }, GovernanceSubpages(stores, actions))} + /> + wrapPortfolio({ ...props, stores, actions }, PortfolioSubpages(stores, actions))} + /> + + + + ); @@ -566,21 +577,10 @@ export function wrapGovernance(governanceProps: StoresAndActionsProps, children: ); } export function wrapPortfolio(portfolioProps: StoresAndActionsProps, children: Node): Node { - const currentWalletInfo = createCurrrentWalletInfo(portfolioProps.stores); - - console.log('ROUTES currentWalletInfo', portfolioProps.stores.profile.unitOfAccount); - return ( - - + + {children} diff --git a/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx b/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx new file mode 100644 index 0000000000..60fff9cc64 --- /dev/null +++ b/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx @@ -0,0 +1,169 @@ +import * as React from 'react'; +import { getNetworkById } from '../../api/ada/lib/storage/database/prepackaged/networks'; +import { maybe } from '../../coreUtils'; +import { genLookupOrFail, getTokenIdentifierIfExists, getTokenStrictName } from '../../stores/stateless/tokenHelpers'; +import { splitAmount, truncateToken } from '../../utils/formatters.js'; +import { calculateAndFormatValue } from '../../utils/unit-of-account'; +import { cardanoAdaBase64Logo } from '../features/portfolio/common/helpers/constants'; + +// Define a context type for the wallet manager +interface WalletManagerContextType { + currentWalletInfo: any | null; +} + +// Create the context +const WalletManagerContext = React.createContext(undefined); + +export const WalletManagerProvider: React.FC> = ({ children, stores }) => { + const [currentWalletInfo, setCurrentWalletInfo] = React.useState(null); + + React.useEffect(() => { + const generateCurrentWalletInfo = () => { + const { wallets, delegation, tokenInfoStore, coinPriceStore, profile } = stores; + + try { + const walletCurrentPoolInfo = getStakePoolMeta(stores); + + const selectedWallet = wallets.selected; + if (selectedWallet == null) { + throw new Error(`no selected Wallet. Should never happen`); + } + + const currentWalletId = selectedWallet.publicDeriverId; + const networkId = selectedWallet.networkId; + + // Backend services + const { Backend } = getNetworkById(networkId); + const { BackendService, BackendServiceZero } = Backend; + + // Total Ada balance calculation + const rewards = delegation.getRewardBalanceOrZero(selectedWallet); + const balance = selectedWallet.balance; + const totalBalanceAmount = getTotalAmount(balance, rewards); + + const defaultEntry = totalBalanceAmount?.getDefaultEntry(); + const getTokenInfo = genLookupOrFail(tokenInfoStore?.tokenInfo); + const tokenInfo = getTokenInfo(defaultEntry); + const shiftedAmount = defaultEntry.amount.shiftedBy(-tokenInfo.Metadata.numberOfDecimals); + const [beforeDecimalRewards, afterDecimalRewards] = splitAmount(shiftedAmount, tokenInfo.Metadata.numberOfDecimals); + + // Get Fiat price + const ticker = tokenInfo.Metadata.ticker; + const { currency } = profile.unitOfAccount; + const getFiatCurrentPrice = coinPriceStore.getCurrentPrice; + const fiatPrice = getFiatCurrentPrice(ticker, currency === null ? 'USD' : currency); + const fiatDisplay = calculateAndFormatValue(shiftedAmount, fiatPrice); + + // Asset List + const assetList = getAssetWalletAssetList(stores); + + setCurrentWalletInfo({ + currentPool: walletCurrentPoolInfo, + networkId, + walletId: currentWalletId, + selectedWallet: selectedWallet, + backendService: BackendService, + backendServiceZero: BackendServiceZero, + primaryTokenInfo: tokenInfo, + walletBalance: { + ada: `${beforeDecimalRewards}${afterDecimalRewards}`, + fiatAmount: fiatDisplay || 0, + currency: currency === null ? 'USD' : currency, + percents: 0.0, //(Math.random()), NOT USED - will be deleted + amount: 0.0, //(Math.random()), NOT USED - will be deleted + }, + assetList: assetList, + nftList: [], + }); + } catch (error) { + console.warn('ERROR trying to create wallet info', error); + } + }; + + generateCurrentWalletInfo(); + }, [stores, stores.coinPriceStore.currentPriceTickers?.length]); + + // Expose context value + const contextValue = React.useMemo(() => ({ ...currentWalletInfo }), [currentWalletInfo]); + + return {children}; +}; + +export const useWalletManager = () => + React.useContext(WalletManagerContext) ?? console.log('useWalletManager must be used within a WalletManagerProvider'); + +// Helper functions (same as your previous implementation) +const getStakePoolMeta = (stores: any) => { + const publicDeriver = stores.wallets.selected; + const delegationStore = stores.delegation; + const currentPool = delegationStore.getDelegatedPoolId(publicDeriver); + if (currentPool == null) return null; + const networkInfo = publicDeriver.getParent().getNetworkInfo(); + const poolMeta = delegationStore.getLocalPoolInfo(networkInfo, currentPool); + const poolInfo = delegationStore.getLocalRemotePoolInfo(networkInfo, currentPool) ?? {}; + if (poolMeta == null) { + return null; + } + const name = poolMeta.info?.name ?? 'unknown'; + const delegatedPool = { + id: String(currentPool), + name, + websiteUrl: poolMeta.info?.homepage, + ticker: poolMeta.info?.ticker, + ...poolInfo, + }; + + return { + ...delegatedPool, + ...poolMeta, + }; +}; + +const getTotalAmount = (walletAmount: any, rewards: any) => { + return maybe(walletAmount, (w: any) => rewards.joinAddCopy(w)); +}; + +const getAssetWalletAssetList = (stores: any) => { + const spendableBalance = stores.transactions.balance; + const getTokenInfo = genLookupOrFail(stores.tokenInfoStore.tokenInfo); + if (spendableBalance == null) return []; + return [spendableBalance.getDefaultEntry(), ...spendableBalance.nonDefaultEntries()] + .map((entry: any) => ({ + entry, + info: getTokenInfo(entry), + })) + .filter((item: any) => item.info.IsNFT === false) + .map((token: any) => { + const numberOfDecimals = token.info?.Metadata.numberOfDecimals ?? 0; + const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); + const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); + const tokenName = truncateToken(getTokenStrictName(token.info).name ?? '-'); + const tokenId = getTokenIdentifierIfExists(token.info) ?? '-'; + const tokenLogo = `data:image/png;base64,${ + token.info.Metadata.policyId === '' ? cardanoAdaBase64Logo : token.info.Metadata.logo + }`; + return { + name: tokenName, + id: tokenId, + totalAmount: [beforeDecimal, afterDecimal].join(''), + amountForSorting: shiftedAmount, + tokenLogo: tokenLogo, + ...token.info.Metadata, + totalAmountFiat: Math.round(100000 * Math.random()), // MOCKED + price: 0.223, // MOCKED + '24h': -(10 * Math.random()), // MOCKED + '1W': 10 * Math.random(), // MOCKED + '1M': 10 * Math.random(), // MOCKED + portfolioPercents: Math.round(100 * Math.random()), // MOCKED + overview: { + description: + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", + website: 'https://www.cardano.org', + detailOn: 'https://www.yoroiwallet.com', + policyId: '2aa9c1557fcf8e7caa049fa0911a8724a1cdaf8037fe0b431c6ac664', + fingerprint: + 'asset311q8dhlxmgagkx0ldt4xc7wzdv2wza8gu2utxw294sr23zuc8dhlxmgagkx0ldt4xc7wzk8213yjnad98h1n1j99naskajsj6789', + }, + }; + }); +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index c6ca76c22b..5b7a633478 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; +import { useWalletManager } from '../../../context/WalletManagerProvider'; import { AccountPair, CurrencyType, @@ -25,7 +26,6 @@ type PortfolioProviderProps = { unitOfAccount: CurrencyType; accountPair: AccountPair; }; - currentWalletInfo: any; // TODO to be defined }; export const PortfolioContextProvider = ({ @@ -35,14 +35,11 @@ export const PortfolioContextProvider = ({ unitOfAccount: settingFiatPairUnit.enabled ? settingFiatPairUnit.currency : 'USD', accountPair: null, }, - currentWalletInfo, }: PortfolioProviderProps) => { - if (currentWalletInfo === undefined) { + const { walletBalance, primaryTokenInfo, assetList, selectedWallet } = useWalletManager(); + if (selectedWallet === undefined) { return <>; } - console.log('CONTEXTTTTT currentWalletInfo', currentWalletInfo); - - const { walletBalance, primaryTokenInfo, assetList } = currentWalletInfo; const [state, dispatch] = React.useReducer(PortfolioReducer, { ...defaultPortfolioState, diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index 361a788557..d97e29a589 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -4,9 +4,12 @@ import React, { useMemo, useState } from 'react'; import { Chip, Skeleton } from '../../../../components'; import { ChipTypes } from '../../../../components/Chip'; import { Icon } from '../../../../components/icons'; +import { useMultiTokenActivity } from '../../../../utils/useMultiTokenActivity'; import tokenPng from '../../common/assets/images/token.png'; +import PnlTag from '../../common/components/PlnTag'; import Table from '../../common/components/Table'; import { formatNumber } from '../../common/helpers/formatHelper'; +import { priceChange } from '../../common/helpers/priceChange'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useStrings } from '../../common/hooks/useStrings'; import useTableSort, { ISortState } from '../../common/hooks/useTableSort'; @@ -14,6 +17,8 @@ import { TokenType } from '../../common/types/index'; import { IHeadCell } from '../../common/types/table'; import { usePortfolio } from '../../module/PortfolioContextProvider'; +// import { isPrimaryToken } from '@yoroi/portfolio'; + const TableRowSkeleton = ({ theme, ...props }) => ( { order: null, orderBy: null, }); + const list = useMemo(() => [...data], [data]); + const listForActivity = list.filter(item => item.policyId.length > 0).map(item => `${item.policyId}.${item.assetName}`); // + + const { mutate: get24hActivity, data: data24h } = useMultiTokenActivity('24h'); + // const { mutate: get48hActivity, data: data48h } = useMultiTokenActivity('1W'); + // const { mutate: get72hActivity, data: data72h } = useMultiTokenActivity('1M'); + + React.useEffect(() => { + get24hActivity(listForActivity); + // get48hActivity(listForActivity); + // get72hActivity(listForActivity); + }, [get24hActivity]); + const headCells: IHeadCell[] = [ { id: 'name', label: strings.name, align: 'left', sortType: 'character' }, { id: 'price', label: strings.price, align: 'left', sortType: 'numeric' }, @@ -97,6 +115,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { sortType: 'numeric', }, ]; + const { getSortedData, handleRequestSort } = useTableSort({ order, orderBy, setSortState, headCells, data }); return ( @@ -153,7 +172,11 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { - + {/* 0 ? ChipTypes.ACTIVE : row['24h'] < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} label={ @@ -162,14 +185,13 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { ) : row['24h'] < 0 ? ( ) : null} - {/* @ts-ignore */} {row['24h'] >= 0 ? formatNumber(row['24h']) : formatNumber(-1 * row['24h'])}% } sx={{ cursor: 'pointer' }} - /> + /> */} @@ -241,3 +263,20 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { }; export default StatsTable; + +const TokenPriceChangeChip = ({ priceData, isPrimaryToken }) => { + console.log('TokenPriceChangeChip PROPS', { isPrimaryToken, priceData }); + if (priceData === undefined) { + return

loafing

; + } + const { close, open } = priceData[1].price; + + const { changePercent, variantPnl } = priceChange(open, close); + console.log('variantPnl', { changePercent, variantPnl }); + + return ( + + {changePercent}% + + ); +}; diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index a9a4d71820..19e3ebe667 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -4,7 +4,6 @@ import { genLookupOrFail, getTokenIdentifierIfExists, getTokenStrictName } from import { splitAmount, truncateToken } from '../../utils/formatters.js'; import { calculateAndFormatValue } from '../../utils/unit-of-account'; import { cardanoAdaBase64Logo } from '../features/portfolio/common/helpers/constants'; -import { createChartData } from '../features/portfolio/common/helpers/mockHelper'; export const mapStakingKeyStateToGovernanceAction = (state: any) => { if (!state.drepDelegation) return null; @@ -81,26 +80,8 @@ const getAssetWalletAssetList = stores => { portfolioPercents: Math.round(100 * Math.random()), // MOCKED // The below properties are used only in token details page - chartData: { - start24HoursAgo: createChartData('24H'), // MOCKED - start1WeekAgo: createChartData('1W'), // MOCKED - start1MonthAgo: createChartData('1M'), // MOCKED - start6MonthAgo: createChartData('6M'), // MOCKED - start1YearAgo: createChartData('1Y'), // MOCKED - ALL: createChartData('1Y'), // MOCKED - }, - performance: [ - { value: Math.random() }, // MOCKED - { value: Math.random() }, // MOCKED - { value: `${Math.round(1000 * Math.random())}M` }, // MOCKED - { value: `${Math.round(100 * Math.random())}M` }, // MOCKED - { value: `${Math.round(100 * Math.random())}` }, // MOCKED - { value: 100 * Math.random() }, // MOCKED - { value: 1000 * Math.random() }, // MOCKED - { value: '45B' }, // MOCKED - { value: 10 * Math.random() }, // MOCKED - { value: Math.random() / 100 }, // MOCKED - ], + chartData: {}, + performance: [], overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -124,8 +105,6 @@ export const createCurrrentWalletInfo = (stores: any): any => { if (selectedWallet == null) { throw new Error(`no selected Wallet. Should never happen`); } - console.log('createCurrrentWalletInfo selectedWallet', selectedWallet); - // newwwwwwwwww const currentWalletId = selectedWallet.publicDeriverId; const networkId = selectedWallet.networkId; diff --git a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts new file mode 100644 index 0000000000..5b610dbd24 --- /dev/null +++ b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts @@ -0,0 +1,27 @@ +import axios, { AxiosError } from 'axios'; +import { useMutation, UseMutationResult } from 'react-query'; + +interface TokenActivityResponse { + [key: string]: any; +} + +interface ApiError { + message: string; + statusCode: number; +} + +export const useMultiTokenActivity = ( + interval: '24h' | '48h' | '72h' +): UseMutationResult, string[]> => { + const postTokenActivity = async (tokenIds: string[]): Promise => { + const response = await axios.post(`https://zero.yoroiwallet.com/tokens/activity/multi/${interval}`, tokenIds, { + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + }); + return response.data; + }; + + return useMutation(postTokenActivity); +}; diff --git a/packages/yoroi-extension/app/UI/utils/usePrimaryTokenActivity.tsx b/packages/yoroi-extension/app/UI/utils/usePrimaryTokenActivity.ts similarity index 100% rename from packages/yoroi-extension/app/UI/utils/usePrimaryTokenActivity.tsx rename to packages/yoroi-extension/app/UI/utils/usePrimaryTokenActivity.ts diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index c9692f8ed5..979a5a8ba1 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -168,6 +168,7 @@ "@yoroi/staking": "^1.5.1", "@yoroi/swap": "1.5.2", "@yoroi/types": "1.5.4", + "@yoroi/portfolio": "1.0.3", "assert": "2.1.0", "async-await-queue": "2.1.4", "axios": "0.21.1", From c1bd370f1f88685d4805167a78f5ac1ab949f505 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Fri, 6 Sep 2024 13:15:52 +0300 Subject: [PATCH 05/58] add portfolio activity provider to handle all price change data in one place --- packages/yoroi-extension/.eslintrc.js | 17 +- .../module/PortfolioTokenActivityProvider.tsx | 156 ++++++++++++++++++ .../portfolio/useCases/Wallet/StatsTable.tsx | 19 +-- .../app/UI/pages/portfolio/layout.tsx | 3 +- .../app/UI/utils/useMultiTokenActivity.ts | 2 +- packages/yoroi-extension/package.json | 4 +- 6 files changed, 181 insertions(+), 20 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx diff --git a/packages/yoroi-extension/.eslintrc.js b/packages/yoroi-extension/.eslintrc.js index f93f5f318d..ae40c91c95 100644 --- a/packages/yoroi-extension/.eslintrc.js +++ b/packages/yoroi-extension/.eslintrc.js @@ -10,7 +10,11 @@ module.exports = { legacyDecorators: true, }, }, - extends: ['airbnb', 'prettier'], + extends: [ + 'airbnb', + 'prettier', + 'plugin:@typescript-eslint/recommended', // Enable recommended rules from the TypeScript plugin + ], env: { browser: true, mocha: true, @@ -125,7 +129,16 @@ module.exports = { camelcase: 0, 'react/jsx-curly-brace-presence': 0, }, - plugins: ['import', 'promise', 'react', 'flowtype', 'no-floating-promise', 'prettier', 'eslint-plugin-simple-import-sort'], + plugins: [ + 'import', + 'promise', + 'react', + 'flowtype', + 'no-floating-promise', + 'prettier', + 'eslint-plugin-simple-import-sort', + '@typescript-eslint', // Add TypeScript plugin + ], globals: { chrome: true, API: true, diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx new file mode 100644 index 0000000000..9a71d04e56 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -0,0 +1,156 @@ +import { invalid } from '@yoroi/common'; +import { Portfolio } from '@yoroi/types'; +import { freeze, produce } from 'immer'; +import React from 'react'; +import { useQueryClient } from 'react-query'; + +import { queryInfo } from '../../../utils/query-client'; +import { useMultiTokenActivity } from '../../../utils/useMultiTokenActivity'; +import { usePortfolio } from './PortfolioContextProvider'; + +const queryKey = [queryInfo.keyToPersist, 'portfolioTokenActivity']; +const defaultPortfolioTokenActivityState: PortfolioTokenActivityState = freeze( + { + secondaryTokenIds: [], + aggregatedBalances: {}, + tokenActivity: {}, + activityWindow: '24h', + isLoading: false, + }, + true +); +const PortfolioTokenActivityContext = React.createContext({ + ...defaultPortfolioTokenActivityState, +}); + +type Props = { + children: React.ReactNode; +}; + +export const PortfolioTokenActivityProvider = ({ children }: Props) => { + const queryClient = useQueryClient(); + const [state, dispatch] = React.useReducer(portfolioTokenActivityReducer, defaultPortfolioTokenActivityState); + + const actions = React.useRef({ + secondaryTokenIdsChanged: secondaryTokenIds => { + dispatch({ + type: PortfolioTokenActivityActionType.SecondaryTokenIdsChanged, + secondaryTokenIds, + }); + }, + tokenActivityChanged: tokenActivity => { + dispatch({ + type: PortfolioTokenActivityActionType.TokenActivityChanged, + tokenActivity, + }); + }, + activityWindowChanged: activityWindow => { + dispatch({ + type: PortfolioTokenActivityActionType.ActivityWindowChanged, + activityWindow, + }); + }, + }).current; + + const { assetList } = usePortfolio(); + + React.useEffect(() => { + // filter and add here the ids for query + + const listForActivity = assetList.filter(item => item.policyId.length > 0).map(item => `${item.policyId}.${item.assetName}`); // + + actions.secondaryTokenIdsChanged(listForActivity); + + queryClient.invalidateQueries([queryKey]); + }, [actions, queryClient]); + + // Use hook for each interval (24h, 1w, 1m) + const { mutate: fetch24h, data: data24h, isLoading: loading24h } = useMultiTokenActivity('24h'); + // const { mutate: fetch1w, data: data1w, isLoading: loading1w } = useMultiTokenActivity('1w'); + // const { mutate: fetch1m, data: data1m, isLoading: loading1m } = useMultiTokenActivity('1m'); + + React.useEffect(() => { + if (state.secondaryTokenIds.length > 0) { + fetch24h(state.secondaryTokenIds); + // fetch1w(state.secondaryTokenIds); + // fetch1m(state.secondaryTokenIds); + } + }, [state.secondaryTokenIds, fetch24h]); + + React.useEffect(() => { + if (data24h) { + const combinedData = { + data24h: data24h, + // '1w': data1w, + // '1m': data1m, + }; + actions.tokenActivityChanged(combinedData); + } + }, [data24h, actions]); + + const value = React.useMemo( + () => ({ + ...state, + isLoading: loading24h, + // || loading1w || loading1m, // Combine loading states from all intervals + }), + [loading24h, state] + ); + + return {children}; +}; + +export const usePortfolioTokenActivity = () => + React.useContext(PortfolioTokenActivityContext) ?? invalid('usePortfolioTokenActiviy requires PortfolioTokenActivitiyProvider'); + +type PortfolioTokenActivityState = Readonly<{ + secondaryTokenIds: Portfolio.Token.Id[]; + tokenActivity: Portfolio.Api.TokenActivityResponse; + activityWindow: Portfolio.Token.ActivityWindow; + isLoading: boolean; +}>; + +export enum PortfolioTokenActivityActionType { + SecondaryTokenIdsChanged = 'SecondaryTokenIdsChanged', + TokenActivityChanged = 'TokenActivityChanged', + ActivityWindowChanged = 'ActivityWindowChanged', +} + +export type PortfolioTokenActivityAction = + | { + type: PortfolioTokenActivityActionType.SecondaryTokenIdsChanged; + secondaryTokenIds: Portfolio.Token.Id[]; + } + | { + type: PortfolioTokenActivityActionType.TokenActivityChanged; + tokenActivity: Portfolio.Api.TokenActivityResponse; + } + | { + type: PortfolioTokenActivityActionType.ActivityWindowChanged; + activityWindow: Portfolio.Token.ActivityWindow; + }; + +export const portfolioTokenActivityReducer = ( + state: PortfolioTokenActivityState, + action: PortfolioTokenActivityAction +): PortfolioTokenActivityState => { + return produce(state, draft => { + switch (action.type) { + case PortfolioTokenActivityActionType.SecondaryTokenIdsChanged: + draft.secondaryTokenIds = action.secondaryTokenIds; + break; + case PortfolioTokenActivityActionType.TokenActivityChanged: + draft.tokenActivity = action.tokenActivity; + break; + case PortfolioTokenActivityActionType.ActivityWindowChanged: + draft.activityWindow = action.activityWindow; + break; + } + }); +}; + +export type PortfolioTokenActivityActions = Readonly<{ + secondaryTokenIdsChanged: (secondaryTokenIds: Portfolio.Token.Id[]) => void; + tokenActivityChanged: (tokenActivity: Portfolio.Api.TokenActivityResponse) => void; + activityWindowChanged: (activityWindow: Portfolio.Token.ActivityWindow) => void; +}>; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index d97e29a589..b761b10391 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -4,7 +4,6 @@ import React, { useMemo, useState } from 'react'; import { Chip, Skeleton } from '../../../../components'; import { ChipTypes } from '../../../../components/Chip'; import { Icon } from '../../../../components/icons'; -import { useMultiTokenActivity } from '../../../../utils/useMultiTokenActivity'; import tokenPng from '../../common/assets/images/token.png'; import PnlTag from '../../common/components/PlnTag'; import Table from '../../common/components/Table'; @@ -16,8 +15,7 @@ import useTableSort, { ISortState } from '../../common/hooks/useTableSort'; import { TokenType } from '../../common/types/index'; import { IHeadCell } from '../../common/types/table'; import { usePortfolio } from '../../module/PortfolioContextProvider'; - -// import { isPrimaryToken } from '@yoroi/portfolio'; +import { usePortfolioTokenActivity } from '../../module/PortfolioTokenActivityProvider'; const TableRowSkeleton = ({ theme, ...props }) => ( { const list = useMemo(() => [...data], [data]); - const listForActivity = list.filter(item => item.policyId.length > 0).map(item => `${item.policyId}.${item.assetName}`); // - - const { mutate: get24hActivity, data: data24h } = useMultiTokenActivity('24h'); - // const { mutate: get48hActivity, data: data48h } = useMultiTokenActivity('1W'); - // const { mutate: get72hActivity, data: data72h } = useMultiTokenActivity('1M'); - - React.useEffect(() => { - get24hActivity(listForActivity); - // get48hActivity(listForActivity); - // get72hActivity(listForActivity); - }, [get24hActivity]); + const { + tokenActivity: { data24h }, + } = usePortfolioTokenActivity(); const headCells: IHeadCell[] = [ { id: 'name', label: strings.name, align: 'left', sortType: 'character' }, @@ -272,7 +262,6 @@ const TokenPriceChangeChip = ({ priceData, isPrimaryToken }) => { const { close, open } = priceData[1].price; const { changePercent, variantPnl } = priceChange(open, close); - console.log('variantPnl', { changePercent, variantPnl }); return ( diff --git a/packages/yoroi-extension/app/UI/pages/portfolio/layout.tsx b/packages/yoroi-extension/app/UI/pages/portfolio/layout.tsx index 1991a9391a..e66fa6c756 100644 --- a/packages/yoroi-extension/app/UI/pages/portfolio/layout.tsx +++ b/packages/yoroi-extension/app/UI/pages/portfolio/layout.tsx @@ -4,6 +4,7 @@ import { ROUTES } from '../../../routes-config'; import React, { ReactNode } from 'react'; import NavBarTitle from '../../../components/topbar/NavBarTitle'; import NavBarContainerRevamp from '../../../containers/NavBarContainerRevamp'; +import { PortfolioTokenActivityProvider } from '../../features/portfolio/module/PortfolioTokenActivityProvider'; import GeneralPageLayout from '../../layout/GeneralPageLayout'; type Props = { @@ -39,7 +40,7 @@ const PortfolioLayout = ({ stores, actions, children }: Props): JSX.Element => { /> } > - {children} + {children} ); }; diff --git a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts index 5b610dbd24..42929ae633 100644 --- a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts +++ b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts @@ -11,7 +11,7 @@ interface ApiError { } export const useMultiTokenActivity = ( - interval: '24h' | '48h' | '72h' + interval: '24h' | '1w' | '1m' ): UseMutationResult, string[]> => { const postTokenActivity = async (tokenIds: string[]): Promise => { const response = await axios.post(`https://zero.yoroiwallet.com/tokens/activity/multi/${interval}`, tokenIds, { diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index 979a5a8ba1..bee54d3a01 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -80,6 +80,8 @@ "@types/chrome": "^0.0.268", "@types/react-intl": "^3.0.0", "@types/react-router-dom": "^5.3.3", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", "@yoroi/common": "1.5.0", "autoprefixer": "10.2.4", "babel-eslint": "11.0.0-beta.2", @@ -164,11 +166,11 @@ "@mui/x-date-pickers": "^5.0.8", "@svgr/webpack": "5.5.0", "@yoroi/exchange": "2.0.1", + "@yoroi/portfolio": "1.0.3", "@yoroi/resolver": "2.0.2", "@yoroi/staking": "^1.5.1", "@yoroi/swap": "1.5.2", "@yoroi/types": "1.5.4", - "@yoroi/portfolio": "1.0.3", "assert": "2.1.0", "async-await-queue": "2.1.4", "axios": "0.21.1", From 77aa626cc884e2764371e73faddf05179eafd3f1 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Tue, 10 Sep 2024 20:29:15 +0300 Subject: [PATCH 06/58] add token total and single price based on current fiat pair --- packages/yoroi-extension/app/Routes.js | 8 +- .../app/UI/context/CurrencyContext.tsx | 4 +- .../app/UI/context/WalletManagerProvider.tsx | 26 ++- .../module/PortfolioTokenActivityProvider.tsx | 1 + .../portfolio/useCases/Wallet/StatsTable.tsx | 160 ++++++++++++++---- packages/yoroi-extension/package.json | 2 +- 6 files changed, 159 insertions(+), 42 deletions(-) diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index 7365c93178..9e94535a6d 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -205,8 +205,8 @@ export const Routes = (stores: StoresMap, actions: ActionsMap): Node => { return ( - - + + } /> { /> - - + + ); diff --git a/packages/yoroi-extension/app/UI/context/CurrencyContext.tsx b/packages/yoroi-extension/app/UI/context/CurrencyContext.tsx index 7ded519ce9..4e8d195980 100644 --- a/packages/yoroi-extension/app/UI/context/CurrencyContext.tsx +++ b/packages/yoroi-extension/app/UI/context/CurrencyContext.tsx @@ -6,10 +6,8 @@ import { usePrimaryTokenActivity } from '../utils/usePrimaryTokenActivity'; const CurrencyContext = React.createContext(undefined); export const CurrencyProvider = ({ currency, children }: { currency: any; children: React.ReactNode }) => { - console.log('currency', currency); const { ptActivity, isLoading } = usePrimaryTokenActivity({ to: currency }); - console.log('ptActivity', ptActivity); const value = React.useMemo( () => ({ currency, @@ -30,3 +28,5 @@ export const useCurrencyPairing = () => React.useContext(CurrencyContext) || mis const missingProvider = () => { throw new Error('CurrencyProvider is missing'); }; + + diff --git a/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx b/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx index 60fff9cc64..4878a5713c 100644 --- a/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx +++ b/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx @@ -1,3 +1,4 @@ +import BigNumber from 'bignumber.js'; import * as React from 'react'; import { getNetworkById } from '../../api/ada/lib/storage/database/prepackaged/networks'; import { maybe } from '../../coreUtils'; @@ -50,6 +51,7 @@ export const WalletManagerProvider: React.FC ({ ...currentWalletInfo }), [currentWalletInfo]); @@ -142,18 +144,22 @@ const getAssetWalletAssetList = (stores: any) => { const tokenLogo = `data:image/png;base64,${ token.info.Metadata.policyId === '' ? cardanoAdaBase64Logo : token.info.Metadata.logo }`; + + const getFiatCurrentPrice = stores.coinPriceStore.getCurrentPrice; + const { currency } = stores.profile.unitOfAccount; + + const fiatPrice = getFiatCurrentPrice(tokenName, currency === null ? 'USD' : currency); + const fiatDisplay = calculateAndFormatValue(shiftedAmount, fiatPrice); return { name: tokenName, id: tokenId, totalAmount: [beforeDecimal, afterDecimal].join(''), amountForSorting: shiftedAmount, + quantity: asQuantity(token.entry.amount), tokenLogo: tokenLogo, ...token.info.Metadata, - totalAmountFiat: Math.round(100000 * Math.random()), // MOCKED - price: 0.223, // MOCKED - '24h': -(10 * Math.random()), // MOCKED - '1W': 10 * Math.random(), // MOCKED - '1M': 10 * Math.random(), // MOCKED + totalAmountFiat: fiatDisplay, + price: fiatPrice, portfolioPercents: Math.round(100 * Math.random()), // MOCKED overview: { description: @@ -167,3 +173,11 @@ const getAssetWalletAssetList = (stores: any) => { }; }); }; + +export const asQuantity = (value: BigNumber | number | string) => { + const bn = new BigNumber(value); + if (bn.isNaN() || !bn.isFinite()) { + throw new Error('Invalid quantity'); + } + return bn; +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index 9a71d04e56..3f3cc53cb5 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -79,6 +79,7 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { React.useEffect(() => { if (data24h) { + console.log('data24h', data24h); const combinedData = { data24h: data24h, // '1w': data1w, diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index b761b10391..d115d2ec85 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -1,14 +1,17 @@ import { Box, Stack, TableCell, TableRow, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; +import { atomicBreakdown } from '@yoroi/common'; +import BigNumber from 'bignumber.js'; import React, { useMemo, useState } from 'react'; import { Chip, Skeleton } from '../../../../components'; import { ChipTypes } from '../../../../components/Chip'; import { Icon } from '../../../../components/icons'; +import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import tokenPng from '../../common/assets/images/token.png'; import PnlTag from '../../common/components/PlnTag'; import Table from '../../common/components/Table'; import { formatNumber } from '../../common/helpers/formatHelper'; -import { priceChange } from '../../common/helpers/priceChange'; +import { formatPriceChange, priceChange } from '../../common/helpers/priceChange'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useStrings } from '../../common/hooks/useStrings'; import useTableSort, { ISortState } from '../../common/hooks/useTableSort'; @@ -84,8 +87,13 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { const { tokenActivity: { data24h }, + isLoading: isActivityLoading, } = usePortfolioTokenActivity(); + const ptActivity = useCurrencyPairing().ptActivity; + + console.log('primaryTokenActivity', ptActivity); + const headCells: IHeadCell[] = [ { id: 'name', label: strings.name, align: 'left', sortType: 'character' }, { id: 'price', label: strings.price, align: 'left', sortType: 'numeric' }, @@ -156,16 +164,21 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => {
- - {formatNumber(row.price)} {unitOfAccount} - + - + {data24h === undefined ? ( +

load

+ ) : ( + + )} + {/* 0 ? ChipTypes.ACTIVE : row['24h'] < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} label={ @@ -231,20 +244,15 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => {
- - - - {row.totalAmount} {row.name} - - {row.name === accountPair?.to.name ? ( - - ) : ( - - {formatNumber(row.totalAmountFiat)} {accountPair?.to.name} - - )} - - + {data24h === undefined ? ( +

load

+ ) : ( + + )}
))} @@ -254,18 +262,112 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { export default StatsTable; -const TokenPriceChangeChip = ({ priceData, isPrimaryToken }) => { - console.log('TokenPriceChangeChip PROPS', { isPrimaryToken, priceData }); - if (priceData === undefined) { - return

loafing

; - } - const { close, open } = priceData[1].price; +const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, isPrimaryToken }) => { + const { close, open } = isPrimaryToken + ? primaryTokenActivity + : secondaryTokenActivity?.length && secondaryTokenActivity[1].price; const { changePercent, variantPnl } = priceChange(open, close); return ( - {changePercent}% + {formatPriceChange(changePercent)}% ); }; + +const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { + if (secondaryToken24Activity === null || secondaryToken24Activity === undefined) { + return <>; + } + const theme: any = useTheme(); + const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; + console.log('TOken INFO', token); + + if (tokenPrice === undefined) { + return <> + } + const { + currency: selectedCurrency, + config, + ptActivity: { close: ptPrice }, + } = useCurrencyPairing(); + + + // const showingAda = isPrimaryTokenActive && amount.info.id !== portfolioPrimaryTokenInfo.id; + const showingAda = accountPair?.from.name === 'ADA'; + + const currency = selectedCurrency; + const decimals = config.decimals; + + if (ptPrice == null) return `... ${currency}`; + + if (token?.quantity === undefined || secondaryToken24Activity === undefined || secondaryToken24Activity === undefined) + return `—— ${currency}`; + + // if (!isPrimaryToken(amount.info) && tokenPrice == null) return `—— ${currency}`; + + // if (hidePrimaryPair && isPrimaryToken(amount.info) && isPrimaryTokenActive) return ''; + + // Assuming token.quantity is a BigNumber and token.numberOfDecimals represents the number of decimals + const decimalPlaces = token.numberOfDecimals; + + // Multiply the BigNumber by 10^decimalPlaces to shift the decimals + const shiftedBigNumber = token.quantity.times(BigNumber(10).pow(decimalPlaces)); // Stay in BigNumber realm + + // Convert to bigint + const bigIntValue = BigInt(shiftedBigNumber.toString(10)); // Convert BigNumber to string, then to BigInt + + // Ensure tokenPrice and ptPrice are BigNumber instances and convert if needed + const safeTokenPrice = BigNumber.isBigNumber(tokenPrice) ? tokenPrice : new BigNumber(tokenPrice ?? '1'); + const safePtPrice = BigNumber.isBigNumber(ptPrice) ? ptPrice : new BigNumber(ptPrice ?? '1'); + + + + // Now, pass the bigIntValue to atomicBreakdown + const price = `${atomicBreakdown(bigIntValue, token.numberOfDecimals) + .bn.times(safeTokenPrice) // BigNumber operation + .times(showingAda ? 1 : safePtPrice) // BigNumber operation + .toFormat(decimals)} ${currency}`; + + + console.log('token', { + name: token.name, + quantity: token.quantity, + tokenCALCULATEDFINALPrice: price, + selectedCurrency, + tokenPrice: tokenPrice, + showingAda, + }); + + + + return ( + + + + {token.totalAmount} {token.name} + + {token.name === accountPair?.to.name ? ( + + ) : ( + + {price} + + )} + + + ); +}; + +const TokenPrice = ({ token, unitOfAccount, secondaryToken24Activity }) => { + if (secondaryToken24Activity === null || secondaryToken24Activity === undefined) { + return <>; + } + const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; + return ( + + {formatPriceChange(tokenPrice)} {unitOfAccount} + + ); +}; diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index 38736f0c23..b28ce8e1b2 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -82,7 +82,7 @@ "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^8.4.0", "@typescript-eslint/parser": "^8.4.0", - "@yoroi/common": "1.5.0", + "@yoroi/common": "1.5.4", "autoprefixer": "10.2.4", "babel-eslint": "11.0.0-beta.2", "babel-jest": "26.6.3", From 6c62b08125b36bd505591d8cd2f9f54c077dad97 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 11 Sep 2024 01:37:24 +0300 Subject: [PATCH 07/58] add primary tokens prices --- .../portfolio/useCases/Wallet/StatsTable.tsx | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index d115d2ec85..ab7b84a81d 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -164,7 +164,11 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { - @@ -248,6 +252,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => {

load

) : ( { - if (secondaryToken24Activity === null || secondaryToken24Activity === undefined) { - return <>; - } + const theme: any = useTheme(); const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; - console.log('TOken INFO', token); - if (tokenPrice === undefined) { - return <> - } + const { currency: selectedCurrency, config, @@ -302,8 +302,6 @@ const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { if (ptPrice == null) return `... ${currency}`; - if (token?.quantity === undefined || secondaryToken24Activity === undefined || secondaryToken24Activity === undefined) - return `—— ${currency}`; // if (!isPrimaryToken(amount.info) && tokenPrice == null) return `—— ${currency}`; @@ -331,14 +329,14 @@ const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { .toFormat(decimals)} ${currency}`; - console.log('token', { - name: token.name, - quantity: token.quantity, - tokenCALCULATEDFINALPrice: price, - selectedCurrency, - tokenPrice: tokenPrice, - showingAda, - }); + // console.log('token', { + // name: token.name, + // quantity: token.quantity, + // tokenCALCULATEDFINALPrice: price, + // selectedCurrency, + // tokenPrice: tokenPrice, + // showingAda, + // }); @@ -360,11 +358,10 @@ const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { ); }; -const TokenPrice = ({ token, unitOfAccount, secondaryToken24Activity }) => { - if (secondaryToken24Activity === null || secondaryToken24Activity === undefined) { - return <>; - } - const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; +const TokenPrice = ({ token, unitOfAccount, secondaryToken24Activity, ptActivity, isPrimaryToken }) => { + + const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryToken24Activity && secondaryToken24Activity[1].price.close; + return ( {formatPriceChange(tokenPrice)} {unitOfAccount} From 4078f87d6973e5c34c795e5e5d681800c851f9a0 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 11 Sep 2024 15:39:11 +0300 Subject: [PATCH 08/58] wip --- packages/yoroi-extension/app/Routes.js | 10 +-- .../app/UI/context/WalletManagerProvider.tsx | 5 +- .../portfolio/common/components/PlnTag.tsx | 8 ++- .../common/components/PortfolioHeader.tsx | 2 +- .../module/PortfolioContextProvider.tsx | 5 +- .../module/PortfolioTokenActivityProvider.tsx | 24 +++---- .../portfolio/useCases/Wallet/StatsTable.tsx | 1 - .../app/UI/pages/portfolio/PortfolioPage.tsx | 3 +- .../app/UI/utils/createCurrentWalletInfo.ts | 62 +++++++++++-------- 9 files changed, 64 insertions(+), 56 deletions(-) diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index 9e94535a6d..39c5b6fb74 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -52,7 +52,6 @@ import PortfolioDappsPage from './UI/pages/portfolio/PortfolioDappsPage'; // $FlowIgnore: suppressing this error import PortfolioDetailPage from './UI/pages/portfolio/PortfolioDetailPage'; // $FlowIgnore: suppressing this error -import { WalletManagerProvider } from './UI/context/WalletManagerProvider'; import PortfolioPage from './UI/pages/portfolio/PortfolioPage'; import BuySellDialog from './components/buySell/BuySellDialog'; // $FlowIgnore: suppressing this error @@ -201,12 +200,10 @@ declare var CONFIG: ConfigType; export const Routes = (stores: StoresMap, actions: ActionsMap): Node => { const queryClient = new QueryClient(); - return ( - } /> { /> - @@ -514,6 +510,8 @@ const GovernanceSubpages = (stores, actions) => ( export function wrapSwap(swapProps: StoresAndActionsProps, children: Node): Node { // const queryClient = new QueryClient(); + + const loader = ( @@ -591,9 +589,11 @@ export function wrapGovernance(governanceProps: StoresAndActionsProps, children: ); } export function wrapPortfolio(portfolioProps: StoresAndActionsProps, children: Node): Node { + const currentWalletInfo = createCurrrentWalletInfo(portfolioProps.stores); + return ( - + {children} diff --git a/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx b/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx index 4878a5713c..21eacbdb0f 100644 --- a/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx +++ b/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx @@ -141,9 +141,8 @@ const getAssetWalletAssetList = (stores: any) => { const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); const tokenName = truncateToken(getTokenStrictName(token.info).name ?? '-'); const tokenId = getTokenIdentifierIfExists(token.info) ?? '-'; - const tokenLogo = `data:image/png;base64,${ - token.info.Metadata.policyId === '' ? cardanoAdaBase64Logo : token.info.Metadata.logo - }`; + const tokenLogo = `data:image/png;base64,${token.info.Metadata.policyId === '' ? cardanoAdaBase64Logo : token.info.Metadata.logo + }`; const getFiatCurrentPrice = stores.coinPriceStore.getCurrentPrice; const { currency } = stores.profile.unitOfAccount; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx index 4a1330d6a5..6d07f52dca 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx @@ -1,5 +1,5 @@ import Box from '@mui/material/Box'; -import { styled, useTheme } from '@mui/material/styles'; +import { styled } from '@mui/material/styles'; import Typography from '@mui/material/Typography'; import React from 'react'; import { Icon } from '../../../../components'; @@ -11,10 +11,12 @@ interface Props { style?: React.CSSProperties; } + + const PnlTag = ({ children, withIcon = false, variant = 'neutral', style, ...etc }: Props) => { - const theme = useTheme(); + // const theme = useTheme(); - const icon = variant === 'danger' ? : ; + const icon = variant === 'danger' ? : ; return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index 183a782d1f..c5a8d5cf96 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -144,7 +144,7 @@ type PnlPercentChangeProps = { variantPnl: 'danger' | 'success' | 'neutral'; cha const PnlPercentChange = ({ variantPnl, changePercent }: PnlPercentChangeProps) => { return ( - {changePercent}% + {changePercent}% ); }; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index 4130b1e85d..af9acd0194 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; -import { useWalletManager } from '../../../context/WalletManagerProvider'; import { AccountPair, CurrencyType, @@ -26,6 +25,7 @@ type PortfolioProviderProps = { unitOfAccount: CurrencyType; accountPair: AccountPair; }; + currentWallet: any }; export const PortfolioContextProvider = ({ @@ -35,8 +35,9 @@ export const PortfolioContextProvider = ({ unitOfAccount: settingFiatPairUnit.enabled ? settingFiatPairUnit.currency : 'USD', accountPair: null, }, + currentWallet }: PortfolioProviderProps) => { - const { walletBalance, assetList, selectedWallet } = useWalletManager(); + const { walletBalance, assetList, selectedWallet } = currentWallet; if (selectedWallet === undefined) { return <>; } diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index 3f3cc53cb5..5b4d96be75 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -52,7 +52,7 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { }, }).current; - const { assetList } = usePortfolio(); + const { assetList, walletBalance } = usePortfolio(); React.useEffect(() => { // filter and add here the ids for query @@ -76,7 +76,7 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { // fetch1m(state.secondaryTokenIds); } }, [state.secondaryTokenIds, fetch24h]); - + console.log("@@@@", data24h) React.useEffect(() => { if (data24h) { console.log('data24h', data24h); @@ -87,7 +87,7 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { }; actions.tokenActivityChanged(combinedData); } - }, [data24h, actions]); + }, [data24h, actions, loading24h, walletBalance.ada]); const value = React.useMemo( () => ({ @@ -119,17 +119,17 @@ export enum PortfolioTokenActivityActionType { export type PortfolioTokenActivityAction = | { - type: PortfolioTokenActivityActionType.SecondaryTokenIdsChanged; - secondaryTokenIds: Portfolio.Token.Id[]; - } + type: PortfolioTokenActivityActionType.SecondaryTokenIdsChanged; + secondaryTokenIds: Portfolio.Token.Id[]; + } | { - type: PortfolioTokenActivityActionType.TokenActivityChanged; - tokenActivity: Portfolio.Api.TokenActivityResponse; - } + type: PortfolioTokenActivityActionType.TokenActivityChanged; + tokenActivity: Portfolio.Api.TokenActivityResponse; + } | { - type: PortfolioTokenActivityActionType.ActivityWindowChanged; - activityWindow: Portfolio.Token.ActivityWindow; - }; + type: PortfolioTokenActivityActionType.ActivityWindowChanged; + activityWindow: Portfolio.Token.ActivityWindow; + }; export const portfolioTokenActivityReducer = ( state: PortfolioTokenActivityState, diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index ab7b84a81d..583c5df8db 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -89,7 +89,6 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { tokenActivity: { data24h }, isLoading: isActivityLoading, } = usePortfolioTokenActivity(); - const ptActivity = useCurrencyPairing().ptActivity; console.log('primaryTokenActivity', ptActivity); diff --git a/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioPage.tsx b/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioPage.tsx index d5ba755b11..7a028f7e15 100644 --- a/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioPage.tsx +++ b/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioPage.tsx @@ -1,6 +1,5 @@ import React from 'react'; import PortfolioWallet from '../../features/portfolio/useCases/Wallet/PortfolioWallet'; -import mockData from '../../features/portfolio/common/mockData'; import PortfolioLayout from './layout'; type Props = { @@ -11,7 +10,7 @@ type Props = { const PortfolioPage = (props: Props) => { return ( - + ); }; diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index 4e21142b0a..a210999732 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -63,17 +63,17 @@ const getWalletTotalAdaBalance = (stores, selectedWallet /*: WalletState */) /*: return defaultEntry.amount.shiftedBy(-tokenInfo.Metadata.numberOfDecimals); }; -const getAssetWalletAssetList = stores => { +const getAssetWalletAssetList = (stores: any) => { const spendableBalance = stores.transactions.balance; const getTokenInfo = genLookupOrFail(stores.tokenInfoStore.tokenInfo); if (spendableBalance == null) return []; return [spendableBalance.getDefaultEntry(), ...spendableBalance.nonDefaultEntries()] - .map(entry => ({ + .map((entry: any) => ({ entry, info: getTokenInfo(entry), })) - .filter(item => item.info.IsNFT === false) - .map(token => { + .filter((item: any) => item.info.IsNFT === false) + .map((token: any) => { const numberOfDecimals = token.info?.Metadata.numberOfDecimals ?? 0; const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); @@ -82,23 +82,23 @@ const getAssetWalletAssetList = stores => { const tokenLogo = `data:image/png;base64,${ token.info.Metadata.policyId === '' ? cardanoAdaBase64Logo : token.info.Metadata.logo }`; + + const getFiatCurrentPrice = stores.coinPriceStore.getCurrentPrice; + const { currency } = stores.profile.unitOfAccount; + + const fiatPrice = getFiatCurrentPrice(tokenName, currency === null ? 'USD' : currency); + const fiatDisplay = calculateAndFormatValue(shiftedAmount, fiatPrice); return { name: tokenName, id: tokenId, totalAmount: [beforeDecimal, afterDecimal].join(''), amountForSorting: shiftedAmount, + quantity: asQuantity(token.entry.amount), tokenLogo: tokenLogo, ...token.info.Metadata, - totalAmountFiat: Math.round(100000 * Math.random()), // MOCKED - price: 0.223, // MOCKED - '24h': -(10 * Math.random()), // MOCKED - '1W': 10 * Math.random(), // MOCKED - '1M': 10 * Math.random(), // MOCKED + totalAmountFiat: fiatDisplay, + price: fiatPrice, portfolioPercents: Math.round(100 * Math.random()), // MOCKED - - // The below properties are used only in token details page - chartData: {}, - performance: [], overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -175,20 +175,20 @@ export const createCurrrentWalletInfo = (stores: any): any => { const groupedTx = groupTransactionsByDay(stores.transactions.recent); return { - currentPool: walletCurrentPoolInfo, - networkId, - walletId: currentWalletId, - selectedWallet: selectedWallet, - walletAdaBalance: walletAdaBalance.toNumber(), - unitOfAccount: stores.profile.unitOfAccount, - defaultTokenInfo: stores.tokenInfoStore.getDefaultTokenInfoSummary(networkId), - getCurrentPrice: stores.coinPriceStore.getCurrentPrice, - recentTransactions: groupedTx ? groupedTx : [], - submitedTransactions: selectedWallet.submittedTransactions, - backendService: BackendService, - backendServiceZero: BackendServiceZero, - isHardwareWallet: isHardware, - primaryTokenInfo: tokenInfo, + currentPool: walletCurrentPoolInfo, // good + networkId, // good + walletId: currentWalletId, // good + selectedWallet: selectedWallet, // good + walletAdaBalance: walletAdaBalance.toNumber(), // good + unitOfAccount: stores.profile.unitOfAccount, // good + defaultTokenInfo: stores.tokenInfoStore.getDefaultTokenInfoSummary(networkId), // good + getCurrentPrice: stores.coinPriceStore.getCurrentPrice, // good + recentTransactions: groupedTx ? groupedTx : [], // good + submitedTransactions: selectedWallet.submittedTransactions, // good + backendService: BackendService, // good + backendServiceZero: BackendServiceZero, // good + isHardwareWallet: isHardware, // good + primaryTokenInfo: tokenInfo, // good walletBalance: { ada: `${beforeDecimalRewards}${afterDecimalRewards}`, fiatAmount: fiatDisplay || 0, @@ -201,3 +201,11 @@ export const createCurrrentWalletInfo = (stores: any): any => { console.warn('ERROR trying to create wallet info', error); } }; + +export const asQuantity = (value: BigNumber | number | string) => { + const bn = new BigNumber(value); + if (bn.isNaN() || !bn.isFinite()) { + throw new Error('Invalid quantity'); + } + return bn; +}; From 64bbb1ccb4a248df441f61c3c0c435a5852cf480 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 12 Sep 2024 01:16:42 +0300 Subject: [PATCH 09/58] update UI, hide elements --- .../portfolio/common/components/PlnTag.tsx | 3 +- .../common/components/PortfolioHeader.tsx | 53 +++---------------- .../TokenDetails/TokenDetailOverview.tsx | 5 +- .../TokenDetails/TokenDetailPerformance.tsx | 14 +++-- .../useCases/TokenDetails/TokenDetails.tsx | 39 +++++++------- .../pages/portfolio/PortfolioDetailPage.tsx | 12 +++-- .../app/UI/utils/createCurrentWalletInfo.ts | 11 +++- 7 files changed, 53 insertions(+), 84 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx index 6d07f52dca..05ab201ca5 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx @@ -31,10 +31,11 @@ const TagContainer = styled(Box, { })<{ mode: 'danger' | 'success' | 'neutral'; }>(({ theme, mode }) => ({ + height: '25px', display: 'flex', alignItems: 'center', borderRadius: '999px', - padding: '3px 6px', + padding: '4px 6px', backgroundColor: getBackgroundColor(theme, mode), })); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index c5a8d5cf96..06866acabe 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -52,7 +52,7 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: {String(accountPair?.from.value)} )} - + {accountPair?.from.name} /{accountPair?.to.name} @@ -71,11 +70,11 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: - + {isLoading ? ( ) : ( - + {accountPair?.to.value} {accountPair?.to.name} )} @@ -86,49 +85,9 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: ) : ( {tooltipTitle}} placement="right"> - + - - {/* 0 - ? ChipTypes.ACTIVE - : walletBalance.percents < 0 - ? ChipTypes.INACTIVE - : ChipTypes.DISABLED - } - label={ - - {walletBalance.percents > 0 ? ( - - ) : walletBalance.percents < 0 ? ( - - ) : null} - - {walletBalance.percents >= 0 - ? formatNumber(walletBalance.percents) - : formatNumber(-1 * walletBalance.percents)} - % - - - } - /> - 0 - ? ChipTypes.ACTIVE - : walletBalance.amount < 0 - ? ChipTypes.INACTIVE - : ChipTypes.DISABLED - } - label={ - - {walletBalance.amount > 0 && '+'} - {formatNumber(walletBalance.amount)} {unitOfAccount} - - } - /> */} )} @@ -144,7 +103,7 @@ type PnlPercentChangeProps = { variantPnl: 'danger' | 'success' | 'neutral'; cha const PnlPercentChange = ({ variantPnl, changePercent }: PnlPercentChangeProps) => { return ( - {changePercent}% + {changePercent}% ); }; @@ -158,7 +117,7 @@ const PnlPairedChange = ({ variantPnl, changeValue }: PnlPairedChangeProps) => { return ( - {`${Number(changeValue) > 0 ? '+' : ''}${changeValue} ${currency}`} + {`${Number(changeValue) > 0 ? '+' : ''}${changeValue} ${currency}`} ); }; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx index 8c0415f3da..714b0d75f2 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx @@ -1,8 +1,8 @@ +import { Box, Link, Stack, Typography } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; import React from 'react'; -import { Stack, Box, Typography, Link } from '@mui/material'; import { Skeleton } from '../../../../components/Skeleton'; import { CopyButton } from '../../../../components/buttons/CopyButton'; -import { useTheme } from '@mui/material/styles'; import tokenPng from '../../common/assets/images/token.png'; import { useStrings } from '../../common/hooks/useStrings'; import { TokenType } from '../../common/types/index'; @@ -17,6 +17,7 @@ const TokenDetailOverview = ({ tokenInfo, isLoading, isAda }: Props): JSX.Elemen const theme: any = useTheme(); const strings = useStrings(); + return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx index 02f61be4b0..17ffda998d 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx @@ -1,11 +1,9 @@ -import React from 'react'; import { Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; +import React from 'react'; import { useStrings } from '../../common/hooks/useStrings'; -import { usePortfolio } from '../../module/PortfolioContextProvider'; -import { Skeleton } from '../../../../components/Skeleton'; import { TokenType } from '../../common/types/index'; -import { formatNumber } from '../../common/helpers/formatHelper'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; const PerformanceItemType = { FIAT: 'fiat', @@ -45,7 +43,7 @@ const TokenDetailPerformance = ({ tokenInfo, isLoading }: Props): JSX.Element => {strings.marketData} - {firstPerformanceItemList.map((item, index) => ( + {/* {firstPerformanceItemList.map((item, index) => ( )} - ))} + ))} */} - {secondPerformanceItemList.map((item, index) => ( + {/* {secondPerformanceItemList.map((item, index) => ( {item.label} {isLoading ? ( @@ -94,7 +92,7 @@ const TokenDetailPerformance = ({ tokenInfo, isLoading }: Props): JSX.Element => )} - ))} + ))} */} ); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index 18db42edbf..7608e65ba6 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -1,20 +1,19 @@ -import React, { useEffect, useState } from 'react'; import { Box, Divider, Stack, Typography } from '@mui/material'; -import { ReactComponent as BackIcon } from '../../../../../assets/images/assets-page/back-arrow.inline.svg'; import { styled, useTheme } from '@mui/material/styles'; -import { Skeleton, Card } from '../../../../components'; -import TransactionTable from './TransactionTable'; -import TokenDetailChart from './TokenDetailChart'; +import React, { useEffect, useState } from 'react'; +import { ReactComponent as BackIcon } from '../../../../../assets/images/assets-page/back-arrow.inline.svg'; +import { Card, Skeleton } from '../../../../components'; +import Menu from '../../common/components/Menu'; +import NavigationButton from '../../common/components/NavigationButton'; +import { formatNumber } from '../../common/helpers/formatHelper'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useStrings } from '../../common/hooks/useStrings'; -import TokenDetailPerformance from './TokenDetailPerformance'; -import TokenDetailOverview from './TokenDetailOverview'; -import { usePortfolio } from '../../module/PortfolioContextProvider'; -import { SubMenuOption, TokenType } from '../../common/types/index'; -import NavigationButton from '../../common/components/NavigationButton'; import mockData from '../../common/mockData'; -import { formatNumber } from '../../common/helpers/formatHelper'; -import Menu from '../../common/components/Menu'; +import { SubMenuOption, TokenType } from '../../common/types/index'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; +import TokenDetailOverview from './TokenDetailOverview'; +import TokenDetailPerformance from './TokenDetailPerformance'; +import TransactionTable from './TransactionTable'; const Header = styled(Box)({ display: 'flex', @@ -42,16 +41,16 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { const isAda: boolean = tokenInfo.name.toLowerCase() === 'ada'; const subMenuOptions: SubMenuOption[] = [ - { - label: strings.performance, - className: 'performance', - route: 'performance', - }, { label: strings.overview, className: 'overview', route: 'overview', }, + // { + // label: strings.performance, + // className: 'performance', + // route: 'performance', + // }, ]; const [selectedTab, setSelectedTab] = useState(subMenuOptions[0]?.route); @@ -142,7 +141,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { - + {/* */} @@ -153,13 +152,13 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { {selectedTab === subMenuOptions[0]?.route ? ( - + ) : null} {selectedTab === subMenuOptions[1]?.route ? ( - + ) : null} diff --git a/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioDetailPage.tsx b/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioDetailPage.tsx index 7e2a06b123..695f0b7e06 100644 --- a/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioDetailPage.tsx +++ b/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioDetailPage.tsx @@ -1,8 +1,8 @@ import React from 'react'; -import mockData from '../../features/portfolio/common/mockData'; -import PortfolioLayout from './layout'; -import TokenDetails from './../../features/portfolio/useCases/TokenDetails/TokenDetails'; import { TokenType } from '../../features/portfolio/common/types'; +import { usePortfolio } from '../../features/portfolio/module/PortfolioContextProvider'; +import TokenDetails from './../../features/portfolio/useCases/TokenDetails/TokenDetails'; +import PortfolioLayout from './layout'; type Props = { stores: any; @@ -13,9 +13,11 @@ type Props = { const PortfolioDetailPage = ({ match, ...props }: Props) => { const tokenId = match.params.tokenId; + const { assetList } = usePortfolio() + const tokenInfo = React.useMemo(() => { - const tmp = mockData.wallet.tokenList.find(item => item.id === tokenId); - if (tmp) return tmp; + const token = assetList.find(item => item.id === tokenId); + if (token) return token; return {} as TokenType; }, [tokenId]); diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index a210999732..4b55e820c5 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -74,6 +74,7 @@ const getAssetWalletAssetList = (stores: any) => { })) .filter((item: any) => item.info.IsNFT === false) .map((token: any) => { + console.log('token', token); const numberOfDecimals = token.info?.Metadata.numberOfDecimals ?? 0; const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); @@ -93,7 +94,6 @@ const getAssetWalletAssetList = (stores: any) => { id: tokenId, totalAmount: [beforeDecimal, afterDecimal].join(''), amountForSorting: shiftedAmount, - quantity: asQuantity(token.entry.amount), tokenLogo: tokenLogo, ...token.info.Metadata, totalAmountFiat: fiatDisplay, @@ -108,6 +108,15 @@ const getAssetWalletAssetList = (stores: any) => { fingerprint: 'asset311q8dhlxmgagkx0ldt4xc7wzdv2wza8gu2utxw294sr23zuc8dhlxmgagkx0ldt4xc7wzk8213yjnad98h1n1j99naskajsj6789', }, + + // TODO new structure here + quantity: token.entry.amount, + // info: { + // indetifier: token.entry.identifier, + // description: token.info.Metadata.assetMintMetadata[0], + // policyId: token.info.Metadata.policyId, + // fingerprint: '', + // }, }; }); }; From 90f0def4b350a402970be8e3eee582be2e73d4e6 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 12 Sep 2024 12:18:21 +0300 Subject: [PATCH 10/58] add procentage hook --- .../common/components/TableRowSkeleton.tsx | 54 +++++ .../common/hooks/useTokenPercentages.tsx | 39 ++++ .../portfolio/useCases/Wallet/StatsTable.tsx | 191 +++++++----------- .../app/UI/utils/createCurrentWalletInfo.ts | 32 ++- 4 files changed, 185 insertions(+), 131 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/components/TableRowSkeleton.tsx create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/TableRowSkeleton.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/TableRowSkeleton.tsx new file mode 100644 index 0000000000..eb96d733eb --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/TableRowSkeleton.tsx @@ -0,0 +1,54 @@ + + +import { Stack, TableCell, TableRow } from '@mui/material'; +import React from 'react'; +import { Skeleton } from '../../../../components'; + + +export const TableRowSkeleton = ({ theme, ...props }) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx new file mode 100644 index 0000000000..3df98cef87 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx @@ -0,0 +1,39 @@ +import BigNumber from 'bignumber.js'; +import { useMemo } from 'react'; + +type Token = { + id: string; + info: { + name: string; + [key: string]: any; + }; + quantity: BigNumber; + [key: string]: any; +}; + +type TokenWithPercentage = Token & { + percentage: number; +}; + +export const useTokenPercentages = (tokens: Token[]): TokenWithPercentage[] => { + const tokenPercentages = useMemo(() => { + if (!tokens || tokens.length === 0) return {}; + + const totalQuantity = tokens.reduce((acc, token) => { + return acc.plus(token.quantity); + }, new BigNumber(0)); + + return tokens.reduce((acc, token) => { + const percentage = totalQuantity.isZero() + ? '0.00' + : token.quantity.dividedBy(totalQuantity).multipliedBy(100).toFixed(2); + + return { + ...acc, + [token.info.id]: percentage, + }; + }, {} as any); + }, [tokens]); + + return tokenPercentages; +}; \ No newline at end of file diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index 583c5df8db..ff0fec4f5a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -3,70 +3,26 @@ import { useTheme } from '@mui/material/styles'; import { atomicBreakdown } from '@yoroi/common'; import BigNumber from 'bignumber.js'; import React, { useMemo, useState } from 'react'; -import { Chip, Skeleton } from '../../../../components'; +import { Chip } from '../../../../components'; import { ChipTypes } from '../../../../components/Chip'; import { Icon } from '../../../../components/icons'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import tokenPng from '../../common/assets/images/token.png'; import PnlTag from '../../common/components/PlnTag'; import Table from '../../common/components/Table'; +import { TableRowSkeleton } from '../../common/components/TableRowSkeleton'; import { formatNumber } from '../../common/helpers/formatHelper'; import { formatPriceChange, priceChange } from '../../common/helpers/priceChange'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useStrings } from '../../common/hooks/useStrings'; import useTableSort, { ISortState } from '../../common/hooks/useTableSort'; +import { useTokenPercentages } from '../../common/hooks/useTokenPercentages'; import { TokenType } from '../../common/types/index'; import { IHeadCell } from '../../common/types/table'; import { usePortfolio } from '../../module/PortfolioContextProvider'; import { usePortfolioTokenActivity } from '../../module/PortfolioTokenActivityProvider'; -const TableRowSkeleton = ({ theme, ...props }) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); + interface Props { data: TokenType[]; @@ -91,7 +47,6 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { } = usePortfolioTokenActivity(); const ptActivity = useCurrencyPairing().ptActivity; - console.log('primaryTokenActivity', ptActivity); const headCells: IHeadCell[] = [ { id: 'name', label: strings.name, align: 'left', sortType: 'character' }, @@ -115,6 +70,10 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { const { getSortedData, handleRequestSort } = useTableSort({ order, orderBy, setSortState, headCells, data }); + // TODO refactor and add calculation based on fiat toatl value - endpont not working + const procentageData = useTokenPercentages(data) + + return ( { }} > - - - - - {row.name} - - - {row.ticker} - - - + @@ -181,69 +122,20 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { isPrimaryToken={row.policyId.length === 0} /> )} - - {/* 0 ? ChipTypes.ACTIVE : row['24h'] < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} - label={ - - {row['24h'] > 0 ? ( - - ) : row['24h'] < 0 ? ( - - ) : null} - - {row['24h'] >= 0 ? formatNumber(row['24h']) : formatNumber(-1 * row['24h'])}% - - - } - sx={{ cursor: 'pointer' }} - /> */} - 0 ? ChipTypes.ACTIVE : row['1W'] < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} - label={ - - {row['1W'] > 0 ? ( - - ) : row['1W'] < 0 ? ( - - ) : null} - {/* @ts-ignore */} - - {row['1W'] >= 0 ? formatNumber(row['1W']) : formatNumber(-1 * row['1W'])}% - - - } - sx={{ cursor: 'pointer' }} - /> + - 0 ? ChipTypes.ACTIVE : row['1M'] < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} - label={ - - {row['1M'] > 0 ? ( - - ) : row['1M'] < 0 ? ( - - ) : null} - {/* @ts-ignore */} - - {row['1M'] >= 0 ? formatNumber(row['1M']) : formatNumber(-1 * row['1M'])}% - - - } - sx={{ cursor: 'pointer' }} - /> + - - {formatNumber(row.portfolioPercents)} % - + @@ -266,6 +158,30 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { export default StatsTable; + +const TokenDisplay = ({ token }) => { + const theme = useTheme() + return + + + + {token.name} + + + {token.ticker} + + + +} + const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, isPrimaryToken }) => { const { close, open } = isPrimaryToken ? primaryTokenActivity @@ -367,3 +283,34 @@ const TokenPrice = ({ token, unitOfAccount, secondaryToken24Activity, ptActivity ); }; + +const TokenProcentage = ({ procentage }) => { + return ( + + {procentage}% + + ); +}; + + +// MOCK DATA +const TokenChip = ({ token }) => { + const theme = useTheme() + return 0 ? ChipTypes.ACTIVE : token['1M'] < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} + label={ + + {token['1M'] > 0 ? ( + + ) : token['1M'] < 0 ? ( + + ) : null} + {/* @ts-ignore */} + + {token['1M'] >= 0 ? formatNumber(token['1M']) : formatNumber(-1 * token['1M'])}% + + + } + sx={{ cursor: 'pointer' }} + /> +} \ No newline at end of file diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index 4b55e820c5..d4eb119bf4 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -74,7 +74,6 @@ const getAssetWalletAssetList = (stores: any) => { })) .filter((item: any) => item.info.IsNFT === false) .map((token: any) => { - console.log('token', token); const numberOfDecimals = token.info?.Metadata.numberOfDecimals ?? 0; const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); @@ -88,10 +87,12 @@ const getAssetWalletAssetList = (stores: any) => { const { currency } = stores.profile.unitOfAccount; const fiatPrice = getFiatCurrentPrice(tokenName, currency === null ? 'USD' : currency); - const fiatDisplay = calculateAndFormatValue(shiftedAmount, fiatPrice); + const coinShiftedAmount = new BigNumber(shiftedAmount); + + const fiatDisplay = calculateAndFormatValue(coinShiftedAmount, fiatPrice); return { name: tokenName, - id: tokenId, + totalAmount: [beforeDecimal, afterDecimal].join(''), amountForSorting: shiftedAmount, tokenLogo: tokenLogo, @@ -99,6 +100,7 @@ const getAssetWalletAssetList = (stores: any) => { totalAmountFiat: fiatDisplay, price: fiatPrice, portfolioPercents: Math.round(100 * Math.random()), // MOCKED + overview: { description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", @@ -111,11 +113,20 @@ const getAssetWalletAssetList = (stores: any) => { // TODO new structure here quantity: token.entry.amount, - // info: { - // indetifier: token.entry.identifier, - // description: token.info.Metadata.assetMintMetadata[0], - // policyId: token.info.Metadata.policyId, - // fingerprint: '', + id: tokenId, + info: { + id: token.entry.identifier, + name: tokenName, + policyId: token.info.Metadata.policyId, + fingerprint: token.id, + metadata: token.info.Metadata?.assetMintMetadata?.[0] || null, + }, + // utils: { + // totalAmountFiat: fiatDisplay, + // price: fiatPrice, + // totalAmount: [beforeDecimal, afterDecimal].join(''), + // amountForSorting: shiftedAmount, + // image: tokenLogo, // }, }; }); @@ -175,7 +186,10 @@ export const createCurrrentWalletInfo = (stores: any): any => { const { currency } = profile.unitOfAccount; const getFiatCurrentPrice = coinPriceStore.getCurrentPrice; const fiatPrice = getFiatCurrentPrice(ticker, currency === null ? 'USD' : currency); - const fiatDisplay = calculateAndFormatValue(shiftedAmount, fiatPrice); + if (fiatPrice === null) { + return; + } + const fiatDisplay = calculateAndFormatValue(Number(shiftedAmount), fiatPrice); const isHardware: boolean = selectedWallet.isHardware; // Asset List From 017d6e81e135e79fbf0f4add7d1bda3823964ab0 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 12 Sep 2024 13:51:47 +0300 Subject: [PATCH 11/58] add first iteration of primary token chart with real data for 24 h --- .../portfolio/common/helpers/isPrimary.ts | 7 + .../common/hooks/usePortfolioTokenChart.ts | 165 ++++++++++++++++++ .../TokenDetails/TokenChartInterval.tsx | 147 ++++++++++++++++ .../TokenDetails/TokenDetailChart.tsx | 56 ++++-- .../useCases/TokenDetails/TokenDetails.tsx | 22 ++- 5 files changed, 371 insertions(+), 26 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts new file mode 100644 index 0000000000..e7b0b5eaa5 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts @@ -0,0 +1,7 @@ +// TODO - silly implementation add more logic +export const isPrimaryToken = tokenInfo => { + if (tokenInfo.id.length === 0) { + return true; + } + return false; +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts new file mode 100644 index 0000000000..a49b88cd23 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts @@ -0,0 +1,165 @@ +import { isRight } from '@yoroi/common'; +import { useQuery, UseQueryOptions } from 'react-query'; + +// import { useLanguage } from '../../../kernel/i18n'; +import { supportedCurrencies, time } from '../../../../utils/constants'; +import { fetchPtPriceActivity } from '../../../../utils/usePrimaryTokenActivity'; +import { isPrimaryToken } from '../helpers/isPrimary'; +import { priceChange } from '../helpers/priceChange'; + +export const TOKEN_CHART_INTERVAL = { + DAY: '24 H', + WEEK: '1 W', + MONTH: '1 M', + SIX_MONTHS: '6 M', + YEAR: '1 Y', + ALL: 'ALL', +} as const; + +export type TokenChartInterval = typeof TOKEN_CHART_INTERVAL[keyof typeof TOKEN_CHART_INTERVAL]; + +type TokenChartData = { + label: string; + value: number; + changePercent: number; + changeValue: number; +}; + +function generateMockChartData(timeInterval: TokenChartInterval = TOKEN_CHART_INTERVAL.DAY): TokenChartData[] { + const dataPoints = 50; + const startValue = 100; + const volatility = 50; + + const startDate = new Date('2024-02-02T15:09:00'); + + function getTimeIncrement(interval: TokenChartInterval): number { + switch (interval) { + case TOKEN_CHART_INTERVAL.DAY: + return 60 * 60 * 1000; // 1 hour + case TOKEN_CHART_INTERVAL.WEEK: + return 24 * 60 * 60 * 1000; // 1 day + case TOKEN_CHART_INTERVAL.MONTH: + return 30 * 24 * 60 * 60 * 1000; // 1 month (approximated as 30 days) + case TOKEN_CHART_INTERVAL.SIX_MONTHS: + return 6 * 30 * 24 * 60 * 60 * 1000; // 6 months + case TOKEN_CHART_INTERVAL.YEAR: + return 12 * 30 * 24 * 60 * 60 * 1000; // 1 year (approximated as 360 days) + default: + return 60 * 1000; // Default to 1 minute + } + } + + const increment = getTimeIncrement(timeInterval); + const chartData: TokenChartData[] = []; + + let previousValue = startValue; + + for (let i = 0; i < dataPoints; i++) { + const date = new Date(startDate.getTime() + i * increment); + const label = `${date.getDate().toString().padStart(2, '0')}/${(date.getMonth() + 1) + .toString() + .padStart(2, '0')}/${date.getFullYear().toString().substr(-2)} ${date.getHours()}:${date + .getMinutes() + .toString() + .padStart(2, '0')}`; + const value = i === 0 ? startValue : previousValue + (Math.random() - 0.5) * volatility; + const changeValue = i === 0 ? 0 : value - previousValue; + const changePercent = i === 0 ? 0 : (changeValue / previousValue) * 100; + + chartData.push({ + label, + value, + changePercent, + changeValue, + }); + + previousValue = value; // Update previousValue for the next iteration + } + + return chartData; +} + +const getTimestamps = (timeInterval: TokenChartInterval) => { + const now = Date.now(); + const [from, resolution] = { + [TOKEN_CHART_INTERVAL.DAY]: [now - time.oneDay, 96], + [TOKEN_CHART_INTERVAL.WEEK]: [now - time.oneWeek, 168], + [TOKEN_CHART_INTERVAL.MONTH]: [now - time.oneMonth, 180], + [TOKEN_CHART_INTERVAL.SIX_MONTHS]: [now - time.sixMonths, 180], + [TOKEN_CHART_INTERVAL.YEAR]: [now - time.oneYear, 365], + [TOKEN_CHART_INTERVAL.ALL]: [new Date('2018').getTime(), 256], + }[timeInterval]; + + const step = (now - from) / resolution; + return Array.from({ length: resolution }, (_, i) => from + Math.round(step * i)); +}; + +const ptTicker = 'ADA'; + +export const useGetPortfolioTokenChart = ( + timeInterval = TOKEN_CHART_INTERVAL.DAY as TokenChartInterval, + tokenInfo, + options: UseQueryOptions< + TokenChartData[], + Error, + TokenChartData[], + ['useGetPortfolioTokenChart', string, TokenChartInterval, ReturnType['currency']?] + > = {} +) => { + // const { currency } = useCurrencyPairing(); + const currency = 'USD'; + + const ptQuery = useQuery({ + staleTime: time.halfHour, + cacheTime: time.oneHour, + retryDelay: time.oneSecond, + optimisticResults: true, + refetchInterval: time.halfHour, + useErrorBoundary: true, + refetchOnMount: false, + enabled: tokenInfo && tokenInfo.info.id?.length === 0, + ...options, + queryKey: ['useGetPortfolioTokenChart', tokenInfo?.info.id ?? '', timeInterval, currency], + queryFn: async () => { + const response = await fetchPtPriceActivity(getTimestamps(timeInterval)); + if (isRight(response)) { + if (response.value.data.error) throw new Error(response.value.data.error); + + const tickers = response.value.data.tickers; + const validCurrency = currency === ptTicker ? supportedCurrencies.USD : currency ?? supportedCurrencies.USD; + + const initialPrice = tickers[0].prices[validCurrency]; + const records = tickers + .map(ticker => { + const value = ticker.prices[validCurrency]; + if (value === undefined) return undefined; + const { changePercent, changeValue } = priceChange(initialPrice, value); + const label = new Date(ticker.timestamp).toLocaleString('en', { + dateStyle: 'short', + timeStyle: 'short', + }); + return { label, value, changePercent, changeValue }; + }) + .filter(Boolean) as TokenChartData[]; + + return records; + } + throw new Error('Failed to fetch token chart data'); + }, + }); + + const otherQuery = useQuery({ + useErrorBoundary: true, + refetchOnMount: false, + enabled: tokenInfo && !isPrimaryToken(tokenInfo.info), + ...options, + queryKey: ['useGetPortfolioTokenChart', tokenInfo?.info.id ?? '', timeInterval], + queryFn: async () => { + await new Promise(resolve => setTimeout(resolve, 1)); + return generateMockChartData(timeInterval); + }, + }); + + return ptQuery; + // return tokenInfo && isPrimaryToken(tokenInfo.info) ? ptQuery : otherQuery; +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx new file mode 100644 index 0000000000..0a3535d746 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx @@ -0,0 +1,147 @@ +import { Box, Button, Stack, Typography, styled } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import React, { useState } from 'react'; +import { + CartesianGrid, + Line, + LineChart, + Tooltip as RechartTooltip, + ResponsiveContainer, + XAxis, + YAxis, +} from 'recharts'; +import { Skeleton } from '../../../../components'; +import chartSkeletonPng from '../../common/assets/images/token-detail-chart-skeleton.png'; +import { formatNumber } from '../../common/helpers/formatHelper'; +import { TOKEN_CHART_INTERVAL, useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; +import { useStrings } from '../../common/hooks/useStrings'; +import { TokenType } from '../../common/types/index'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; + +// Styling for the period buttons +const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; disabled: boolean; variant: string }) => ({ + fontWeight: 500, + fontSize: '0.75rem', + lineHeight: '1.125rem', + height: '30px', + padding: '6px !important', + minWidth: '36px', + backgroundColor: + variant === 'contained' ? (disabled ? theme.palette.ds.gray_100 : theme.palette.ds.el_primary_medium) : `transparent`, + + '&.MuiButton-contained': { + color: theme.palette.ds.white_static, + }, + '&.MuiButton-secondary': { + color: disabled ? theme.palette.ds.gray_100 : theme.palette.ds.text_primary_medium, + }, +})); + +interface Props { + isLoading: boolean; + tokenInfo: TokenType; + isPrimaryToken: boolean; +} + +export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Props): JSX.Element => { + const chartHeight = isPrimaryToken ? 153 : 257; + const theme: any = useTheme(); + const strings = useStrings(); + const { unitOfAccount } = usePortfolio(); + + // Fetch data based on the selected interval + const [timeInterval, setTimeInterval] = useState(TOKEN_CHART_INTERVAL.DAY); + const { data, isFetching } = useGetPortfolioTokenChart(timeInterval, tokenInfo); + + const handlePeriodChange = (id: string) => { + setTimeInterval(id); + }; + + // Prepare the chart data for recharts + const chartData = data?.map((point: any) => ({ + label: point.label, + value: point.value, + })) || []; + + return ( + + + {isFetching || !data ? ( + + ) : ( + + {strings.marketPrice} + + )} + + {isFetching || !data ? ( + + ) : ( + + {formatNumber(data[data.length - 1]?.value)} + +  {unitOfAccount} + + + )} + + + + + + {isFetching || !data ? null : ( + + + + formatNumber(value)} + /> + + + + + + )} + + + + {Object.keys(TOKEN_CHART_INTERVAL).map((interval) => ( + handlePeriodChange(interval)} + theme={theme} + > + {interval} + + ))} + + + + ); +}; + diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailChart.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailChart.tsx index e312d8b4b7..c1b106823a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailChart.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailChart.tsx @@ -1,16 +1,28 @@ import { Box, Button, Stack, Typography, styled } from '@mui/material'; -import React, { useEffect, useState } from 'react'; -import { LineChart, Line, CartesianGrid, YAxis, ResponsiveContainer, Tooltip as RechartTooltip } from 'recharts'; import { useTheme } from '@mui/material/styles'; -import { Skeleton, Tooltip, Chip } from '../../../../components'; -import chartSkeletonPng from '../../common/assets/images/token-detail-chart-skeleton.png'; -import { useStrings } from '../../common/hooks/useStrings'; -import { usePortfolio } from '../../module/PortfolioContextProvider'; +import React, { useEffect, useState } from 'react'; +import { CartesianGrid, Line, LineChart, Tooltip as RechartTooltip, ResponsiveContainer, YAxis } from 'recharts'; +import { Chip, Skeleton, Tooltip } from '../../../../components'; +import { ChipTypes } from '../../../../components/Chip'; import { Icon } from '../../../../components/icons'; +import chartSkeletonPng from '../../common/assets/images/token-detail-chart-skeleton.png'; +import { formatNumber } from '../../common/helpers/formatHelper'; +import { createChartData } from '../../common/helpers/mockHelper'; import useChart from '../../common/hooks/useChart'; +import { TOKEN_CHART_INTERVAL, useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; +import { useStrings } from '../../common/hooks/useStrings'; import { TokenType } from '../../common/types/index'; -import { ChipTypes } from '../../../../components/Chip'; -import { formatNumber } from '../../common/helpers/formatHelper'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; + + +const chartData = { + start24HoursAgo: createChartData('24H'), + start1WeekAgo: createChartData('1W'), + start1MonthAgo: createChartData('1M'), + start6MonthAgo: createChartData('6M'), + start1YearAgo: createChartData('1Y'), + ALL: createChartData('1Y'), +} const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; disabled: boolean; variant: string }) => ({ fontWeight: 500, @@ -33,11 +45,11 @@ const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; interface Props { isLoading: boolean; tokenInfo: TokenType; - isAda: boolean; + isPrimaryToken: boolean; } -const TokenDetailChart = ({ isLoading, tokenInfo, isAda }: Props): JSX.Element => { - const chartHeight = isAda ? 153 : 257; +const TokenDetailChart = ({ isLoading, tokenInfo, isPrimaryToken }: Props): JSX.Element => { + const chartHeight = isPrimaryToken ? 153 : 257; const theme: any = useTheme(); const strings = useStrings(); const { unitOfAccount } = usePortfolio(); @@ -53,7 +65,7 @@ const TokenDetailChart = ({ isLoading, tokenInfo, isAda }: Props): JSX.Element = minValue, maxValue, activePeriodId, - } = useChart(tokenInfo.chartData); + } = useChart(chartData); const [isFetching, setIsFetching] = useState(false); useEffect(() => { @@ -75,6 +87,15 @@ const TokenDetailChart = ({ isLoading, tokenInfo, isAda }: Props): JSX.Element = }, 1000); }; + + // new logic =---------------------------------------------------------------- + + + const [timeInterval, setTimeInterval] = useState(TOKEN_CHART_INTERVAL.DAY) + + const { data } = useGetPortfolioTokenChart(timeInterval, tokenInfo) + console.log("useGetPortfolioTokenChart", data) + return ( 0 ? ChipTypes.ACTIVE : detailInfo.fiatValue < 0 - ? ChipTypes.INACTIVE - : ChipTypes.DISABLED + ? ChipTypes.INACTIVE + : ChipTypes.DISABLED } label={ - // @ts-ignore - + {detailInfo.fiatValue > 0 && '+'} {formatNumber(detailInfo.fiatValue)} {unitOfAccount} @@ -173,7 +193,7 @@ const TokenDetailChart = ({ isLoading, tokenInfo, isAda }: Props): JSX.Element = {isFetching ? null : ( )} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index 7608e65ba6..e03674f5e7 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -5,12 +5,13 @@ import { ReactComponent as BackIcon } from '../../../../../assets/images/assets- import { Card, Skeleton } from '../../../../components'; import Menu from '../../common/components/Menu'; import NavigationButton from '../../common/components/NavigationButton'; -import { formatNumber } from '../../common/helpers/formatHelper'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; +import { useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; import { useStrings } from '../../common/hooks/useStrings'; import mockData from '../../common/mockData'; import { SubMenuOption, TokenType } from '../../common/types/index'; import { usePortfolio } from '../../module/PortfolioContextProvider'; +import { TokenChartInterval } from './TokenChartInterval'; import TokenDetailOverview from './TokenDetailOverview'; import TokenDetailPerformance from './TokenDetailPerformance'; import TransactionTable from './TransactionTable'; @@ -33,12 +34,15 @@ interface Props { } const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { + console.log("tokenInfo", tokenInfo) const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); - const { unitOfAccount } = usePortfolio(); + const { unitOfAccount, walletBalance } = usePortfolio(); const [isLoading, setIsLoading] = useState(false); - const isAda: boolean = tokenInfo.name.toLowerCase() === 'ada'; + const isPrimaryToken: boolean = tokenInfo.id === '-' + const tokenTotalAmount = isPrimaryToken ? walletBalance.ada : tokenInfo.totalAmount + console.log("[tokenTotalAmount]", tokenTotalAmount) const subMenuOptions: SubMenuOption[] = [ { @@ -73,6 +77,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { return () => clearTimeout(timer); }, []); + const { data } = useGetPortfolioTokenChart('24 H', tokenInfo) return ( @@ -114,7 +119,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { ) : ( - {formatNumber(tokenInfo.totalAmount)} + {tokenTotalAmount} { ) : ( - {formatNumber(tokenInfo.totalAmountFiat)} {isAda && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} + {(tokenInfo.totalAmountFiat)} {isPrimaryToken && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} )} - - {/* */} + {/* {isPrimaryToken && */} + {isPrimaryToken && + } @@ -152,7 +158,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { {selectedTab === subMenuOptions[0]?.route ? ( - + ) : null} From 2a256c716a3308816aefda18ad21388be91681e2 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 12 Sep 2024 15:13:05 +0300 Subject: [PATCH 12/58] add interval for all time periods --- .../portfolio/useCases/TokenDetails/TokenChartInterval.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx index 0a3535d746..7cc58b2c98 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx @@ -54,7 +54,7 @@ export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Pro const { data, isFetching } = useGetPortfolioTokenChart(timeInterval, tokenInfo); const handlePeriodChange = (id: string) => { - setTimeInterval(id); + setTimeInterval(TOKEN_CHART_INTERVAL[id]); }; // Prepare the chart data for recharts @@ -136,7 +136,7 @@ export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Pro onClick={() => handlePeriodChange(interval)} theme={theme} > - {interval} + {TOKEN_CHART_INTERVAL[interval]} ))} From 3cf4b233c365d96ece0027f943cfeaeca6030d82 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Fri, 13 Sep 2024 14:07:23 +0300 Subject: [PATCH 13/58] refactor garaph to use real data, update styles --- .../common/components/PortfolioHeader.tsx | 4 +- .../portfolio/common/hooks/useChart.tsx | 108 +++++++---------- .../features/portfolio/common/types/chart.ts | 12 +- .../TokenDetails/TokenChartInterval.tsx | 110 +++++++++++++++--- .../app/UI/utils/createCurrentWalletInfo.ts | 8 +- 5 files changed, 146 insertions(+), 96 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index 06866acabe..897dbf7d30 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -100,7 +100,7 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: }; type PnlPercentChangeProps = { variantPnl: 'danger' | 'success' | 'neutral'; changePercent: string }; -const PnlPercentChange = ({ variantPnl, changePercent }: PnlPercentChangeProps) => { +export const PnlPercentChange = ({ variantPnl, changePercent }: PnlPercentChangeProps) => { return ( {changePercent}% @@ -112,7 +112,7 @@ type PnlPairedChangeProps = { variantPnl: 'danger' | 'success' | 'neutral'; changeValue: string; }; -const PnlPairedChange = ({ variantPnl, changeValue }: PnlPairedChangeProps) => { +export const PnlPairedChange = ({ variantPnl, changeValue }: PnlPairedChangeProps) => { const { currency } = useCurrencyPairing(); return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx index 9d9271d36d..ec3cff25e6 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx @@ -1,30 +1,27 @@ -import React, { useMemo, useState } from 'react'; -import { useStrings } from './useStrings'; -import { useTheme } from '@mui/material/styles'; import { Box } from '@mui/material'; -import moment from 'moment'; -import { IChartData, IChartDataItem } from '../types/chart'; -import { ITabButtonProps } from '../types'; +import { useTheme } from '@mui/material/styles'; +import React, { useState } from 'react'; +import { IChartData } from '../types/chart'; const useChart = (data: IChartData) => { - const strings = useStrings(); const theme: any = useTheme(); - const [periodButtonProps, setPeriodButtonProps] = useState([ - { id: 'start24HoursAgo', label: strings['24H'], active: true }, - { id: 'start1WeekAgo', label: strings['1W'], active: false }, - { id: 'start1MonthAgo', label: strings['1M'], active: false }, - { id: 'start6MonthAgo', label: strings['6M'], active: false }, - { id: 'start1YearAgo', label: strings['1Y'], active: false }, - { id: 'ALL', label: strings['ALL'], active: false }, - ]); - const [detailInfo, setDetailInfo] = useState<{ value: number; fiatValue: number }>({ - value: data ? data[periodButtonProps[0]?.id || 0][data[periodButtonProps[0]?.id || 0].length - 1].value : 0, - fiatValue: data ? data[periodButtonProps[0]?.id || 0][data[periodButtonProps[0]?.id || 0].length - 1].fiatValue : 0, + console.log("data", data) + console.log("data", data[0]?.label) + // const [periodButtonProps, setPeriodButtonProps] = useState([ + // { id: 'start24HoursAgo', label: strings['24H'], active: true }, + // { id: 'start1WeekAgo', label: strings['1W'], active: false }, + // { id: 'start1MonthAgo', label: strings['1M'], active: false }, + // { id: 'start6MonthAgo', label: strings['6M'], active: false }, + // { id: 'start1YearAgo', label: strings['1Y'], active: false }, + // { id: 'ALL', label: strings['ALL'], active: false }, + // ]); + const [detailInfo, setDetailInfo] = useState<{ value: number; label: string, changeValue: number, changePercent: number }>({ + label: data[0]?.label, + value: data[0]?.value, + changeValue: data[0]?.changeValue, + changePercent: data[0]?.changePercent, }); const [isDragging, setIsDragging] = useState(false); - - const activePeriodId = useMemo(() => periodButtonProps.find(item => item.active)?.id || 0, [periodButtonProps]); - const CustomYAxisTick = ({ x, y, @@ -51,7 +48,6 @@ const useChart = (data: IChartData) => { const CustomActiveDot = ({ cx, cy, - payload, index, dataLength, chartBottom, @@ -107,9 +103,10 @@ const useChart = (data: IChartData) => { fontFamily: theme.typography.fontFamily, fontSize: '0.75rem', fontWeight: 400, + paddingRight: '5px', }} > - {moment(payload.time).format('MM/DD/YY H:mm')} + {detailInfo.label} )} @@ -117,35 +114,6 @@ const useChart = (data: IChartData) => { ); }; - const handleChoosePeriod = (id: string) => { - const tmp = periodButtonProps.map(item => { - if (item.id === id) { - if (item.active) { - return item; - } else { - return { ...item, active: true }; - } - } - return { - ...item, - active: false, - }; - }); - setPeriodButtonProps(tmp); - setDetailInfo({ - value: data - ? data[periodButtonProps.find(item => item.id === id)?.id || 0][ - data[periodButtonProps.find(item => item.id === id)?.id || 0].length - 1 - ].value - : 0, - fiatValue: data - ? data[periodButtonProps.find(item => item.id === id)?.id || 0][ - data[periodButtonProps.find(item => item.id === id)?.id || 0].length - 1 - ].fiatValue - : 0, - }); - }; - const handleMouseMove = (props: any) => { if (!isDragging) return; @@ -155,54 +123,58 @@ const useChart = (data: IChartData) => { } const value = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.value : 0; - const fiatValue = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.fiatValue : 0; + const changeValue = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.changeValue : 0; + const changePercent = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.changePercent : 0; + const label = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.label : ""; - if (!value || !fiatValue) return; + if (!value || !changeValue) return; setDetailInfo({ value, - fiatValue, + changeValue, + changePercent, + label }); }; const handleMouseDown = (props: any) => { + console.log(" handleMouseDown props", props) if (!props || !props.activePayload || props.activePayload.length <= 0) return; const value = props.activePayload[0].payload.value; - const fiatValue = props.activePayload[0].payload.fiatValue; + const changeValue = props.activePayload[0].payload.changeValue; + const changePercent = props.activePayload[0].payload.changePercent; + const label = props.activePayload[0].payload.label; - if (!value || !fiatValue) return; + if (!value || !changeValue) return; setDetailInfo({ value, - fiatValue, + changeValue, + changePercent, + label }); setIsDragging(true); }; const handleMouseUp = () => { setDetailInfo({ - value: data ? data[activePeriodId][data[activePeriodId].length - 1].value : 0, - fiatValue: data ? data[activePeriodId][data[activePeriodId].length - 1].fiatValue : 0, + value: data ? data[0].value : 0, + changeValue: data ? data[0].changeValue : 0, + changePercent: data ? data[0].changePercent : 0, + label: data ? data[0].label : "", }); setIsDragging(false); }; - const minValue = data ? Math.min(...data[activePeriodId].map((item: IChartDataItem) => item.value)) : 0; - const maxValue = data ? Math.max(...data[activePeriodId].map((item: IChartDataItem) => item.value)) : 0; return { CustomYAxisTick, CustomActiveDot, - handleChoosePeriod, handleMouseMove, handleMouseDown, handleMouseUp, - periodButtonProps, detailInfo, - minValue, - maxValue, - activePeriodId, }; }; -export default useChart; +export default useChart; \ No newline at end of file diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/types/chart.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/types/chart.ts index 178691f3dd..d1f32c39ba 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/types/chart.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/types/chart.ts @@ -1,14 +1,10 @@ export interface IChartDataItem { - time: string; + label: string; value: number; - fiatValue: number; + changePercent: number; + changeValue: number; } export interface IChartData { - start24HoursAgo: IChartDataItem[]; - start1WeekAgo: IChartDataItem[]; - start1MonthAgo: IChartDataItem[]; - start6MonthAgo: IChartDataItem[]; - start1YearAgo: IChartDataItem[]; - ALL: IChartDataItem[]; + data: IChartDataItem[]; } diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx index 7cc58b2c98..7f04f13ec0 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx @@ -7,12 +7,14 @@ import { LineChart, Tooltip as RechartTooltip, ResponsiveContainer, - XAxis, - YAxis, + YAxis } from 'recharts'; -import { Skeleton } from '../../../../components'; +import { Chip, ChipTypes, Icon, Skeleton } from '../../../../components'; +import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import chartSkeletonPng from '../../common/assets/images/token-detail-chart-skeleton.png'; import { formatNumber } from '../../common/helpers/formatHelper'; +import { priceChange } from '../../common/helpers/priceChange'; +import useChart from '../../common/hooks/useChart'; import { TOKEN_CHART_INTERVAL, useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; import { useStrings } from '../../common/hooks/useStrings'; import { TokenType } from '../../common/types/index'; @@ -53,15 +55,35 @@ export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Pro const [timeInterval, setTimeInterval] = useState(TOKEN_CHART_INTERVAL.DAY); const { data, isFetching } = useGetPortfolioTokenChart(timeInterval, tokenInfo); + + const { + ptActivity: { close, open }, + config, + } = useCurrencyPairing(); + + const { changeValue, changePercent } = priceChange(open, close); + const handlePeriodChange = (id: string) => { setTimeInterval(TOKEN_CHART_INTERVAL[id]); }; + // Prepare the chart data for recharts const chartData = data?.map((point: any) => ({ label: point.label, value: point.value, + changePercent: point.changePercent, + changeValue: point.changeValue, })) || []; + const { + CustomYAxisTick, + CustomActiveDot, + handleMouseMove, + handleMouseDown, + handleMouseUp, + detailInfo, + } = useChart(chartData); + return ( )} - {isFetching || !data ? ( + {isFetching || !data || chartData === undefined ? ( ) : ( - - {formatNumber(data[data.length - 1]?.value)} - -  {unitOfAccount} - + + + + {formatNumber(detailInfo?.value || chartData[0]?.value)} + +  {unitOfAccount} + + + + )} @@ -104,18 +131,30 @@ export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Pro formatNumber(value)} - /> - - + type={'number'} + tick={CustomYAxisTick} + tickCount={9} /> + } /> ( + + )} dot={false} type="monotone" dataKey="value" @@ -145,3 +184,46 @@ export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Pro ); }; + + +const PriceChangeChip = ({ value }) => { + const theme = useTheme() + return <> + 0 ? ChipTypes.ACTIVE : value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} + label={ + + {value > 0 ? ( + + ) : value < 0 ? ( + + ) : null} + {/* @ts-ignore */} + + {value >= 0 ? formatNumber(value) : formatNumber(-1 * value)}% + + + } + /> + +} +const PriceValueChip = ({ value, unitOfAccount }) => { + return <> + 0 + ? ChipTypes.ACTIVE + : value < 0 + ? ChipTypes.INACTIVE + : ChipTypes.DISABLED + } + label={ + // @ts-ignore + + {value > 0 && '+'} + {formatNumber(value)} {unitOfAccount} + + } + /> + +} \ No newline at end of file diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index d4eb119bf4..6fa5e3aba8 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -184,11 +184,11 @@ export const createCurrrentWalletInfo = (stores: any): any => { // Get Fiat price const ticker = tokenInfo.Metadata.ticker; const { currency } = profile.unitOfAccount; - const getFiatCurrentPrice = coinPriceStore.getCurrentPrice; + const getFiatCurrentPrice = coinPriceStore?.getCurrentPrice; const fiatPrice = getFiatCurrentPrice(ticker, currency === null ? 'USD' : currency); - if (fiatPrice === null) { - return; - } + // if (fiatPrice === null) { + // return; + // } const fiatDisplay = calculateAndFormatValue(Number(shiftedAmount), fiatPrice); const isHardware: boolean = selectedWallet.isHardware; From 3743b83fc46d0261a2aed898c1f363c4635c03f5 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Fri, 13 Sep 2024 18:14:41 +0300 Subject: [PATCH 14/58] types fixes --- .../common/components/PortfolioHeader.tsx | 4 +- .../portfolio/common/hooks/useChart.tsx | 10 +- .../common/hooks/usePortfolioTokenChart.ts | 138 +++++----- .../UI/features/portfolio/common/mockData.ts | 82 +----- .../features/portfolio/common/types/chart.ts | 4 +- .../module/PortfolioContextProvider.tsx | 5 +- .../module/PortfolioTokenActivityProvider.tsx | 5 +- .../app/UI/features/portfolio/module/state.ts | 7 +- .../TokenDetails/TokenChartInterval.tsx | 15 +- .../TokenDetails/TokenDetailChart.tsx | 251 ------------------ .../TokenDetails/TokenDetailPerformance.tsx | 42 +-- .../useCases/TokenDetails/TokenDetails.tsx | 1 - .../app/UI/types/currrentWallet.ts | 57 ++++ .../app/UI/utils/createCurrentWalletInfo.ts | 35 +-- packages/yoroi-extension/package.json | 2 +- 15 files changed, 194 insertions(+), 464 deletions(-) delete mode 100644 packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailChart.tsx create mode 100644 packages/yoroi-extension/app/UI/types/currrentWallet.ts diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index 897dbf7d30..6470de9c6f 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -2,14 +2,14 @@ import { Box, Stack, Typography, useTheme } from '@mui/material'; import React from 'react'; import { SearchInput, Skeleton, Tooltip } from '../../../../components'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; +import { WalletBalance } from '../../../../types/currrentWallet'; import { usePortfolio } from '../../module/PortfolioContextProvider'; import { formatPriceChange, priceChange } from '../helpers/priceChange'; import { useStrings } from '../hooks/useStrings'; -import { BalanceType } from '../types/index'; import PnlTag from './PlnTag'; interface Props { - walletBalance: BalanceType; + walletBalance: WalletBalance; setKeyword: (keyword: string) => void; isLoading: boolean; tooltipTitle: JSX.Element; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx index ec3cff25e6..36988405ae 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx @@ -15,7 +15,7 @@ const useChart = (data: IChartData) => { // { id: 'start1YearAgo', label: strings['1Y'], active: false }, // { id: 'ALL', label: strings['ALL'], active: false }, // ]); - const [detailInfo, setDetailInfo] = useState<{ value: number; label: string, changeValue: number, changePercent: number }>({ + const [detailInfo, setDetailInfo] = useState<{ value?: number; label?: string, changeValue?: number, changePercent?: number }>({ label: data[0]?.label, value: data[0]?.value, changeValue: data[0]?.changeValue, @@ -157,10 +157,10 @@ const useChart = (data: IChartData) => { const handleMouseUp = () => { setDetailInfo({ - value: data ? data[0].value : 0, - changeValue: data ? data[0].changeValue : 0, - changePercent: data ? data[0].changePercent : 0, - label: data ? data[0].label : "", + value: data ? data[0]?.value : 0, + changeValue: data ? data[0]?.changeValue : 0, + changePercent: data ? data[0]?.changePercent : 0, + label: data ? data[0]?.label : "", }); setIsDragging(false); }; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts index a49b88cd23..bdfe34bec3 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts @@ -4,7 +4,6 @@ import { useQuery, UseQueryOptions } from 'react-query'; // import { useLanguage } from '../../../kernel/i18n'; import { supportedCurrencies, time } from '../../../../utils/constants'; import { fetchPtPriceActivity } from '../../../../utils/usePrimaryTokenActivity'; -import { isPrimaryToken } from '../helpers/isPrimary'; import { priceChange } from '../helpers/priceChange'; export const TOKEN_CHART_INTERVAL = { @@ -25,63 +24,63 @@ type TokenChartData = { changeValue: number; }; -function generateMockChartData(timeInterval: TokenChartInterval = TOKEN_CHART_INTERVAL.DAY): TokenChartData[] { - const dataPoints = 50; - const startValue = 100; - const volatility = 50; - - const startDate = new Date('2024-02-02T15:09:00'); - - function getTimeIncrement(interval: TokenChartInterval): number { - switch (interval) { - case TOKEN_CHART_INTERVAL.DAY: - return 60 * 60 * 1000; // 1 hour - case TOKEN_CHART_INTERVAL.WEEK: - return 24 * 60 * 60 * 1000; // 1 day - case TOKEN_CHART_INTERVAL.MONTH: - return 30 * 24 * 60 * 60 * 1000; // 1 month (approximated as 30 days) - case TOKEN_CHART_INTERVAL.SIX_MONTHS: - return 6 * 30 * 24 * 60 * 60 * 1000; // 6 months - case TOKEN_CHART_INTERVAL.YEAR: - return 12 * 30 * 24 * 60 * 60 * 1000; // 1 year (approximated as 360 days) - default: - return 60 * 1000; // Default to 1 minute - } - } - - const increment = getTimeIncrement(timeInterval); - const chartData: TokenChartData[] = []; - - let previousValue = startValue; - - for (let i = 0; i < dataPoints; i++) { - const date = new Date(startDate.getTime() + i * increment); - const label = `${date.getDate().toString().padStart(2, '0')}/${(date.getMonth() + 1) - .toString() - .padStart(2, '0')}/${date.getFullYear().toString().substr(-2)} ${date.getHours()}:${date - .getMinutes() - .toString() - .padStart(2, '0')}`; - const value = i === 0 ? startValue : previousValue + (Math.random() - 0.5) * volatility; - const changeValue = i === 0 ? 0 : value - previousValue; - const changePercent = i === 0 ? 0 : (changeValue / previousValue) * 100; - - chartData.push({ - label, - value, - changePercent, - changeValue, - }); - - previousValue = value; // Update previousValue for the next iteration - } - - return chartData; -} +// function generateMockChartData(timeInterval: TokenChartInterval = TOKEN_CHART_INTERVAL.DAY): TokenChartData[] { +// const dataPoints = 50; +// const startValue = 100; +// const volatility = 50; + +// const startDate = new Date('2024-02-02T15:09:00'); + +// function getTimeIncrement(interval: TokenChartInterval): number { +// switch (interval) { +// case TOKEN_CHART_INTERVAL.DAY: +// return 60 * 60 * 1000; // 1 hour +// case TOKEN_CHART_INTERVAL.WEEK: +// return 24 * 60 * 60 * 1000; // 1 day +// case TOKEN_CHART_INTERVAL.MONTH: +// return 30 * 24 * 60 * 60 * 1000; // 1 month (approximated as 30 days) +// case TOKEN_CHART_INTERVAL.SIX_MONTHS: +// return 6 * 30 * 24 * 60 * 60 * 1000; // 6 months +// case TOKEN_CHART_INTERVAL.YEAR: +// return 12 * 30 * 24 * 60 * 60 * 1000; // 1 year (approximated as 360 days) +// default: +// return 60 * 1000; // Default to 1 minute +// } +// } + +// const increment = getTimeIncrement(timeInterval); +// const chartData: TokenChartData[] = []; + +// let previousValue = startValue; + +// for (let i = 0; i < dataPoints; i++) { +// const date = new Date(startDate.getTime() + i * increment); +// const label = `${date.getDate().toString().padStart(2, '0')}/${(date.getMonth() + 1) +// .toString() +// .padStart(2, '0')}/${date.getFullYear().toString().substr(-2)} ${date.getHours()}:${date +// .getMinutes() +// .toString() +// .padStart(2, '0')}`; +// const value = i === 0 ? startValue : previousValue + (Math.random() - 0.5) * volatility; +// const changeValue = i === 0 ? 0 : value - previousValue; +// const changePercent = i === 0 ? 0 : (changeValue / previousValue) * 100; + +// chartData.push({ +// label, +// value, +// changePercent, +// changeValue, +// }); + +// previousValue = value; // Update previousValue for the next iteration +// } + +// return chartData; +// } const getTimestamps = (timeInterval: TokenChartInterval) => { const now = Date.now(); - const [from, resolution] = { + const [from, resolution]: any = { [TOKEN_CHART_INTERVAL.DAY]: [now - time.oneDay, 96], [TOKEN_CHART_INTERVAL.WEEK]: [now - time.oneWeek, 168], [TOKEN_CHART_INTERVAL.MONTH]: [now - time.oneMonth, 180], @@ -90,7 +89,7 @@ const getTimestamps = (timeInterval: TokenChartInterval) => { [TOKEN_CHART_INTERVAL.ALL]: [new Date('2018').getTime(), 256], }[timeInterval]; - const step = (now - from) / resolution; + const step: any = (now - from) / resolution; return Array.from({ length: resolution }, (_, i) => from + Math.round(step * i)); }; @@ -121,18 +120,21 @@ export const useGetPortfolioTokenChart = ( ...options, queryKey: ['useGetPortfolioTokenChart', tokenInfo?.info.id ?? '', timeInterval, currency], queryFn: async () => { + // @ts-ignore const response = await fetchPtPriceActivity(getTimestamps(timeInterval)); if (isRight(response)) { if (response.value.data.error) throw new Error(response.value.data.error); const tickers = response.value.data.tickers; + // @ts-ignore const validCurrency = currency === ptTicker ? supportedCurrencies.USD : currency ?? supportedCurrencies.USD; - const initialPrice = tickers[0].prices[validCurrency]; + const initialPrice = tickers[0]?.prices[validCurrency]; const records = tickers .map(ticker => { const value = ticker.prices[validCurrency]; if (value === undefined) return undefined; + // @ts-ignore const { changePercent, changeValue } = priceChange(initialPrice, value); const label = new Date(ticker.timestamp).toLocaleString('en', { dateStyle: 'short', @@ -148,17 +150,17 @@ export const useGetPortfolioTokenChart = ( }, }); - const otherQuery = useQuery({ - useErrorBoundary: true, - refetchOnMount: false, - enabled: tokenInfo && !isPrimaryToken(tokenInfo.info), - ...options, - queryKey: ['useGetPortfolioTokenChart', tokenInfo?.info.id ?? '', timeInterval], - queryFn: async () => { - await new Promise(resolve => setTimeout(resolve, 1)); - return generateMockChartData(timeInterval); - }, - }); + // const otherQuery = useQuery({ + // useErrorBoundary: true, + // refetchOnMount: false, + // enabled: tokenInfo && !isPrimaryToken(tokenInfo.info), + // ...options, + // queryKey: ['useGetPortfolioTokenChart', tokenInfo?.info.id ?? '', timeInterval], + // queryFn: async () => { + // await new Promise(resolve => setTimeout(resolve, 1)); + // return generateMockChartData(timeInterval); + // }, + // }); return ptQuery; // return tokenInfo && isPrimaryToken(tokenInfo.info) ? ptQuery : otherQuery; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/mockData.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/mockData.ts index a35170768a..bca3e9f167 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/mockData.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/mockData.ts @@ -1,4 +1,4 @@ -import { createChartData, getRandomTime, start1WeekAgo, start24HoursAgo } from './helpers/mockHelper'; +import { getRandomTime, start1WeekAgo, start24HoursAgo } from './helpers/mockHelper'; import { BalanceType, LiquidityItemType, OrderItemType, TokenType } from './types'; import { HistoryItemStatus, HistoryItemType, TransactionItemType } from './types/transaction'; @@ -52,14 +52,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, { name: 'DOGE', @@ -92,14 +84,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, { name: 'AGIX', @@ -132,14 +116,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, { name: 'Shiba', @@ -172,14 +148,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, { name: 'ALT', @@ -212,14 +180,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, { name: 'TKN1', @@ -252,14 +212,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, { name: 'TKN2', @@ -292,14 +244,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, { name: 'TKN3', @@ -332,14 +276,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, { name: 'TKN6', @@ -372,14 +308,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, { name: 'TKN8', @@ -412,14 +340,6 @@ const mockData = { { value: 10 * Math.random() }, { value: Math.random() / 100 }, ], - chartData: { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), - }, }, ] as TokenType[], }, diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/types/chart.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/types/chart.ts index d1f32c39ba..f05d104061 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/types/chart.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/types/chart.ts @@ -5,6 +5,4 @@ export interface IChartDataItem { changeValue: number; } -export interface IChartData { - data: IChartDataItem[]; -} +export type IChartData = IChartDataItem[]; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index af9acd0194..f8d1fce8cf 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; +import { CurrentWalletType } from '../../../types/currrentWallet'; import { AccountPair, CurrencyType, @@ -25,7 +26,7 @@ type PortfolioProviderProps = { unitOfAccount: CurrencyType; accountPair: AccountPair; }; - currentWallet: any + currentWallet: CurrentWalletType }; export const PortfolioContextProvider = ({ @@ -71,7 +72,7 @@ export const PortfolioContextProvider = ({ ...actions, settingFiatPairUnit, walletBalance, - assetList, + assetList: assetList || [], }), [state, actions] ); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index 5b4d96be75..3d4a536a7c 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -14,11 +14,12 @@ const defaultPortfolioTokenActivityState: PortfolioTokenActivityState = freeze( secondaryTokenIds: [], aggregatedBalances: {}, tokenActivity: {}, - activityWindow: '24h', + activityWindow: Portfolio.Token.ActivityWindow.OneDay, isLoading: false, }, true ); + const PortfolioTokenActivityContext = React.createContext({ ...defaultPortfolioTokenActivityState, }); @@ -55,8 +56,6 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { const { assetList, walletBalance } = usePortfolio(); React.useEffect(() => { - // filter and add here the ids for query - const listForActivity = assetList.filter(item => item.policyId.length > 0).map(item => `${item.policyId}.${item.assetName}`); // actions.secondaryTokenIdsChanged(listForActivity); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts index 6339a53106..09b561127a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts @@ -1,9 +1,10 @@ import { produce } from 'immer'; +import { CurrentWalletType } from '../../../types/currrentWallet'; export type CurrencyType = 'ADA' | 'USD' | 'BRL' | 'ETH' | 'BTC' | 'KRW' | 'CNY' | 'EUR' | 'JPY' | 'none' | null; export type AccountPair = { - from: { name: string; value: number }; - to: { name: string; value: number }; + from: { name: string; value: string }; + to: { name: string; value: string }; } | null; // Define types @@ -35,6 +36,7 @@ export type PortfolioState = { enabled: boolean; }; accountPair: AccountPair | null; + currentWallet: CurrentWalletType; }; // Define default state @@ -45,6 +47,7 @@ export const defaultPortfolioState: PortfolioState = { enabled: false, }, accountPair: null, + currentWallet: undefined, }; // Define action handlers diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx index 7f04f13ec0..a8388e16d2 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx @@ -58,7 +58,7 @@ export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Pro const { ptActivity: { close, open }, - config, + // config, } = useCurrencyPairing(); const { changeValue, changePercent } = priceChange(open, close); @@ -107,12 +107,12 @@ export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Pro {formatNumber(detailInfo?.value || chartData[0]?.value)} - +  {unitOfAccount} - + )} @@ -186,8 +186,8 @@ export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Pro -const PriceChangeChip = ({ value }) => { - const theme = useTheme() +const PriceChangeChip = ({ value }: { value: number }) => { + const theme: any = useTheme() return <> 0 ? ChipTypes.ACTIVE : value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} @@ -207,7 +207,7 @@ const PriceChangeChip = ({ value }) => { /> } -const PriceValueChip = ({ value, unitOfAccount }) => { +const PriceValueChip = ({ value, unitOfAccount }: { value: number, unitOfAccount: string }) => { return <> { : ChipTypes.DISABLED } label={ - // @ts-ignore - + {value > 0 && '+'} {formatNumber(value)} {unitOfAccount} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailChart.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailChart.tsx deleted file mode 100644 index c1b106823a..0000000000 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailChart.tsx +++ /dev/null @@ -1,251 +0,0 @@ -import { Box, Button, Stack, Typography, styled } from '@mui/material'; -import { useTheme } from '@mui/material/styles'; -import React, { useEffect, useState } from 'react'; -import { CartesianGrid, Line, LineChart, Tooltip as RechartTooltip, ResponsiveContainer, YAxis } from 'recharts'; -import { Chip, Skeleton, Tooltip } from '../../../../components'; -import { ChipTypes } from '../../../../components/Chip'; -import { Icon } from '../../../../components/icons'; -import chartSkeletonPng from '../../common/assets/images/token-detail-chart-skeleton.png'; -import { formatNumber } from '../../common/helpers/formatHelper'; -import { createChartData } from '../../common/helpers/mockHelper'; -import useChart from '../../common/hooks/useChart'; -import { TOKEN_CHART_INTERVAL, useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; -import { useStrings } from '../../common/hooks/useStrings'; -import { TokenType } from '../../common/types/index'; -import { usePortfolio } from '../../module/PortfolioContextProvider'; - - -const chartData = { - start24HoursAgo: createChartData('24H'), - start1WeekAgo: createChartData('1W'), - start1MonthAgo: createChartData('1M'), - start6MonthAgo: createChartData('6M'), - start1YearAgo: createChartData('1Y'), - ALL: createChartData('1Y'), -} - -const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; disabled: boolean; variant: string }) => ({ - fontWeight: 500, - fontSize: '0.75rem', - lineHeight: '1.125rem', - height: '30px', - padding: '6px !important', - minWidth: '36px', - backgroundColor: - variant === 'contained' ? (disabled ? theme.palette.ds.gray_100 : theme.palette.ds.el_primary_medium) : `transparent`, - - '&.MuiButton-contained': { - color: theme.palette.ds.white_static, - }, - '&.MuiButton-secondary': { - color: disabled ? theme.palette.ds.gray_100 : theme.palette.ds.text_primary_medium, - }, -})); - -interface Props { - isLoading: boolean; - tokenInfo: TokenType; - isPrimaryToken: boolean; -} - -const TokenDetailChart = ({ isLoading, tokenInfo, isPrimaryToken }: Props): JSX.Element => { - const chartHeight = isPrimaryToken ? 153 : 257; - const theme: any = useTheme(); - const strings = useStrings(); - const { unitOfAccount } = usePortfolio(); - const { - CustomYAxisTick, - CustomActiveDot, - handleChoosePeriod, - handleMouseMove, - handleMouseDown, - handleMouseUp, - periodButtonProps, - detailInfo, - minValue, - maxValue, - activePeriodId, - } = useChart(chartData); - const [isFetching, setIsFetching] = useState(false); - - useEffect(() => { - if (isLoading) { - setIsFetching(true); - } else { - setIsFetching(false); - } - }, [isLoading]); - - const handlePeriodChange = (id: string) => { - handleChoosePeriod(id); - - // FAKE FETCHING DATA - setIsFetching(true); - - setTimeout(() => { - setIsFetching(false); - }, 1000); - }; - - - // new logic =---------------------------------------------------------------- - - - const [timeInterval, setTimeInterval] = useState(TOKEN_CHART_INTERVAL.DAY) - - const { data } = useGetPortfolioTokenChart(timeInterval, tokenInfo) - console.log("useGetPortfolioTokenChart", data) - - return ( - - - {isFetching ? ( - - ) : ( - - {strings.marketPrice} - - )} - - {isFetching ? ( - - ) : ( - - {formatNumber(detailInfo.fiatValue)} - {/* @ts-ignore */} - -  {unitOfAccount} - - - )} - - - {strings.tokenPriceChange} - - - {strings.in24hours} - - - } - placement="top" - > - - {isFetching ? ( - - ) : ( - 0 ? ChipTypes.ACTIVE : detailInfo.value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} - label={ - - {detailInfo.value > 0 ? ( - - ) : detailInfo.value < 0 ? ( - - ) : null} - {/* @ts-ignore */} - - {detailInfo.value >= 0 ? formatNumber(detailInfo.value) : formatNumber(-1 * detailInfo.value)}% - - - } - /> - )} - - {isFetching ? ( - - ) : ( - 0 - ? ChipTypes.ACTIVE - : detailInfo.fiatValue < 0 - ? ChipTypes.INACTIVE - : ChipTypes.DISABLED - } - label={ - - {detailInfo.fiatValue > 0 && '+'} - {formatNumber(detailInfo.fiatValue)} {unitOfAccount} - - } - /> - )} - - - - - - - - {isFetching ? null : ( - - - - - } /> - ( - - )} - dot={false} - type="monotone" - dataKey="value" - strokeWidth={2} - stroke={isFetching ? theme.palette.ds.gray_50 : theme.palette.ds.primary_600} - /> - - - )} - - - - {periodButtonProps.map(({ id, active, label }) => ( - handlePeriodChange(id.toString())} - theme={theme} - > - {label} - - ))} - - - - ); -}; - -export default TokenDetailChart; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx index 17ffda998d..3ecc9eb8dc 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx @@ -3,13 +3,12 @@ import { useTheme } from '@mui/material/styles'; import React from 'react'; import { useStrings } from '../../common/hooks/useStrings'; import { TokenType } from '../../common/types/index'; -import { usePortfolio } from '../../module/PortfolioContextProvider'; -const PerformanceItemType = { - FIAT: 'fiat', - TOKEN: 'token', - RANK: 'rank', -}; +// const PerformanceItemType = { +// FIAT: 'fiat', +// TOKEN: 'token', +// RANK: 'rank', +// }; interface Props { tokenInfo: TokenType; @@ -17,25 +16,26 @@ interface Props { } const TokenDetailPerformance = ({ tokenInfo, isLoading }: Props): JSX.Element => { + console.log({ tokenInfo, isLoading }) const theme = useTheme(); const strings = useStrings(); - const { unitOfAccount } = usePortfolio(); + // const { unitOfAccount } = usePortfolio(); - const firstPerformanceItemList = [ - { id: 'tokenPriceChange', type: PerformanceItemType.FIAT, label: strings.tokenPriceChange }, - { id: 'tokenPrice', type: PerformanceItemType.FIAT, label: strings.tokenPrice }, - { id: 'marketCap', type: PerformanceItemType.FIAT, label: strings.marketCap }, - { id: 'volumn', type: PerformanceItemType.FIAT, label: strings['24hVolumn'] }, - { id: 'rank', type: PerformanceItemType.RANK, label: strings.rank }, - ]; + // const firstPerformanceItemList = [ + // { id: 'tokenPriceChange', type: PerformanceItemType.FIAT, label: strings.tokenPriceChange }, + // { id: 'tokenPrice', type: PerformanceItemType.FIAT, label: strings.tokenPrice }, + // { id: 'marketCap', type: PerformanceItemType.FIAT, label: strings.marketCap }, + // { id: 'volumn', type: PerformanceItemType.FIAT, label: strings['24hVolumn'] }, + // { id: 'rank', type: PerformanceItemType.RANK, label: strings.rank }, + // ]; - const secondPerformanceItemList = [ - { id: 'circulating', type: PerformanceItemType.TOKEN, label: strings.circulating }, - { id: 'totalSupply', type: PerformanceItemType.TOKEN, label: strings.totalSupply }, - { id: 'maxSupply', type: PerformanceItemType.TOKEN, label: strings.maxSupply }, - { id: 'allTimeHigh', type: PerformanceItemType.FIAT, label: strings.allTimeHigh }, - { id: 'allTimeLow', type: PerformanceItemType.FIAT, label: strings.allTimeLow }, - ]; + // const secondPerformanceItemList = [ + // { id: 'circulating', type: PerformanceItemType.TOKEN, label: strings.circulating }, + // { id: 'totalSupply', type: PerformanceItemType.TOKEN, label: strings.totalSupply }, + // { id: 'maxSupply', type: PerformanceItemType.TOKEN, label: strings.maxSupply }, + // { id: 'allTimeHigh', type: PerformanceItemType.FIAT, label: strings.allTimeHigh }, + // { id: 'allTimeLow', type: PerformanceItemType.FIAT, label: strings.allTimeLow }, + // ]; return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index e03674f5e7..b6e60b7ebe 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -145,7 +145,6 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { - {/* {isPrimaryToken && */} {isPrimaryToken && } diff --git a/packages/yoroi-extension/app/UI/types/currrentWallet.ts b/packages/yoroi-extension/app/UI/types/currrentWallet.ts new file mode 100644 index 0000000000..ce9a3e0647 --- /dev/null +++ b/packages/yoroi-extension/app/UI/types/currrentWallet.ts @@ -0,0 +1,57 @@ +type UnitOfAccount = { + enabled: boolean; + currency: string; +}; + +type DefaultTokenInfo = { + ticker: string; + name: string; + decimals: number; +}; + +type Metadata = { + type: string; + policyId: string; + assetName: string; + ticker: string; + logo: string | null; + longName: string | null; + numberOfDecimals: number; +}; + +type PrimaryTokenInfo = { + TokenId: number; + NetworkId: number; + IsDefault: boolean; + IsNFT: boolean; + Identifier: string; + Digest: number; + Metadata: Metadata; +}; + +export type WalletBalance = { + ada: string; + fiatAmount: string; + currency: string; +}; + +type GetCurrentPrice = (from: string, to: string) => number | Promise; // Function type for getCurrentPrice + +export type CurrentWalletType = { + currentPool: any; + networkId: number; + walletId: number; + selectedWallet: any; + walletAdaBalance: number; + unitOfAccount: UnitOfAccount; + defaultTokenInfo: DefaultTokenInfo; + recentTransactions: any[]; // Define the structure of transactions if needed + submitedTransactions: any[]; // Define the structure of transactions if needed + backendService: string; + backendServiceZero: string; + isHardwareWallet: boolean; + primaryTokenInfo: PrimaryTokenInfo; + walletBalance: WalletBalance; + getCurrentPrice: GetCurrentPrice; // Added the function type here + assetList: any[]; +}; diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index 6fa5e3aba8..4ef7ddb822 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -6,6 +6,7 @@ import { genLookupOrFail, getTokenIdentifierIfExists, getTokenStrictName } from import { splitAmount, truncateToken } from '../../utils/formatters.js'; import { calculateAndFormatValue } from '../../utils/unit-of-account'; import { cardanoAdaBase64Logo } from '../features/portfolio/common/helpers/constants'; +import { CurrentWalletType } from '../types/currrentWallet'; export const mapStakingKeyStateToGovernanceAction = (state: any) => { if (!state.drepDelegation) return null; @@ -150,12 +151,14 @@ const groupTransactionsByDay = transactions => { return groups.sort((a, b) => b.transactions[0].date.getTime() - a.transactions[0].date.getTime()); }; -export const createCurrrentWalletInfo = (stores: any): any => { +export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undefined => { const { wallets, delegation, tokenInfoStore, coinPriceStore, profile } = stores; try { const walletCurrentPoolInfo = getStakePoolMeta(stores); + console.log('walletCurrentPoolInfo', walletCurrentPoolInfo); + const selectedWallet /*: WalletState */ = wallets.selectedOrFail; const walletAdaBalance /*: MultiToken */ = getWalletTotalAdaBalance(stores, selectedWallet); @@ -198,30 +201,30 @@ export const createCurrrentWalletInfo = (stores: any): any => { const groupedTx = groupTransactionsByDay(stores.transactions.recent); return { - currentPool: walletCurrentPoolInfo, // good - networkId, // good - walletId: currentWalletId, // good - selectedWallet: selectedWallet, // good - walletAdaBalance: walletAdaBalance.toNumber(), // good - unitOfAccount: stores.profile.unitOfAccount, // good - defaultTokenInfo: stores.tokenInfoStore.getDefaultTokenInfoSummary(networkId), // good - getCurrentPrice: stores.coinPriceStore.getCurrentPrice, // good - recentTransactions: groupedTx ? groupedTx : [], // good - submitedTransactions: selectedWallet.submittedTransactions, // good - backendService: BackendService, // good - backendServiceZero: BackendServiceZero, // good - isHardwareWallet: isHardware, // good - primaryTokenInfo: tokenInfo, // good + currentPool: walletCurrentPoolInfo, + networkId, + walletId: currentWalletId, + selectedWallet: selectedWallet, + walletAdaBalance: walletAdaBalance.toNumber(), + unitOfAccount: stores.profile.unitOfAccount, + defaultTokenInfo: stores.tokenInfoStore.getDefaultTokenInfoSummary(networkId), + getCurrentPrice: stores.coinPriceStore.getCurrentPrice, + recentTransactions: groupedTx ? groupedTx : [], + submitedTransactions: selectedWallet.submittedTransactions, + backendService: BackendService, + backendServiceZero: BackendServiceZero, + isHardwareWallet: isHardware, + primaryTokenInfo: tokenInfo, walletBalance: { ada: `${beforeDecimalRewards}${afterDecimalRewards}`, fiatAmount: fiatDisplay || 0, currency: currency === null ? 'USD' : currency, }, assetList: assetList, - nftList: [], }; } catch (error) { console.warn('ERROR trying to create wallet info', error); + return undefined; } }; diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index b28ce8e1b2..f028c220b5 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -170,7 +170,7 @@ "@yoroi/resolver": "2.0.2", "@yoroi/staking": "^1.5.1", "@yoroi/swap": "1.5.2", - "@yoroi/types": "1.5.4", + "@yoroi/types": "1.5.7", "assert": "2.1.0", "async-await-queue": "2.1.4", "axios": "0.21.1", From 63af9ab5eb1ee78cf8bddf15bfb13b4e3e8c6a5f Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 18 Sep 2024 11:21:24 +0300 Subject: [PATCH 15/58] fix chart, add token overview --- .../portfolio/common/helpers/isPrimary.ts | 2 +- .../portfolio/common/hooks/useChart.tsx | 3 +- .../module/PortfolioContextProvider.tsx | 7 +- .../app/UI/features/portfolio/module/state.ts | 1 + .../TokenDetails/TokenChartInterval.tsx | 5 +- .../TokenDetails/TokenDetailOverview.tsx | 185 +++++++----------- .../useCases/TokenDetails/TokenDetails.tsx | 33 ++-- .../portfolio/useCases/Wallet/StatsTable.tsx | 2 +- .../app/UI/utils/createCurrentWalletInfo.ts | 45 ++++- .../app/UI/utils/getNetworkUrl.ts | 7 + 10 files changed, 145 insertions(+), 145 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts index e7b0b5eaa5..2b7cff5755 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts @@ -1,6 +1,6 @@ // TODO - silly implementation add more logic export const isPrimaryToken = tokenInfo => { - if (tokenInfo.id.length === 0) { + if (tokenInfo.id?.length === 0) { return true; } return false; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx index 36988405ae..6104a3edcb 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx @@ -5,8 +5,7 @@ import { IChartData } from '../types/chart'; const useChart = (data: IChartData) => { const theme: any = useTheme(); - console.log("data", data) - console.log("data", data[0]?.label) + // const [periodButtonProps, setPeriodButtonProps] = useState([ // { id: 'start24HoursAgo', label: strings['24H'], active: true }, // { id: 'start1WeekAgo', label: strings['1W'], active: false }, diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index f8d1fce8cf..6b8a2791aa 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -26,7 +26,7 @@ type PortfolioProviderProps = { unitOfAccount: CurrencyType; accountPair: AccountPair; }; - currentWallet: CurrentWalletType + currentWallet: CurrentWalletType; }; export const PortfolioContextProvider = ({ @@ -36,9 +36,9 @@ export const PortfolioContextProvider = ({ unitOfAccount: settingFiatPairUnit.enabled ? settingFiatPairUnit.currency : 'USD', accountPair: null, }, - currentWallet + currentWallet, }: PortfolioProviderProps) => { - const { walletBalance, assetList, selectedWallet } = currentWallet; + const { walletBalance, assetList, selectedWallet, networkId } = currentWallet; if (selectedWallet === undefined) { return <>; } @@ -73,6 +73,7 @@ export const PortfolioContextProvider = ({ settingFiatPairUnit, walletBalance, assetList: assetList || [], + networkId, }), [state, actions] ); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts index 09b561127a..ccf0858d12 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts @@ -48,6 +48,7 @@ export const defaultPortfolioState: PortfolioState = { }, accountPair: null, currentWallet: undefined, + networkId: undefined, }; // Define action handlers diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx index a8388e16d2..f46ba843d4 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx @@ -128,8 +128,9 @@ export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Pro }} > {isFetching || !data ? null : ( - + ( handlePeriodChange(interval)} theme={theme} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx index 714b0d75f2..63807142ba 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx @@ -1,11 +1,13 @@ -import { Box, Link, Stack, Typography } from '@mui/material'; +import { Box, Link as LinkMui, Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import React from 'react'; import { Skeleton } from '../../../../components/Skeleton'; -import { CopyButton } from '../../../../components/buttons/CopyButton'; +import { getNetworkUrl } from '../../../../utils/getNetworkUrl'; import tokenPng from '../../common/assets/images/token.png'; +import { isPrimaryToken } from '../../common/helpers/isPrimary'; import { useStrings } from '../../common/hooks/useStrings'; import { TokenType } from '../../common/types/index'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; interface Props { tokenInfo: TokenType; @@ -13,10 +15,13 @@ interface Props { isAda: boolean; } -const TokenDetailOverview = ({ tokenInfo, isLoading, isAda }: Props): JSX.Element => { +const TokenDetailOverview = ({ tokenInfo, isLoading }: Props): JSX.Element => { const theme: any = useTheme(); const strings = useStrings(); + const { networkId } = usePortfolio(); + const networkUrl = getNetworkUrl(networkId); + const isPrimary = isPrimaryToken(tokenInfo.info); return ( @@ -29,10 +34,10 @@ const TokenDetailOverview = ({ tokenInfo, isLoading, isAda }: Props): JSX.Elemen height="32px" sx={{ backgroundColor: theme.palette.ds.gray_300, - borderRadius: `${theme.shape.borderRadius}px`, + borderRadius: `50px`, }} component="img" - src={tokenPng} + src={tokenInfo.tokenLogo || tokenPng} > )} {isLoading ? ( @@ -44,121 +49,79 @@ const TokenDetailOverview = ({ tokenInfo, isLoading, isAda }: Props): JSX.Elemen )} - - {isLoading ? ( - - ) : ( - - {strings.description} - - )} - {isLoading ? ( - <> - - - - - ) : ( - {tokenInfo?.overview.description} - )} - + - - {isLoading ? ( - - ) : ( - - {strings.website} - - )} - {isLoading ? ( - - ) : ( - - cardano.org - - )} - + - {isAda ? null : ( + {isPrimary ? ( + <> + ) : ( <> - - {isLoading ? ( - - ) : ( - - {strings.policyId} - - )} - - - {isLoading ? ( - - - - - ) : ( - - {tokenInfo?.overview.policyId} - - )} - - - + - - {isLoading ? ( - - ) : ( - - {strings.fingerprint} - - )} - - - {isLoading ? ( - - - - - ) : ( - - {tokenInfo?.overview.fingerprint} - - )} - - - + )} - - {isLoading ? ( - - ) : ( - - {strings.detailsOn} - - )} - - {isLoading ? ( - - ) : ( - - Cardanoscan - - )} - {isLoading ? ( - - ) : ( - - Adaex - - )} - - + ); }; export default TokenDetailOverview; + +type TokenOverviewSection = { + label: string; + value: string; + isExternalLink?: boolean; + networkUrl?: undefined | string; +}; + +const TokenOverviewSection = ({ label, value, isExternalLink = false, networkUrl }: TokenOverviewSection) => { + const theme: any = useTheme(); + if (!value) { + return <>; + } + + return ( + + + {label} + + {networkUrl ? ( + + + Cardanoscan + + + Adaex + + + ) : isExternalLink ? ( + + {value} + + ) : ( + {value} + )} + + ); +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index b6e60b7ebe..f8144602c6 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -1,12 +1,11 @@ import { Box, Divider, Stack, Typography } from '@mui/material'; import { styled, useTheme } from '@mui/material/styles'; -import React, { useEffect, useState } from 'react'; +import React, { useState } from 'react'; import { ReactComponent as BackIcon } from '../../../../../assets/images/assets-page/back-arrow.inline.svg'; import { Card, Skeleton } from '../../../../components'; import Menu from '../../common/components/Menu'; import NavigationButton from '../../common/components/NavigationButton'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; -import { useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; import { useStrings } from '../../common/hooks/useStrings'; import mockData from '../../common/mockData'; import { SubMenuOption, TokenType } from '../../common/types/index'; @@ -34,15 +33,14 @@ interface Props { } const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { - console.log("tokenInfo", tokenInfo) + console.log('tokenInfo', tokenInfo); const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); const { unitOfAccount, walletBalance } = usePortfolio(); const [isLoading, setIsLoading] = useState(false); - const isPrimaryToken: boolean = tokenInfo.id === '-' - const tokenTotalAmount = isPrimaryToken ? walletBalance.ada : tokenInfo.totalAmount - console.log("[tokenTotalAmount]", tokenTotalAmount) + const isPrimaryToken: boolean = tokenInfo.id === '-'; + const tokenTotalAmount = isPrimaryToken ? walletBalance.ada : tokenInfo.totalAmount; const subMenuOptions: SubMenuOption[] = [ { @@ -67,17 +65,17 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { } }; - useEffect(() => { - // FAKE FETCHING DATA TO SEE SKELETON - setIsLoading(true); + // useEffect(() => { + // // FAKE FETCHING DATA TO SEE SKELETON + // setIsLoading(true); - const timer = setTimeout(() => { - setIsLoading(false); - }, 2000); + // const timer = setTimeout(() => { + // setIsLoading(false); + // }, 2000); - return () => clearTimeout(timer); - }, []); - const { data } = useGetPortfolioTokenChart('24 H', tokenInfo) + // return () => clearTimeout(timer); + // }, []); + // const { data } = useGetPortfolioTokenChart('24 H', tokenInfo) return ( @@ -138,15 +136,14 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { ) : ( - {(tokenInfo.totalAmountFiat)} {isPrimaryToken && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} + {tokenInfo.totalAmountFiat} {isPrimaryToken && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} )} - {isPrimaryToken && - } + {isPrimaryToken && } diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index ff0fec4f5a..41bf91f3b2 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -70,7 +70,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { const { getSortedData, handleRequestSort } = useTableSort({ order, orderBy, setSortState, headCells, data }); - // TODO refactor and add calculation based on fiat toatl value - endpont not working + // TODO refactor and add calculation based on fiat toatl value - endpoint not working const procentageData = useTokenPercentages(data) diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index 4ef7ddb822..e5fb47f32e 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -100,7 +100,8 @@ const getAssetWalletAssetList = (stores: any) => { ...token.info.Metadata, totalAmountFiat: fiatDisplay, price: fiatPrice, - portfolioPercents: Math.round(100 * Math.random()), // MOCKED + + // metadata101: extractMetadataInfo(token?.info), overview: { description: @@ -120,7 +121,7 @@ const getAssetWalletAssetList = (stores: any) => { name: tokenName, policyId: token.info.Metadata.policyId, fingerprint: token.id, - metadata: token.info.Metadata?.assetMintMetadata?.[0] || null, + metadata: extractMetadataInfo({ metadata: token.info.Metadata?.assetMintMetadata?.[0] || null }), }, // utils: { // totalAmountFiat: fiatDisplay, @@ -228,10 +229,40 @@ export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undef } }; -export const asQuantity = (value: BigNumber | number | string) => { - const bn = new BigNumber(value); - if (bn.isNaN() || !bn.isFinite()) { - throw new Error('Invalid quantity'); +// export const asQuantity = (value: BigNumber | number | string) => { +// const bn = new BigNumber(value); +// if (bn.isNaN() || !bn.isFinite()) { +// throw new Error('Invalid quantity'); +// } +// return bn; +// }; + +type Metadata = { + metadata?: { + [key: string]: { + [key: string]: { + [tokenName: string]: { + name?: string; + website?: string; + description?: string; + desc?: string; + url?: string; + }; + }; + }; + }; +}; + +export const extractMetadataInfo = (metadataObj: Metadata) => { + if (!metadataObj.metadata) { + return { name: null, website: null, description: null }; } - return bn; + const tokenInfo = Object.values(metadataObj.metadata).flatMap(chain => + Object.values(chain).flatMap(tokens => Object.values(tokens)) + ); + for (const info of tokenInfo) { + return { website: info?.url || info?.website, description: info?.desc }; + } + + return null; }; diff --git a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts new file mode 100644 index 0000000000..6534e3ae53 --- /dev/null +++ b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts @@ -0,0 +1,7 @@ +export const getNetworkUrl = (networkId: number): string => { + return isTestnet(networkId) ? 'https://testnet.cardanoscan.io/token' : 'https://cardanoscan.io/token'; +}; + +export const isTestnet = (networkId: number): boolean => { + return networkId !== 0; +}; From 970a665f53fd42629b2803c669514c954c1ff0e3 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 18 Sep 2024 11:58:11 +0300 Subject: [PATCH 16/58] add token id --- .../TokenDetails/TokenChartInterval.tsx | 378 +++++++++--------- .../useCases/TokenDetails/TokenDetails.tsx | 2 +- .../app/UI/utils/createCurrentWalletInfo.ts | 15 +- 3 files changed, 181 insertions(+), 214 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx index f46ba843d4..752427dc4b 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx @@ -1,14 +1,7 @@ import { Box, Button, Stack, Typography, styled } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import React, { useState } from 'react'; -import { - CartesianGrid, - Line, - LineChart, - Tooltip as RechartTooltip, - ResponsiveContainer, - YAxis -} from 'recharts'; +import { CartesianGrid, Line, LineChart, Tooltip as RechartTooltip, ResponsiveContainer, YAxis } from 'recharts'; import { Chip, ChipTypes, Icon, Skeleton } from '../../../../components'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import chartSkeletonPng from '../../common/assets/images/token-detail-chart-skeleton.png'; @@ -22,208 +15,193 @@ import { usePortfolio } from '../../module/PortfolioContextProvider'; // Styling for the period buttons const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; disabled: boolean; variant: string }) => ({ - fontWeight: 500, - fontSize: '0.75rem', - lineHeight: '1.125rem', - height: '30px', - padding: '6px !important', - minWidth: '36px', - backgroundColor: - variant === 'contained' ? (disabled ? theme.palette.ds.gray_100 : theme.palette.ds.el_primary_medium) : `transparent`, - - '&.MuiButton-contained': { - color: theme.palette.ds.white_static, - }, - '&.MuiButton-secondary': { - color: disabled ? theme.palette.ds.gray_100 : theme.palette.ds.text_primary_medium, - }, + fontWeight: 500, + fontSize: '0.75rem', + lineHeight: '1.125rem', + height: '30px', + padding: '6px !important', + minWidth: '36px', + backgroundColor: + variant === 'contained' ? (disabled ? theme.palette.ds.gray_100 : theme.palette.ds.el_primary_medium) : `transparent`, + + '&.MuiButton-contained': { + color: theme.palette.ds.white_static, + }, + '&.MuiButton-secondary': { + color: disabled ? theme.palette.ds.gray_100 : theme.palette.ds.text_primary_medium, + }, })); interface Props { - isLoading: boolean; - tokenInfo: TokenType; - isPrimaryToken: boolean; + isLoading: boolean; + tokenInfo: TokenType; + isPrimaryToken: boolean; } -export const TokenChartInterval = ({ isLoading, tokenInfo, isPrimaryToken }: Props): JSX.Element => { - const chartHeight = isPrimaryToken ? 153 : 257; - const theme: any = useTheme(); - const strings = useStrings(); - const { unitOfAccount } = usePortfolio(); - - // Fetch data based on the selected interval - const [timeInterval, setTimeInterval] = useState(TOKEN_CHART_INTERVAL.DAY); - const { data, isFetching } = useGetPortfolioTokenChart(timeInterval, tokenInfo); - - - const { - ptActivity: { close, open }, - // config, - } = useCurrencyPairing(); - - const { changeValue, changePercent } = priceChange(open, close); - - const handlePeriodChange = (id: string) => { - setTimeInterval(TOKEN_CHART_INTERVAL[id]); - }; - - - // Prepare the chart data for recharts - const chartData = data?.map((point: any) => ({ - label: point.label, - value: point.value, - changePercent: point.changePercent, - changeValue: point.changeValue, +export const TokenChartInterval = ({ tokenInfo, isPrimaryToken }: Props): JSX.Element => { + const chartHeight = isPrimaryToken ? 153 : 257; + const theme: any = useTheme(); + const strings = useStrings(); + const { unitOfAccount } = usePortfolio(); + + // Fetch data based on the selected interval + const [timeInterval, setTimeInterval] = useState(TOKEN_CHART_INTERVAL.DAY); + const { data, isFetching } = useGetPortfolioTokenChart(timeInterval, tokenInfo); + + const { + ptActivity: { close, open }, + // config, + } = useCurrencyPairing(); + + const { changeValue, changePercent } = priceChange(open, close); + + const handlePeriodChange = (id: string) => { + setTimeInterval(TOKEN_CHART_INTERVAL[id]); + }; + + // Prepare the chart data for recharts + const chartData = + data?.map((point: any) => ({ + label: point.label, + value: point.value, + changePercent: point.changePercent, + changeValue: point.changeValue, })) || []; - const { - CustomYAxisTick, - CustomActiveDot, - handleMouseMove, - handleMouseDown, - handleMouseUp, - detailInfo, - } = useChart(chartData); - - - return ( - - - {isFetching || !data ? ( - - ) : ( - - {strings.marketPrice} - - )} - - {isFetching || !data || chartData === undefined ? ( - - ) : ( - - - - {formatNumber(detailInfo?.value || chartData[0]?.value)} - -  {unitOfAccount} - - - - - - )} - + const { CustomYAxisTick, CustomActiveDot, handleMouseMove, handleMouseDown, handleMouseUp, detailInfo } = useChart(chartData); + + return ( + + + {isFetching || !data ? ( + + ) : ( + + {strings.marketPrice} + + )} + + {isFetching || !data || chartData === undefined ? ( + + ) : ( + + + {formatNumber(detailInfo?.value || chartData[0]?.value)} + +  {unitOfAccount} + + + + - - - - {isFetching || !data ? null : ( - - - - - } /> - ( - - )} - dot={false} - type="monotone" - dataKey="value" - strokeWidth={2} - stroke={isFetching ? theme.palette.ds.gray_50 : theme.palette.ds.primary_600} - /> - - - )} - - - - {Object.keys(TOKEN_CHART_INTERVAL).map((interval) => ( - handlePeriodChange(interval)} - theme={theme} - > - {TOKEN_CHART_INTERVAL[interval]} - - ))} - - + )} - ); + + + + + {isFetching || !data ? null : ( + + + + + } /> + ( + + )} + dot={false} + type="monotone" + dataKey="value" + strokeWidth={2} + stroke={isFetching ? theme.palette.ds.gray_50 : theme.palette.ds.primary_600} + /> + + + )} + + + + {Object.keys(TOKEN_CHART_INTERVAL).map(interval => ( + handlePeriodChange(interval)} + theme={theme} + > + {TOKEN_CHART_INTERVAL[interval]} + + ))} + + + + ); }; - - const PriceChangeChip = ({ value }: { value: number }) => { - const theme: any = useTheme() - return <> - 0 ? ChipTypes.ACTIVE : value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} - label={ - - {value > 0 ? ( - - ) : value < 0 ? ( - - ) : null} - {/* @ts-ignore */} - - {value >= 0 ? formatNumber(value) : formatNumber(-1 * value)}% - - - } - /> + const theme: any = useTheme(); + return ( + <> + 0 ? ChipTypes.ACTIVE : value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} + label={ + + {value > 0 ? ( + + ) : value < 0 ? ( + + ) : null} + {/* @ts-ignore */} + {value >= 0 ? formatNumber(value) : formatNumber(-1 * value)}% + + } + /> -} -const PriceValueChip = ({ value, unitOfAccount }: { value: number, unitOfAccount: string }) => { - return <> - 0 - ? ChipTypes.ACTIVE - : value < 0 - ? ChipTypes.INACTIVE - : ChipTypes.DISABLED - } - label={ - - {value > 0 && '+'} - {formatNumber(value)} {unitOfAccount} - - } - /> + ); +}; +const PriceValueChip = ({ value, unitOfAccount }: { value: number; unitOfAccount: string }) => { + return ( + <> + 0 ? ChipTypes.ACTIVE : value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} + label={ + + {value > 0 && '+'} + {formatNumber(value)} {unitOfAccount} + + } + /> -} \ No newline at end of file + ); +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index f8144602c6..bb343dfd41 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -38,7 +38,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { const navigateTo = useNavigateTo(); const strings = useStrings(); const { unitOfAccount, walletBalance } = usePortfolio(); - const [isLoading, setIsLoading] = useState(false); + const [isLoading, _] = useState(false); const isPrimaryToken: boolean = tokenInfo.id === '-'; const tokenTotalAmount = isPrimaryToken ? walletBalance.ada : tokenInfo.totalAmount; diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index e5fb47f32e..7dbc557d36 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -101,18 +101,6 @@ const getAssetWalletAssetList = (stores: any) => { totalAmountFiat: fiatDisplay, price: fiatPrice, - // metadata101: extractMetadataInfo(token?.info), - - overview: { - description: - "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", - website: 'https://www.cardano.org', - detailOn: 'https://www.yoroiwallet.com', - policyId: '2aa9c1557fcf8e7caa049fa0911a8724a1cdaf8037fe0b431c6ac664', - fingerprint: - 'asset311q8dhlxmgagkx0ldt4xc7wzdv2wza8gu2utxw294sr23zuc8dhlxmgagkx0ldt4xc7wzk8213yjnad98h1n1j99naskajsj6789', - }, - // TODO new structure here quantity: token.entry.amount, id: tokenId, @@ -120,9 +108,10 @@ const getAssetWalletAssetList = (stores: any) => { id: token.entry.identifier, name: tokenName, policyId: token.info.Metadata.policyId, - fingerprint: token.id, + fingerprint: tokenId, metadata: extractMetadataInfo({ metadata: token.info.Metadata?.assetMintMetadata?.[0] || null }), }, + // TODO - refactor and add here any formated data/utils for token // utils: { // totalAmountFiat: fiatDisplay, // price: fiatPrice, From cf1abae599cadc3b249ee6aa7f8fe71047106d8a Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 18 Sep 2024 14:02:24 +0300 Subject: [PATCH 17/58] add portfolio swap token functionality --- .../portfolio/common/hooks/useNavigateTo.ts | 4 +- .../TokenDetails/TokenChartInterval.tsx | 14 +++--- .../useCases/TokenDetails/TokenDetails.tsx | 19 +++----- .../app/UI/utils/createCurrentWalletInfo.ts | 2 - .../swap/asset-swap/CreateSwapOrder.js | 43 ++++++++++++++++++- 5 files changed, 55 insertions(+), 27 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useNavigateTo.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useNavigateTo.ts index b559ed5a54..fe13dec92f 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useNavigateTo.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useNavigateTo.ts @@ -1,5 +1,5 @@ -import { useHistory } from 'react-router-dom'; import React from 'react'; +import { useHistory } from 'react-router-dom'; import { ROUTES } from '../../../../../routes-config'; export const useNavigateTo = () => { @@ -9,7 +9,7 @@ export const useNavigateTo = () => { portfolio: () => history.push(ROUTES.PORTFOLIO.ROOT), portfolioDapps: () => history.push(ROUTES.PORTFOLIO.DAPPS), portfolioDetail: (tokenId: string) => history.push(`${ROUTES.PORTFOLIO.ROOT}/details/${tokenId}`), - swapPage: () => history.push(ROUTES.SWAP.ROOT), + swapPage: (tokenId: string) => history.push(`${ROUTES.SWAP.ROOT}?tokenId=${tokenId}`), sendPage: () => history.push(ROUTES.WALLETS.SEND), receivePage: () => history.push(ROUTES.WALLETS.RECEIVE.ROOT), }).current; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx index 752427dc4b..e4886da873 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx @@ -87,15 +87,15 @@ export const TokenChartInterval = ({ tokenInfo, isPrimaryToken }: Props): JSX.El {isFetching || !data || chartData === undefined ? ( ) : ( - - + + {formatNumber(detailInfo?.value || chartData[0]?.value)} - -  {unitOfAccount} - +  {unitOfAccount} + + + + - - )} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index bb343dfd41..663513d7a1 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -33,7 +33,6 @@ interface Props { } const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { - console.log('tokenInfo', tokenInfo); const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); @@ -65,18 +64,6 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { } }; - // useEffect(() => { - // // FAKE FETCHING DATA TO SEE SKELETON - // setIsLoading(true); - - // const timer = setTimeout(() => { - // setIsLoading(false); - // }, 2000); - - // return () => clearTimeout(timer); - // }, []); - // const { data } = useGetPortfolioTokenChart('24 H', tokenInfo) - return (
@@ -97,7 +84,11 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { - navigateTo.swapPage()} label={strings.swap} /> + navigateTo.swapPage(tokenInfo.info.id} + label={strings.swap} + /> navigateTo.sendPage()} label={strings.send} /> navigateTo.receivePage()} label={strings.receive} /> diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index 7dbc557d36..fdc71aa013 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -147,8 +147,6 @@ export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undef try { const walletCurrentPoolInfo = getStakePoolMeta(stores); - console.log('walletCurrentPoolInfo', walletCurrentPoolInfo); - const selectedWallet /*: WalletState */ = wallets.selectedOrFail; const walletAdaBalance /*: MultiToken */ = getWalletTotalAdaBalance(stores, selectedWallet); diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/CreateSwapOrder.js b/packages/yoroi-extension/app/containers/swap/asset-swap/CreateSwapOrder.js index a7e1af3996..0452579a80 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/CreateSwapOrder.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/CreateSwapOrder.js @@ -1,7 +1,7 @@ // @flow import type { RemoteTokenInfo } from '../../../api/ada/lib/state-fetch/types'; import type { PriceImpact } from '../../../components/swap/types'; -import { useState } from 'react'; +import { useState ,useEffect,useMemo} from 'react'; import { Box } from '@mui/material'; import SwapPriceInput from '../../../components/swap/SwapPriceInput'; import SlippageDialog from '../../../components/swap/SlippageDialog'; @@ -17,6 +17,9 @@ import { TopActions } from './actions/TopActions'; import { MiddleActions } from './actions/MiddleActions'; import { EditSlippage } from './actions/EditSlippage'; import { useSwapForm } from '../context/swap-form'; +import { useSwapTokensOnlyVerified } from '@yoroi/swap'; +import { useLocation } from "react-router-dom"; +import { comparatorByGetter } from '../../../coreUtils'; type Props = {| slippageValue: string, @@ -38,6 +41,7 @@ export const CreateSwapOrder = ({ priceImpactState, }: Props): React$Node => { const [openedDialog, setOpenedDialog] = useState(''); + const [selectedAssetFromRoute, setSelectedAssetFromRoute] = useState(); const { orderData: { @@ -47,7 +51,42 @@ export const CreateSwapOrder = ({ buyTokenInfoChanged, } = useSwap(); - const { onChangeLimitPrice } = useSwapForm(); + const { + buyQuantity: { isTouched: isBuyTouched }, + buyTouched, + onChangeLimitPrice + } = useSwapForm(); + + const { onlyVerifiedTokens } = useSwapTokensOnlyVerified(); + + const walletAssets = swapStore.assets; + + const walletVerifiedAssets = useMemo(() => { + return walletAssets.map(a => { + const vft = onlyVerifiedTokens.find(ovt => ovt.fingerprint === a.fingerprint); + return a.id === '' || vft ? { ...a, ...vft } : undefined; + }).filter(Boolean).sort(comparatorByGetter(a => a.name?.toLowerCase())); + }, [onlyVerifiedTokens, walletAssets]); + + + + const search = useLocation().search; + const tokenId = new URLSearchParams(search).get('tokenId'); + const selectedAsset = walletVerifiedAssets.filter((asset) => asset.id === tokenId); + + useEffect(()=>{ + if(selectedAsset){ + setSelectedAssetFromRoute(selectedAsset[0]); + onChangeLimitPrice(); + } + },[]); + + useEffect(() => { + if (selectedAssetFromRoute) { + buyTouched(selectedAssetFromRoute); + buyTokenInfoChanged({id:selectedAssetFromRoute?.id,decimals:selectedAssetFromRoute?.decimals}); + } + }, [selectedAssetFromRoute]); return ( <> From 8385a755410a0382215a6788a13bc852dc91f24a Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 18 Sep 2024 15:08:23 +0300 Subject: [PATCH 18/58] fix types --- .../common/components/PortfolioHeader.tsx | 10 +- .../portfolio/common/hooks/useNavigateTo.ts | 2 +- .../common/hooks/useTokenPercentages.tsx | 8 +- .../module/PortfolioTokenActivityProvider.tsx | 36 ++--- .../app/UI/features/portfolio/module/state.ts | 11 +- .../useCases/Dapps/PortfolioDapps.tsx | 15 +- .../TokenDetails/TokenChartInterval.tsx | 4 +- .../TokenDetails/TokenDetailOverview.tsx | 6 +- .../TokenDetails/TokenDetailPerformance.tsx | 5 +- .../useCases/TokenDetails/TokenDetails.tsx | 17 +-- .../useCases/Wallet/PortfolioWallet.tsx | 8 +- .../portfolio/useCases/Wallet/StatsTable.tsx | 128 +++++++++--------- .../yoroi-extension/app/UI/types/tokenInfo.ts | 25 ++++ .../app/UI/utils/createCurrentWalletInfo.ts | 4 +- .../app/UI/utils/getNetworkUrl.ts | 7 +- 15 files changed, 153 insertions(+), 133 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/types/tokenInfo.ts diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index 6470de9c6f..e86cfe9433 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -85,7 +85,7 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: ) : ( {tooltipTitle}} placement="right"> - + @@ -103,7 +103,9 @@ type PnlPercentChangeProps = { variantPnl: 'danger' | 'success' | 'neutral'; cha export const PnlPercentChange = ({ variantPnl, changePercent }: PnlPercentChangeProps) => { return ( - {changePercent}% + + {changePercent}% + ); }; @@ -117,7 +119,9 @@ export const PnlPairedChange = ({ variantPnl, changeValue }: PnlPairedChangeProp return ( - {`${Number(changeValue) > 0 ? '+' : ''}${changeValue} ${currency}`} + {`${ + Number(changeValue) > 0 ? '+' : '' + }${changeValue} ${currency}`} ); }; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useNavigateTo.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useNavigateTo.ts index fe13dec92f..45eda13096 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useNavigateTo.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useNavigateTo.ts @@ -9,7 +9,7 @@ export const useNavigateTo = () => { portfolio: () => history.push(ROUTES.PORTFOLIO.ROOT), portfolioDapps: () => history.push(ROUTES.PORTFOLIO.DAPPS), portfolioDetail: (tokenId: string) => history.push(`${ROUTES.PORTFOLIO.ROOT}/details/${tokenId}`), - swapPage: (tokenId: string) => history.push(`${ROUTES.SWAP.ROOT}?tokenId=${tokenId}`), + swapPage: (tokenId?: string) => history.push(`${ROUTES.SWAP.ROOT}?tokenId=${tokenId}`), sendPage: () => history.push(ROUTES.WALLETS.SEND), receivePage: () => history.push(ROUTES.WALLETS.RECEIVE.ROOT), }).current; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx index 3df98cef87..d8605fc719 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx @@ -15,7 +15,7 @@ type TokenWithPercentage = Token & { percentage: number; }; -export const useTokenPercentages = (tokens: Token[]): TokenWithPercentage[] => { +export const useTokenPercentages = (tokens: any[]): TokenWithPercentage[] => { const tokenPercentages = useMemo(() => { if (!tokens || tokens.length === 0) return {}; @@ -24,9 +24,7 @@ export const useTokenPercentages = (tokens: Token[]): TokenWithPercentage[] => { }, new BigNumber(0)); return tokens.reduce((acc, token) => { - const percentage = totalQuantity.isZero() - ? '0.00' - : token.quantity.dividedBy(totalQuantity).multipliedBy(100).toFixed(2); + const percentage = totalQuantity.isZero() ? '0.00' : token.quantity.dividedBy(totalQuantity).multipliedBy(100).toFixed(2); return { ...acc, @@ -36,4 +34,4 @@ export const useTokenPercentages = (tokens: Token[]): TokenWithPercentage[] => { }, [tokens]); return tokenPercentages; -}; \ No newline at end of file +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index 3d4a536a7c..b935836977 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -13,7 +13,7 @@ const defaultPortfolioTokenActivityState: PortfolioTokenActivityState = freeze( { secondaryTokenIds: [], aggregatedBalances: {}, - tokenActivity: {}, + tokenActivity: { data24h: null }, activityWindow: Portfolio.Token.ActivityWindow.OneDay, isLoading: false, }, @@ -39,7 +39,7 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { secondaryTokenIds, }); }, - tokenActivityChanged: tokenActivity => { + tokenActivityChanged: (tokenActivity: any) => { dispatch({ type: PortfolioTokenActivityActionType.TokenActivityChanged, tokenActivity, @@ -56,7 +56,9 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { const { assetList, walletBalance } = usePortfolio(); React.useEffect(() => { - const listForActivity = assetList.filter(item => item.policyId.length > 0).map(item => `${item.policyId}.${item.assetName}`); // + const listForActivity: any = assetList + .filter(item => item.policyId?.length > 0) + .map(item => `${item.policyId}.${item.assetName}`); // actions.secondaryTokenIdsChanged(listForActivity); @@ -75,18 +77,18 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { // fetch1m(state.secondaryTokenIds); } }, [state.secondaryTokenIds, fetch24h]); - console.log("@@@@", data24h) + console.log('@@@@', data24h); React.useEffect(() => { if (data24h) { console.log('data24h', data24h); - const combinedData = { + const combinedData: any = { data24h: data24h, // '1w': data1w, // '1m': data1m, }; actions.tokenActivityChanged(combinedData); } - }, [data24h, actions, loading24h, walletBalance.ada]); + }, [data24h, actions, loading24h, walletBalance?.ada]); const value = React.useMemo( () => ({ @@ -105,7 +107,7 @@ export const usePortfolioTokenActivity = () => type PortfolioTokenActivityState = Readonly<{ secondaryTokenIds: Portfolio.Token.Id[]; - tokenActivity: Portfolio.Api.TokenActivityResponse; + tokenActivity: { data24h: any }; activityWindow: Portfolio.Token.ActivityWindow; isLoading: boolean; }>; @@ -118,17 +120,17 @@ export enum PortfolioTokenActivityActionType { export type PortfolioTokenActivityAction = | { - type: PortfolioTokenActivityActionType.SecondaryTokenIdsChanged; - secondaryTokenIds: Portfolio.Token.Id[]; - } + type: PortfolioTokenActivityActionType.SecondaryTokenIdsChanged; + secondaryTokenIds: Portfolio.Token.Id[]; + } | { - type: PortfolioTokenActivityActionType.TokenActivityChanged; - tokenActivity: Portfolio.Api.TokenActivityResponse; - } + type: PortfolioTokenActivityActionType.TokenActivityChanged; + tokenActivity: { data24h: any }; + } | { - type: PortfolioTokenActivityActionType.ActivityWindowChanged; - activityWindow: Portfolio.Token.ActivityWindow; - }; + type: PortfolioTokenActivityActionType.ActivityWindowChanged; + activityWindow: Portfolio.Token.ActivityWindow; + }; export const portfolioTokenActivityReducer = ( state: PortfolioTokenActivityState, @@ -151,6 +153,6 @@ export const portfolioTokenActivityReducer = ( export type PortfolioTokenActivityActions = Readonly<{ secondaryTokenIdsChanged: (secondaryTokenIds: Portfolio.Token.Id[]) => void; - tokenActivityChanged: (tokenActivity: Portfolio.Api.TokenActivityResponse) => void; + tokenActivityChanged: (tokenActivity: { data24: any }) => void; activityWindowChanged: (activityWindow: Portfolio.Token.ActivityWindow) => void; }>; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts index ccf0858d12..da46056f19 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts @@ -1,5 +1,5 @@ import { produce } from 'immer'; -import { CurrentWalletType } from '../../../types/currrentWallet'; +import { WalletBalance } from '../../../types/currrentWallet'; export type CurrencyType = 'ADA' | 'USD' | 'BRL' | 'ETH' | 'BTC' | 'KRW' | 'CNY' | 'EUR' | 'JPY' | 'none' | null; export type AccountPair = { @@ -36,7 +36,9 @@ export type PortfolioState = { enabled: boolean; }; accountPair: AccountPair | null; - currentWallet: CurrentWalletType; + walletBalance: WalletBalance | null; + networkId: number | null; + assetList: any[]; }; // Define default state @@ -47,8 +49,9 @@ export const defaultPortfolioState: PortfolioState = { enabled: false, }, accountPair: null, - currentWallet: undefined, - networkId: undefined, + walletBalance: null, + networkId: null, + assetList: [], }; // Define action handlers diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Dapps/PortfolioDapps.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Dapps/PortfolioDapps.tsx index ef2d6a074b..196cd059fc 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Dapps/PortfolioDapps.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Dapps/PortfolioDapps.tsx @@ -1,13 +1,12 @@ -import { Stack, Typography, Box } from '@mui/material'; -import React, { useEffect, useState } from 'react'; +import { Box, Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; -import LiquidityTable from './LiquidityTable'; -import mockData from '../../common/mockData'; -import OrderTable from './OrderTable'; -import LendAndBorrow from './LendAndBorrow'; -import { useStrings } from '../../common/hooks/useStrings'; +import React, { useEffect, useState } from 'react'; import PortfolioHeader from '../../common/components/PortfolioHeader'; +import { useStrings } from '../../common/hooks/useStrings'; import { ITabButtonProps, LiquidityItemType, OrderItemType } from '../../common/types/index'; +import LendAndBorrow from './LendAndBorrow'; +import LiquidityTable from './LiquidityTable'; +import OrderTable from './OrderTable'; const TableTabs = Object.freeze({ LIQUIDITY: 1, @@ -95,7 +94,7 @@ const PortfolioDapps = ({ data }: Props) => { return ( { const theme: any = useTheme(); const strings = useStrings(); const { networkId } = usePortfolio(); - const networkUrl = getNetworkUrl(networkId); + const networkUrl = networkId && getNetworkUrl(networkId); const isPrimary = isPrimaryToken(tokenInfo.info); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx index 3ecc9eb8dc..8544da8b9b 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx @@ -2,7 +2,6 @@ import { Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import React from 'react'; import { useStrings } from '../../common/hooks/useStrings'; -import { TokenType } from '../../common/types/index'; // const PerformanceItemType = { // FIAT: 'fiat', @@ -11,12 +10,12 @@ import { TokenType } from '../../common/types/index'; // }; interface Props { - tokenInfo: TokenType; + tokenInfo: TokenInfoType; isLoading: boolean; } const TokenDetailPerformance = ({ tokenInfo, isLoading }: Props): JSX.Element => { - console.log({ tokenInfo, isLoading }) + console.log({ tokenInfo, isLoading }); const theme = useTheme(); const strings = useStrings(); // const { unitOfAccount } = usePortfolio(); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index 663513d7a1..aee8919653 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -8,7 +8,7 @@ import NavigationButton from '../../common/components/NavigationButton'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useStrings } from '../../common/hooks/useStrings'; import mockData from '../../common/mockData'; -import { SubMenuOption, TokenType } from '../../common/types/index'; +import { SubMenuOption } from '../../common/types/index'; import { usePortfolio } from '../../module/PortfolioContextProvider'; import { TokenChartInterval } from './TokenChartInterval'; import TokenDetailOverview from './TokenDetailOverview'; @@ -29,17 +29,18 @@ const TabContent = styled(Box)({ }); interface Props { - tokenInfo: TokenType; + tokenInfo: TokenInfoType; } const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { + console.log('tokenInfo', tokenInfo); const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); const { unitOfAccount, walletBalance } = usePortfolio(); const [isLoading, _] = useState(false); const isPrimaryToken: boolean = tokenInfo.id === '-'; - const tokenTotalAmount = isPrimaryToken ? walletBalance.ada : tokenInfo.totalAmount; + const tokenTotalAmount = isPrimaryToken ? walletBalance?.ada : tokenInfo.totalAmount; const subMenuOptions: SubMenuOption[] = [ { @@ -84,11 +85,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { - navigateTo.swapPage(tokenInfo.info.id} - label={strings.swap} - /> + navigateTo.swapPage(tokenInfo.info.id)} label={strings.swap} /> navigateTo.sendPage()} label={strings.send} /> navigateTo.receivePage()} label={strings.receive} /> @@ -134,7 +131,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { - {isPrimaryToken && } + {isPrimaryToken && } @@ -145,7 +142,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { {selectedTab === subMenuOptions[0]?.route ? ( - + ) : null} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx index 252263a8e8..5d117c8590 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx @@ -14,14 +14,14 @@ const PortfolioWallet = (): JSX.Element => { const { walletBalance, assetList, changeUnitOfAccountPair, unitOfAccount } = usePortfolio(); const [keyword, setKeyword] = useState(''); - const [isLoading, setIsLoading] = useState(false); + const [isLoading, _] = useState(false); const [tokenList, setTokenList] = useState(assetList); const isShownWelcomeBanner: boolean = assetList.length === 1; // assumming only have ADA as default -> first time user useEffect(() => { changeUnitOfAccountPair({ - from: { name: 'ADA', value: walletBalance.ada }, - to: { name: unitOfAccount || 'USD', value: walletBalance.fiatAmount }, + from: { name: 'ADA', value: walletBalance?.ada || '0' }, + to: { name: unitOfAccount || 'USD', value: walletBalance?.fiatAmount || '0' }, }); }, [walletBalance, unitOfAccount]); @@ -63,7 +63,7 @@ const PortfolioWallet = (): JSX.Element => { return ( { const { tokenActivity: { data24h }, - isLoading: isActivityLoading, + // isLoading: isActivityLoading, } = usePortfolioTokenActivity(); const ptActivity = useCurrencyPairing().ptActivity; + console.log('data24h', data24h); const headCells: IHeadCell[] = [ { id: 'name', label: strings.name, align: 'left', sortType: 'character' }, @@ -70,9 +69,8 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { const { getSortedData, handleRequestSort } = useTableSort({ order, orderBy, setSortState, headCells, data }); - // TODO refactor and add calculation based on fiat toatl value - endpoint not working - const procentageData = useTokenPercentages(data) - + // TODO refactor and add calculation based on fiat toatl value - endpoint not working + const procentageData = useTokenPercentages(data); return (
{ isLoading={isLoading} TableRowSkeleton={} > - {getSortedData(list).map((row: TokenType) => ( + {getSortedData(list).map((row: any) => ( navigateTo.portfolioDetail(row.id)} @@ -105,21 +103,21 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { - {data24h === undefined ? ( + {data24h === null ? (

load

) : ( )}
@@ -134,16 +132,18 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { - {data24h === undefined ? ( + {data24h === null ? (

load

) : ( { export default StatsTable; - const TokenDisplay = ({ token }) => { - const theme = useTheme() - return - - - - {token.name} - - - {token.ticker} - + const theme = useTheme(); + return ( + + + + + {token.name} + + + {token.ticker} + + - -} + ); +}; const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, isPrimaryToken }) => { const { close, open } = isPrimaryToken @@ -197,18 +198,15 @@ const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, is }; const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { - const theme: any = useTheme(); const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; - const { currency: selectedCurrency, config, ptActivity: { close: ptPrice }, } = useCurrencyPairing(); - // const showingAda = isPrimaryTokenActive && amount.info.id !== portfolioPrimaryTokenInfo.id; const showingAda = accountPair?.from.name === 'ADA'; @@ -217,7 +215,6 @@ const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { if (ptPrice == null) return `... ${currency}`; - // if (!isPrimaryToken(amount.info) && tokenPrice == null) return `—— ${currency}`; // if (hidePrimaryPair && isPrimaryToken(amount.info) && isPrimaryTokenActive) return ''; @@ -235,15 +232,12 @@ const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { const safeTokenPrice = BigNumber.isBigNumber(tokenPrice) ? tokenPrice : new BigNumber(tokenPrice ?? '1'); const safePtPrice = BigNumber.isBigNumber(ptPrice) ? ptPrice : new BigNumber(ptPrice ?? '1'); - - // Now, pass the bigIntValue to atomicBreakdown const price = `${atomicBreakdown(bigIntValue, token.numberOfDecimals) .bn.times(safeTokenPrice) // BigNumber operation .times(showingAda ? 1 : safePtPrice) // BigNumber operation .toFormat(decimals)} ${currency}`; - // console.log('token', { // name: token.name, // quantity: token.quantity, @@ -253,8 +247,6 @@ const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { // showingAda, // }); - - return ( @@ -273,8 +265,7 @@ const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { ); }; -const TokenPrice = ({ token, unitOfAccount, secondaryToken24Activity, ptActivity, isPrimaryToken }) => { - +const TokenPrice = ({ unitOfAccount, secondaryToken24Activity, ptActivity, isPrimaryToken }) => { const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryToken24Activity && secondaryToken24Activity[1].price.close; return ( @@ -292,25 +283,28 @@ const TokenProcentage = ({ procentage }) => { ); }; - // MOCK DATA const TokenChip = ({ token }) => { - const theme = useTheme() - return 0 ? ChipTypes.ACTIVE : token['1M'] < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} - label={ - - {token['1M'] > 0 ? ( - - ) : token['1M'] < 0 ? ( - - ) : null} - {/* @ts-ignore */} - - {token['1M'] >= 0 ? formatNumber(token['1M']) : formatNumber(-1 * token['1M'])}% - - - } - sx={{ cursor: 'pointer' }} - /> -} \ No newline at end of file + const theme = useTheme(); + return ( + 0 ? ChipTypes.ACTIVE : token['1M'] < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} + label={ + + {token['1M'] > 0 ? ( + // @ts-ignore + + ) : token['1M'] < 0 ? ( + // @ts-ignore + + ) : null} + {/* @ts-ignore */} + + {token['1M'] >= 0 ? formatNumber(token['1M']) : formatNumber(-1 * token['1M'])}% + + + } + sx={{ cursor: 'pointer' }} + /> + ); +}; diff --git a/packages/yoroi-extension/app/UI/types/tokenInfo.ts b/packages/yoroi-extension/app/UI/types/tokenInfo.ts new file mode 100644 index 0000000000..7d98e81af3 --- /dev/null +++ b/packages/yoroi-extension/app/UI/types/tokenInfo.ts @@ -0,0 +1,25 @@ +type TokenInfoEntry = { + website: string; + description: string; +}; + +type AssetInfo = { + id: string; + name: string; + policyId: string; + fingerprint: string; + metadata: TokenInfoEntry; +}; + +type TokenInfoType = { + name: string; + assetName: string; + totalAmount: string; + amountForSorting: string; + tokenLogo: string; + totalAmountFiat: string | number; // The value could be 'NaN', so we can represent it as either a string or a number. + price: number | null; + quantity: string; + id: string; + info: AssetInfo; +}; diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index fdc71aa013..a52f41d191 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -75,6 +75,7 @@ const getAssetWalletAssetList = (stores: any) => { })) .filter((item: any) => item.info.IsNFT === false) .map((token: any) => { + console.log('token', token); const numberOfDecimals = token.info?.Metadata.numberOfDecimals ?? 0; const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); @@ -93,11 +94,10 @@ const getAssetWalletAssetList = (stores: any) => { const fiatDisplay = calculateAndFormatValue(coinShiftedAmount, fiatPrice); return { name: tokenName, - + assetName: token.info.Metadata.assetName, totalAmount: [beforeDecimal, afterDecimal].join(''), amountForSorting: shiftedAmount, tokenLogo: tokenLogo, - ...token.info.Metadata, totalAmountFiat: fiatDisplay, price: fiatPrice, diff --git a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts index 6534e3ae53..50b0535c2f 100644 --- a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts +++ b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts @@ -1,5 +1,8 @@ -export const getNetworkUrl = (networkId: number): string => { - return isTestnet(networkId) ? 'https://testnet.cardanoscan.io/token' : 'https://cardanoscan.io/token'; +export const getNetworkUrl = (networkId: string | undefined): string => { + if (networkId) { + return isTestnet(Number(networkId)) ? 'https://testnet.cardanoscan.io/token' : 'https://cardanoscan.io/token'; + } + return ''; }; export const isTestnet = (networkId: number): boolean => { From 1974f2047363672ffc39660ca14bf34580a21ea5 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 18 Sep 2024 15:13:51 +0300 Subject: [PATCH 19/58] fix types --- .../app/UI/context/WalletManagerProvider.tsx | 182 ------------------ .../app/UI/utils/createCurrentWalletInfo.ts | 1 - .../app/UI/utils/getNetworkUrl.ts | 4 +- 3 files changed, 2 insertions(+), 185 deletions(-) delete mode 100644 packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx diff --git a/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx b/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx deleted file mode 100644 index 21eacbdb0f..0000000000 --- a/packages/yoroi-extension/app/UI/context/WalletManagerProvider.tsx +++ /dev/null @@ -1,182 +0,0 @@ -import BigNumber from 'bignumber.js'; -import * as React from 'react'; -import { getNetworkById } from '../../api/ada/lib/storage/database/prepackaged/networks'; -import { maybe } from '../../coreUtils'; -import { genLookupOrFail, getTokenIdentifierIfExists, getTokenStrictName } from '../../stores/stateless/tokenHelpers'; -import { splitAmount, truncateToken } from '../../utils/formatters.js'; -import { calculateAndFormatValue } from '../../utils/unit-of-account'; -import { cardanoAdaBase64Logo } from '../features/portfolio/common/helpers/constants'; - -// Define a context type for the wallet manager -interface WalletManagerContextType { - currentWalletInfo: any | null; -} - -// Create the context -const WalletManagerContext = React.createContext(undefined); - -export const WalletManagerProvider: React.FC> = ({ children, stores }) => { - const [currentWalletInfo, setCurrentWalletInfo] = React.useState(null); - - React.useEffect(() => { - const generateCurrentWalletInfo = () => { - const { wallets, delegation, tokenInfoStore, coinPriceStore, profile } = stores; - - try { - const walletCurrentPoolInfo = getStakePoolMeta(stores); - - const selectedWallet = wallets.selected; - if (selectedWallet == null) { - throw new Error(`no selected Wallet. Should never happen`); - } - - const currentWalletId = selectedWallet.publicDeriverId; - const networkId = selectedWallet.networkId; - - // Backend services - const { Backend } = getNetworkById(networkId); - const { BackendService, BackendServiceZero } = Backend; - - // Total Ada balance calculation - const rewards = delegation.getRewardBalanceOrZero(selectedWallet); - const balance = selectedWallet.balance; - const totalBalanceAmount = getTotalAmount(balance, rewards); - - const defaultEntry = totalBalanceAmount?.getDefaultEntry(); - const getTokenInfo = genLookupOrFail(tokenInfoStore?.tokenInfo); - const tokenInfo = getTokenInfo(defaultEntry); - const shiftedAmount = defaultEntry.amount.shiftedBy(-tokenInfo.Metadata.numberOfDecimals); - const [beforeDecimalRewards, afterDecimalRewards] = splitAmount(shiftedAmount, tokenInfo.Metadata.numberOfDecimals); - - // Get Fiat price - const ticker = tokenInfo.Metadata.ticker; - const { currency } = profile.unitOfAccount; - - const getFiatCurrentPrice = coinPriceStore.getCurrentPrice; - const fiatPrice = getFiatCurrentPrice(ticker, currency === null ? 'USD' : currency); - const fiatDisplay = calculateAndFormatValue(shiftedAmount, fiatPrice); - - // Asset List - const assetList = getAssetWalletAssetList(stores); - - setCurrentWalletInfo({ - currentPool: walletCurrentPoolInfo, - networkId, - walletId: currentWalletId, - selectedWallet: selectedWallet, - backendService: BackendService, - backendServiceZero: BackendServiceZero, - primaryTokenInfo: tokenInfo, - walletBalance: { - ada: `${beforeDecimalRewards}${afterDecimalRewards}`, - fiatAmount: fiatDisplay || 0, - currency: currency === null ? 'USD' : currency, - percents: 0.0, //(Math.random()), NOT USED - will be deleted - amount: 0.0, //(Math.random()), NOT USED - will be deleted - }, - assetList: assetList, - nftList: [], - }); - } catch (error) { - console.warn('ERROR trying to create wallet info', error); - } - }; - - generateCurrentWalletInfo(); - }, [stores, stores.profile.unitOfAccount.currency, stores.coinPriceStore.currentPriceTickers?.length, stores.routes]); - - // Expose context value - const contextValue = React.useMemo(() => ({ ...currentWalletInfo }), [currentWalletInfo]); - - return {children}; -}; - -export const useWalletManager = () => - React.useContext(WalletManagerContext) ?? console.log('useWalletManager must be used within a WalletManagerProvider'); - -// Helper functions (same as your previous implementation) -const getStakePoolMeta = (stores: any) => { - const publicDeriver = stores.wallets.selected; - const delegationStore = stores.delegation; - const currentPool = delegationStore.getDelegatedPoolId(publicDeriver); - if (currentPool == null) return null; - const networkInfo = publicDeriver.getParent().getNetworkInfo(); - const poolMeta = delegationStore.getLocalPoolInfo(networkInfo, currentPool); - const poolInfo = delegationStore.getLocalRemotePoolInfo(networkInfo, currentPool) ?? {}; - if (poolMeta == null) { - return null; - } - const name = poolMeta.info?.name ?? 'unknown'; - const delegatedPool = { - id: String(currentPool), - name, - websiteUrl: poolMeta.info?.homepage, - ticker: poolMeta.info?.ticker, - ...poolInfo, - }; - - return { - ...delegatedPool, - ...poolMeta, - }; -}; - -const getTotalAmount = (walletAmount: any, rewards: any) => { - return maybe(walletAmount, (w: any) => rewards.joinAddCopy(w)); -}; - -const getAssetWalletAssetList = (stores: any) => { - const spendableBalance = stores.transactions.balance; - const getTokenInfo = genLookupOrFail(stores.tokenInfoStore.tokenInfo); - if (spendableBalance == null) return []; - return [spendableBalance.getDefaultEntry(), ...spendableBalance.nonDefaultEntries()] - .map((entry: any) => ({ - entry, - info: getTokenInfo(entry), - })) - .filter((item: any) => item.info.IsNFT === false) - .map((token: any) => { - const numberOfDecimals = token.info?.Metadata.numberOfDecimals ?? 0; - const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); - const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); - const tokenName = truncateToken(getTokenStrictName(token.info).name ?? '-'); - const tokenId = getTokenIdentifierIfExists(token.info) ?? '-'; - const tokenLogo = `data:image/png;base64,${token.info.Metadata.policyId === '' ? cardanoAdaBase64Logo : token.info.Metadata.logo - }`; - - const getFiatCurrentPrice = stores.coinPriceStore.getCurrentPrice; - const { currency } = stores.profile.unitOfAccount; - - const fiatPrice = getFiatCurrentPrice(tokenName, currency === null ? 'USD' : currency); - const fiatDisplay = calculateAndFormatValue(shiftedAmount, fiatPrice); - return { - name: tokenName, - id: tokenId, - totalAmount: [beforeDecimal, afterDecimal].join(''), - amountForSorting: shiftedAmount, - quantity: asQuantity(token.entry.amount), - tokenLogo: tokenLogo, - ...token.info.Metadata, - totalAmountFiat: fiatDisplay, - price: fiatPrice, - portfolioPercents: Math.round(100 * Math.random()), // MOCKED - overview: { - description: - "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ", - website: 'https://www.cardano.org', - detailOn: 'https://www.yoroiwallet.com', - policyId: '2aa9c1557fcf8e7caa049fa0911a8724a1cdaf8037fe0b431c6ac664', - fingerprint: - 'asset311q8dhlxmgagkx0ldt4xc7wzdv2wza8gu2utxw294sr23zuc8dhlxmgagkx0ldt4xc7wzk8213yjnad98h1n1j99naskajsj6789', - }, - }; - }); -}; - -export const asQuantity = (value: BigNumber | number | string) => { - const bn = new BigNumber(value); - if (bn.isNaN() || !bn.isFinite()) { - throw new Error('Invalid quantity'); - } - return bn; -}; diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index a52f41d191..350da4b244 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -75,7 +75,6 @@ const getAssetWalletAssetList = (stores: any) => { })) .filter((item: any) => item.info.IsNFT === false) .map((token: any) => { - console.log('token', token); const numberOfDecimals = token.info?.Metadata.numberOfDecimals ?? 0; const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); diff --git a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts index 50b0535c2f..0189983c58 100644 --- a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts +++ b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts @@ -1,6 +1,6 @@ -export const getNetworkUrl = (networkId: string | undefined): string => { +export const getNetworkUrl = (networkId: number | undefined): string => { if (networkId) { - return isTestnet(Number(networkId)) ? 'https://testnet.cardanoscan.io/token' : 'https://cardanoscan.io/token'; + return isTestnet(networkId) ? 'https://testnet.cardanoscan.io/token' : 'https://cardanoscan.io/token'; } return ''; }; From ff1ff69cd276e9df807deee000a451503c7fe55e Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 18 Sep 2024 16:10:40 +0300 Subject: [PATCH 20/58] add missing stakingAddress --- .../portfolio/module/PortfolioTokenActivityProvider.tsx | 2 +- .../app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx | 2 -- packages/yoroi-extension/app/UI/types/currrentWallet.ts | 1 + .../yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts | 1 + 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index b935836977..a5ef788ab5 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -77,7 +77,7 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { // fetch1m(state.secondaryTokenIds); } }, [state.secondaryTokenIds, fetch24h]); - console.log('@@@@', data24h); + React.useEffect(() => { if (data24h) { console.log('data24h', data24h); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index 053f784821..8b8993a150 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -45,8 +45,6 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { } = usePortfolioTokenActivity(); const ptActivity = useCurrencyPairing().ptActivity; - console.log('data24h', data24h); - const headCells: IHeadCell[] = [ { id: 'name', label: strings.name, align: 'left', sortType: 'character' }, { id: 'price', label: strings.price, align: 'left', sortType: 'numeric' }, diff --git a/packages/yoroi-extension/app/UI/types/currrentWallet.ts b/packages/yoroi-extension/app/UI/types/currrentWallet.ts index ce9a3e0647..c711d427af 100644 --- a/packages/yoroi-extension/app/UI/types/currrentWallet.ts +++ b/packages/yoroi-extension/app/UI/types/currrentWallet.ts @@ -49,6 +49,7 @@ export type CurrentWalletType = { submitedTransactions: any[]; // Define the structure of transactions if needed backendService: string; backendServiceZero: string; + stakingAddress: string; isHardwareWallet: boolean; primaryTokenInfo: PrimaryTokenInfo; walletBalance: WalletBalance; diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index 350da4b244..831ce803e4 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -202,6 +202,7 @@ export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undef backendServiceZero: BackendServiceZero, isHardwareWallet: isHardware, primaryTokenInfo: tokenInfo, + stakingAddress: selectedWallet.stakingAddress, walletBalance: { ada: `${beforeDecimalRewards}${afterDecimalRewards}`, fiatAmount: fiatDisplay || 0, From e920c5402a071b73c17c2e86a22e5301ca9b1982 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 18 Sep 2024 17:11:24 +0300 Subject: [PATCH 21/58] fix eslint --- packages/yoroi-extension/.eslintrc.js | 2 -- .../app/containers/swap/asset-swap/CreateSwapOrder.js | 6 ++---- .../app/stores/stateless/sidebarCategories.js | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/yoroi-extension/.eslintrc.js b/packages/yoroi-extension/.eslintrc.js index ae40c91c95..6dfff90a5e 100644 --- a/packages/yoroi-extension/.eslintrc.js +++ b/packages/yoroi-extension/.eslintrc.js @@ -13,7 +13,6 @@ module.exports = { extends: [ 'airbnb', 'prettier', - 'plugin:@typescript-eslint/recommended', // Enable recommended rules from the TypeScript plugin ], env: { browser: true, @@ -137,7 +136,6 @@ module.exports = { 'no-floating-promise', 'prettier', 'eslint-plugin-simple-import-sort', - '@typescript-eslint', // Add TypeScript plugin ], globals: { chrome: true, diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/CreateSwapOrder.js b/packages/yoroi-extension/app/containers/swap/asset-swap/CreateSwapOrder.js index 0452579a80..83ddb299fc 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/CreateSwapOrder.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/CreateSwapOrder.js @@ -5,7 +5,7 @@ import { useState ,useEffect,useMemo} from 'react'; import { Box } from '@mui/material'; import SwapPriceInput from '../../../components/swap/SwapPriceInput'; import SlippageDialog from '../../../components/swap/SlippageDialog'; -import { useSwap } from '@yoroi/swap'; +import { useSwap, useSwapTokensOnlyVerified } from '@yoroi/swap'; import EditSellAmount from './edit-sell-amount/EditSellAmount'; import EditBuyAmount from './edit-buy-amount/EditBuyAmount'; import SelectBuyTokenFromList from './edit-buy-amount/SelectBuyTokenFromList'; @@ -17,8 +17,7 @@ import { TopActions } from './actions/TopActions'; import { MiddleActions } from './actions/MiddleActions'; import { EditSlippage } from './actions/EditSlippage'; import { useSwapForm } from '../context/swap-form'; -import { useSwapTokensOnlyVerified } from '@yoroi/swap'; -import { useLocation } from "react-router-dom"; +import { useLocation } from 'react-router-dom'; import { comparatorByGetter } from '../../../coreUtils'; type Props = {| @@ -52,7 +51,6 @@ export const CreateSwapOrder = ({ } = useSwap(); const { - buyQuantity: { isTouched: isBuyTouched }, buyTouched, onChangeLimitPrice } = useSwapForm(); diff --git a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js index 28412eb6a8..0b26fe76fe 100644 --- a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js +++ b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js @@ -143,7 +143,7 @@ export const allCategoriesRevamp: Array = [ route: ROUTES.PORTFOLIO.ROOT, icon: portfolioIcon, label: globalMessages.sidebarPortfolio, - isVisible: ({ selected }) => environment.isDev(), + isVisible: () => environment.isDev(), }, { className: 'nfts', From 4036f664abfa596b0174126e3e4a4f0447e41b13 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 18 Sep 2024 17:24:18 +0300 Subject: [PATCH 22/58] add skeleton loading --- .../UI/features/portfolio/useCases/Wallet/StatsTable.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index 8b8993a150..a227bf18e2 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -1,4 +1,4 @@ -import { Box, Stack, TableCell, TableRow, Typography } from '@mui/material'; +import { Box, Skeleton, Stack, TableCell, TableRow, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import { atomicBreakdown } from '@yoroi/common'; import BigNumber from 'bignumber.js'; @@ -110,7 +110,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { {data24h === null ? ( -

load

+ ) : ( { {data24h === null ? ( -

load

+ ) : ( { const TokenPrice = ({ unitOfAccount, secondaryToken24Activity, ptActivity, isPrimaryToken }) => { const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryToken24Activity && secondaryToken24Activity[1].price.close; + if (tokenPrice == null) return ; return ( @@ -274,6 +275,8 @@ const TokenPrice = ({ unitOfAccount, secondaryToken24Activity, ptActivity, isPri }; const TokenProcentage = ({ procentage }) => { + if (procentage === undefined) return ; + return ( {procentage}% From 8a387075163f5a73b7a92d1d22b92b478410f690 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 19 Sep 2024 10:10:12 +0300 Subject: [PATCH 23/58] wip --- package-lock.json | 7000 ++++++++++++++++- .../TokenDetails/TokenDetailOverview.tsx | 23 +- .../app/UI/utils/getNetworkUrl.ts | 14 +- packages/yoroi-extension/package.json | 1 + 4 files changed, 6635 insertions(+), 403 deletions(-) diff --git a/package-lock.json b/package-lock.json index 606f2fa02c..e9b576b0af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,9 @@ "packages": { "": { "name": "root", + "dependencies": { + "@yoroi/explorers": "^1.0.1" + }, "devDependencies": { "concurrently": "^7.0.0", "husky": "4.3.8", @@ -14,11 +17,23 @@ "webpack-cli": "^5.1.4" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -27,11 +42,380 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "peer": true, + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "peer": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "peer": true + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "peer": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "peer": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "peer": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "peer": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "peer": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" + }, "engines": { "node": ">=6.9.0" } @@ -40,7 +424,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -55,7 +438,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -67,7 +449,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -81,7 +462,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -89,14 +469,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -105,7 +483,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -113,42 +490,1912 @@ "node": ">=4" } }, - "node_modules/@babel/runtime": { + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "peer": true, + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", - "dev": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "peer": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz", + "integrity": "sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "peer": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz", + "integrity": "sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", + "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "peer": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", + "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-flow": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "peer": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "peer": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "peer": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "peer": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "peer": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "peer": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz", + "integrity": "sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", + "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.25.4", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz", + "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-flow-strip-types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", + "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", + "peer": true, + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "peer": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "peer": true + }, + "node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cardano-foundation/ledgerjs-hw-app-cardano": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@cardano-foundation/ledgerjs-hw-app-cardano/-/ledgerjs-hw-app-cardano-7.1.4.tgz", + "integrity": "sha512-bkZ78H0m6E22Fe4nN+K0HY0O2lrPk9Pjs/gv0U5xvJyrMqwmR4wm9h8QXd/AwJ084KIhfpCSGDCQ0CN/K++vNw==", + "peer": true, + "dependencies": { + "@ledgerhq/hw-transport": "^6.31.2", + "base-x": "^3.0.5", + "bech32": "^1.1.4", + "int64-buffer": "^1.0.1" + } + }, + "node_modules/@cardano-foundation/ledgerjs-hw-app-cardano/node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "peer": true + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@emurgo/cross-csl-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@emurgo/cross-csl-core/-/cross-csl-core-5.1.1.tgz", + "integrity": "sha512-UYzf7kR/jY01gAyTkhz2OwirdrVCh/e5I2O/P8MxzdFvtLU88XLY8T6KWgroJ4cQ3XoFCKtSJDFOxcN01nteRg==", + "peer": true + }, + "node_modules/@emurgo/yoroi-lib": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emurgo/yoroi-lib/-/yoroi-lib-1.2.2.tgz", + "integrity": "sha512-alzxMst6K9dazsYAmp6KsyqaI8Aw+Y1SM9K288Pc9pwbFk1n0QQiPrvvK/t6YczBZFXQUmNezcNu17EpJVgLDw==", + "peer": true, + "dependencies": { + "@cardano-foundation/ledgerjs-hw-app-cardano": "^7.1.3", + "@emurgo/cross-csl-core": "5.1.1", + "@noble/hashes": "^1.3.2", + "axios": "^1.7.5", + "axios-cache-interceptor": "^1.5.3", + "bech32": "^2.0.0", + "bignumber.js": "^9.0.1", + "easy-crc": "1.1.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "peer": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "peer": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "peer": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "peer": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" + "node_modules/@ledgerhq/devices": { + "version": "8.4.3", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.4.3.tgz", + "integrity": "sha512-+ih+M27E6cm6DHrmw3GbS3mEaznCyFc0e62VdQux40XK2psgYhL2yBPftM4KCrBYm1UbHqXzqLN+Jb7rNIzsHg==", + "peer": true, + "dependencies": { + "@ledgerhq/errors": "^6.19.0", + "@ledgerhq/logs": "^6.12.0", + "rxjs": "^7.8.1", + "semver": "^7.3.5" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "node_modules/@ledgerhq/errors": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.19.0.tgz", + "integrity": "sha512-c3Jid7euMSnpHFp8H7iPtsmKDjwbTjlG46YKdw+RpCclsqtBx1uQDlYmcbP1Yv9201kVlUFUhhP4H623k8xzlQ==", + "peer": true }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node_modules/@ledgerhq/hw-transport": { + "version": "6.31.3", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.31.3.tgz", + "integrity": "sha512-rFplkHWF5NXtlYwAusqLlMu298NHtRD+2q/jrTYc//uu/xJO9LkDIgKid6IVF2+e1Wj7yX6YQVrU6L0Yu1ntEw==", + "peer": true, + "dependencies": { + "@ledgerhq/devices": "^8.4.3", + "@ledgerhq/errors": "^6.19.0", + "@ledgerhq/logs": "^6.12.0", + "events": "^3.3.0" } }, + "node_modules/@ledgerhq/logs": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.12.0.tgz", + "integrity": "sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA==", + "peer": true + }, "node_modules/@lerna/add": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@lerna/add/-/add-4.0.0.tgz", @@ -1208,11 +3455,22 @@ "node": ">= 10.18.0" } }, + "node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "peer": true, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1225,7 +3483,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -1234,7 +3491,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1442,72 +3698,663 @@ "@octokit/core": ">=2" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", + "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.39.0", + "deprecation": "^2.3.1" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "node_modules/@octokit/rest": { + "version": "18.12.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", + "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "dev": true, + "dependencies": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + } + }, + "node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@react-native-async-storage/async-storage": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.20.0.tgz", + "integrity": "sha512-M73ohkjV9DW7Imkcr+StZKBTJiNGyJmPOEk1x07acUWJtH87enUyYZ1eb7oX5m145yZGplTvhbKtf8mufHRx5Q==", + "peer": true, + "dependencies": { + "merge-options": "^3.0.4" + }, + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.60 <1.0" + } + }, + "node_modules/@react-native-community/cli": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-14.1.0.tgz", + "integrity": "sha512-k7aTdKNZIec7WMSqMJn9bDVLWPPOaYmshXcnjWy6t5ItsJnREju9p2azMTR5tXY5uIeynose3cxettbhk2Tbnw==", + "peer": true, + "dependencies": { + "@react-native-community/cli-clean": "14.1.0", + "@react-native-community/cli-config": "14.1.0", + "@react-native-community/cli-debugger-ui": "14.1.0", + "@react-native-community/cli-doctor": "14.1.0", + "@react-native-community/cli-server-api": "14.1.0", + "@react-native-community/cli-tools": "14.1.0", + "@react-native-community/cli-types": "14.1.0", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "deepmerge": "^4.3.0", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "prompts": "^2.4.2", + "semver": "^7.5.2" + }, + "bin": { + "rnc-cli": "build/bin.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native-community/cli-clean": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-14.1.0.tgz", + "integrity": "sha512-/C4j1yntLo6faztNgZnsDtgpGqa6j0+GYrxOY8LqaKAN03OCnoeUUKO6w78dycbYSGglc1xjJg2RZI/M2oF2AA==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "14.1.0", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2" + } + }, + "node_modules/@react-native-community/cli-config": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-14.1.0.tgz", + "integrity": "sha512-P3FK2rPUJBD1fmQHLgTqpHxsc111pnMdEEFR7KeqprCNz+Qr2QpPxfNy0V7s15tGL5rAv+wpbOGcioIV50EbxA==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "14.1.0", + "chalk": "^4.1.2", + "cosmiconfig": "^9.0.0", + "deepmerge": "^4.3.0", + "fast-glob": "^3.3.2", + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "peer": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.1.0.tgz", + "integrity": "sha512-+YbeCL0wLcBcqDwraJFGsqzcXu9S+bwTVrfImne/4mT6itfe3Oa93yrOVJgNbstrt5pJHuwpU76ZXfXoiuncsg==", + "peer": true, + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-14.1.0.tgz", + "integrity": "sha512-xIf0oQDRKt7lufUenRwcLYdINGc0x1FSXHaHjd7lQDGT5FJnCEYlIkYEDDgAl5tnVJSvM/IL2c6O+mffkNEPzQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-config": "14.1.0", + "@react-native-community/cli-platform-android": "14.1.0", + "@react-native-community/cli-platform-apple": "14.1.0", + "@react-native-community/cli-platform-ios": "14.1.0", + "@react-native-community/cli-tools": "14.1.0", + "chalk": "^4.1.2", + "command-exists": "^1.2.8", + "deepmerge": "^4.3.0", + "envinfo": "^7.13.0", + "execa": "^5.0.0", + "node-stream-zip": "^1.9.1", + "ora": "^5.4.1", + "semver": "^7.5.2", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1", + "yaml": "^2.2.1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-14.1.0.tgz", + "integrity": "sha512-4JnXkAV+ca8XdUhZ7xjgDhXAMwTVjQs8JqiwP7FTYVrayShXy2cBXm/C3HNDoe+oQOF5tPT2SqsDAF2vYTnKiQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "14.1.0", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2", + "fast-xml-parser": "^4.4.1", + "logkitty": "^0.7.1" + } + }, + "node_modules/@react-native-community/cli-platform-apple": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.1.0.tgz", + "integrity": "sha512-DExd+pZ7hHxXt8I6BBmckeYUxxq7PQ+o4YSmGIeQx0xUpi+f82obBct2WNC3VWU72Jw6obwfoN6Fwe6F7Wxp5Q==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "14.1.0", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2", + "fast-xml-parser": "^4.4.1", + "ora": "^5.4.1" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.1.0.tgz", + "integrity": "sha512-ah/ZTiJXUdCVHujyRJ4OmCL5nTq8OWcURcE3UXa1z0sIIiA8io06n+v5n299T9rtPKMwRtVJlQjtO/nbODABPQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-platform-apple": "14.1.0" + } + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-14.1.0.tgz", + "integrity": "sha512-1k2LBQaYsy9RDWFIfKVne3frOye73O33MV6eYMoRPff7wqxHCrsX1CYJQkmwpgVigZHxYwalHj+Axtu3gpomCA==", + "peer": true, + "dependencies": { + "@react-native-community/cli-debugger-ui": "14.1.0", + "@react-native-community/cli-tools": "14.1.0", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^6.2.3" + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.1.0.tgz", + "integrity": "sha512-r1KxSu2+OSuhWFoE//1UR7aSTXMLww/UYWQprEw4bSo/kvutGX//4r9ywgXSWp+39udpNN4jQpNTHuWhGZd/Bg==", + "peer": true, + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^7.5.2", + "shell-quote": "^1.7.3", + "sudo-prompt": "^9.0.0" + } + }, + "node_modules/@react-native-community/cli-types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-14.1.0.tgz", + "integrity": "sha512-aJwZI9mGRx3HdP8U4CGhqjt3S4r8GmeOqv4kRagC1UHDk4QNMC+bZ8JgPA4W7FrGiPey+lJQHMDPAXOo51SOUw==", + "peer": true, + "dependencies": { + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@react-native-community/cli/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@react-native-community/cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.75.3.tgz", + "integrity": "sha512-i7MaRbYR06WdpJWv3a0PQ2ScFBUeevwcJ0tVopnFwTg0tBWp3NFEMDIcU8lyXVy9Y59WmrP1V2ROaRDaPiESgg==", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.75.3.tgz", + "integrity": "sha512-8JmXEKq+Efb9AffsV48l8gmKe/ZQ2PbBygZjHdIf8DNZZhO/z5mt27J4B43MWNdp5Ww1l59T0mEaf8l/uywQUg==", + "peer": true, + "dependencies": { + "@react-native/codegen": "0.75.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.75.3.tgz", + "integrity": "sha512-VZQkQEj36DKEGApXFYdVcFtqdglbnoVr7aOZpjffURSgPcIA9vWTm1b+OL4ayOaRZXTZKiDBNQCXvBX5E5AgQg==", + "peer": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.20.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "@react-native/babel-plugin-codegen": "0.75.3", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.75.3.tgz", + "integrity": "sha512-I0bz5jwOkiR7vnhYLGoV22RGmesErUg03tjsCiQgmsMpbyCYumudEtLNN5+DplHGK56bu8KyzBqKkWXGSKSCZQ==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.20.0", + "glob": "^7.1.1", + "hermes-parser": "0.22.0", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/@react-native/codegen/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.75.3.tgz", + "integrity": "sha512-njsYm+jBWzfLcJcxavAY5QFzYTrmPtjbxq/64GSqwcQYzy9qAkI7LNTK/Wprq1I/4HOuHJO7Km+EddCXB+ByRQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-server-api": "14.1.0", + "@react-native-community/cli-tools": "14.1.0", + "@react-native/dev-middleware": "0.75.3", + "@react-native/metro-babel-transformer": "0.75.3", + "chalk": "^4.0.0", + "execa": "^5.1.1", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", + "node-fetch": "^2.2.0", + "readline": "^1.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.75.3.tgz", + "integrity": "sha512-99bLQsUwsxUMNR7Wa9eV2uyR38yfd6mOEqfN+JIm8/L9sKA926oh+CZkjDy1M8RmCB6spB5N9fVFVkrVdf2yFA==", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.75.3.tgz", + "integrity": "sha512-h2/6+UGmeMWjnT43axy27jNqoDRsE1C1qpjRC3sYpD4g0bI0jSTkY1kAgj8uqGGXLnHXiHOtjLDGdbAgZrsPaA==", + "peer": true, + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.75.3", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "selfsigned": "^2.4.1", + "serve-static": "^1.13.1", + "ws": "^6.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/@react-native/dev-middleware/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.75.3.tgz", + "integrity": "sha512-mSfa/Mq/AsALuG/kvXz5ECrc6HdY5waMHal2sSfa8KA0Gt3JqYQVXF9Pdwd4yR5ClPZDI2HRa1tdE8GVlhMvPA==", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.75.3.tgz", + "integrity": "sha512-+JVFJ351GSJT3V7LuXscMqfnpR/UxzsAjbBjfAHBR3kqTbVqrAmBccqPCA3NLzgb/RY8khLJklwMUVlWrn8iFg==", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/metro-babel-transformer": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.75.3.tgz", + "integrity": "sha512-gDlEl6C2mwQPLxFOR+yla5MpJpDPNOFD6J5Hd9JM9+lOdUq6MNujh1Xn4ZMvglW7rfViq3nMjg4xPQeGUhDG+w==", + "peer": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@react-native/babel-preset": "0.75.3", + "hermes-parser": "0.22.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, "peerDependencies": { - "@octokit/core": ">=3" + "@babel/core": "*" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "dev": true, + "node_modules/@react-native/normalize-colors": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.75.3.tgz", + "integrity": "sha512-3mhF8AJFfIN0E5bEs/DQ4U2LzMJYm+FPSwY5bJ1DZhrxW1PFAh24bAPrSd8PwS0iarQ7biLdr1lWf/8LFv8pDA==", + "peer": true + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.75.3.tgz", + "integrity": "sha512-cTLm7k7Y//SvV8UK8esrDHEw5OrwwSJ4Fqc3x52Imi6ROuhshfGIPFwhtn4pmAg9nWHzHwwqiJ+9hCSVnXXX+g==", + "peer": true, "dependencies": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@octokit/core": ">=3" + "@types/react": "^18.2.6", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dev": true, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "peer": true, "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "peer": true }, - "node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "dev": true, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "peer": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "peer": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "peer": true, "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + "type-detect": "4.0.8" } }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "peer": true, "dependencies": { - "@octokit/openapi-types": "^12.11.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@tootallnate/once": { @@ -1519,6 +4366,30 @@ "node": ">= 6" } }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "peer": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -1531,6 +4402,24 @@ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, + "node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "peer": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -1543,6 +4432,27 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "peer": true + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "peer": true + }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", @@ -1587,12 +4497,102 @@ } } }, + "node_modules/@yoroi/common": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.3.tgz", + "integrity": "sha512-EIgOXpQYLWbDtbXSWxQH9a8cHvVsww3MmQNvYNa7ZVFbEZARtO7l05gRkZlRCip8grFf9RLoRRW7W/6EDDdQ9Q==", + "peer": true, + "dependencies": { + "@yoroi/types": "1.5.6" + }, + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", + "axios": "^1.5.0", + "bignumber.js": "^9.0.1", + "immer": "^10.0.3", + "react": ">= 16.8.0 <= 19.0.0", + "react-native-mmkv": "^2.11.0", + "react-query": "^3.39.3", + "rxjs": "^7.8.1", + "zod": "^3.22.1" + } + }, + "node_modules/@yoroi/explorers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@yoroi/explorers/-/explorers-1.0.1.tgz", + "integrity": "sha512-XI/tu5KTyfDPLB2lJD7LtFEA8FUKvjwojrYiIt8uAWLsbufhCVNiQJcSCoLiyzwgyPuNU4hgSscCn//FUsfKmA==", + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@yoroi/common": "1.5.3", + "immer": "^10.0.3", + "react": ">= 16.8.0 <= 19.0.0", + "react-native-mmkv": "^2.11.0", + "react-query": "^3.39.3" + } + }, + "node_modules/@yoroi/types": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-1.5.6.tgz", + "integrity": "sha512-ZS1gw5Z7v/ojPvsH3aMcB5xIt1/90IfRun18JMrjoP60m7CAAr569603ieV9G8xt2FCUuiOwIN/OrNnIvc2PBQ==", + "peer": true, + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@emurgo/yoroi-lib": "^1.0.0", + "axios": "^1.5.0", + "bignumber.js": "^9.0.1", + "rxjs": "^7.8.1" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "peer": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "peer": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", @@ -1652,6 +4652,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "peer": true + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1667,11 +4673,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "peer": true, + "dependencies": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "node_modules/ansi-fragments/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-fragments/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "peer": true + }, + "node_modules/ansi-fragments/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1680,7 +4723,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1691,6 +4733,25 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/appdirsjs": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", + "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", + "peer": true + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -1744,6 +4805,12 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "peer": true + }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -1839,8 +4906,7 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/asn1": { "version": "0.2.6", @@ -1860,11 +4926,37 @@ "node": ">=0.8" } }, + "node_modules/ast-types": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", + "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "peer": true + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -1905,11 +4997,150 @@ "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==", "dev": true }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-cache-interceptor": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.6.0.tgz", + "integrity": "sha512-xuo4mZckPQmNV50bJpsMmGfpFV8SXsUWWUVKf1DXQy7t9p+6Pan9zrD3icAlCIdoYFw/ZJFKV6nUVqy8j0XCLQ==", + "peer": true, + "dependencies": { + "cache-parser": "1.2.5", + "fast-defer": "1.1.8", + "object-code": "1.3.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/arthurfiorette/axios-cache-interceptor?sponsor=1" + }, + "peerDependencies": { + "axios": "^1" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "peer": true, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "peer": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "peer": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-flow-enums": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", + "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", + "peer": true, + "dependencies": { + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "peer": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", @@ -1920,17 +5151,51 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true + "node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "peer": true + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "peer": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1940,7 +5205,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -1948,11 +5212,91 @@ "node": ">=8" } }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "peer": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builtins": { "version": "1.0.3", @@ -1978,6 +5322,15 @@ "node": ">=10" } }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cacache": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", @@ -2007,6 +5360,12 @@ "node": ">= 10" } }, + "node_modules/cache-parser": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/cache-parser/-/cache-parser-1.2.5.tgz", + "integrity": "sha512-Md/4VhAHByQ9frQ15WD6LrMNiVw9AEl/J7vWIXw+sxT6fSOpbtt6LHTp76vy8+bOESPBO94117Hm2bIjlI7XjA==", + "peer": true + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -2026,11 +5385,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "peer": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "peer": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -2039,7 +5430,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, "engines": { "node": ">=6" } @@ -2061,6 +5451,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001662", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", + "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2071,7 +5481,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2087,7 +5496,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -2110,11 +5518,66 @@ "node": ">=10" } }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "peer": true, + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chrome-launcher/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chromium-edge-launcher": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", + "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", + "peer": true, + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "node_modules/chromium-edge-launcher/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "node_modules/clean-stack": { "version": "2.2.0", @@ -2129,7 +5592,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -2137,6 +5599,18 @@ "node": ">=8" } }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -2150,7 +5624,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2164,7 +5637,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, "engines": { "node": ">=0.8" } @@ -2173,7 +5645,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -2187,7 +5658,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -2220,7 +5690,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -2231,8 +5700,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colorette": { "version": "2.0.20", @@ -2257,7 +5725,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2265,6 +5732,12 @@ "node": ">= 0.8" } }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "peer": true + }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -2274,6 +5747,12 @@ "node": ">=14" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "peer": true + }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -2302,11 +5781,61 @@ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "peer": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "peer": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "peer": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "2.0.0", @@ -2360,6 +5889,36 @@ "proto-list": "~1.2.1" } }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -2500,11 +6059,29 @@ "node": ">=10" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "peer": true + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "peer": true, + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -2526,7 +6103,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2633,11 +6209,16 @@ "node": "*" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "peer": true + }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -2664,7 +6245,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2709,11 +6289,19 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, "dependencies": { "clone": "^1.0.2" }, @@ -2759,7 +6347,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -2770,12 +6357,37 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, + "node_modules/denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", + "peer": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "peer": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -2785,6 +6397,12 @@ "node": ">=8" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "peer": true + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -2828,6 +6446,12 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "node_modules/easy-crc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/easy-crc/-/easy-crc-1.1.0.tgz", + "integrity": "sha512-cvtERLTu8mYt1pOVVekJ4E0VdwyuKgL+VAfE3LY+Lw762i9M1bSEikm6fyGD2grxOdBfI0HgOmSi3HQneKr33A==", + "peer": true + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2844,17 +6468,36 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "peer": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.25", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", + "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", + "peer": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "peer": true, + "engines": { + "node": ">= 0.8" + } }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -2864,7 +6507,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -2890,7 +6532,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "engines": { "node": ">=6" } @@ -2899,7 +6540,6 @@ "version": "7.13.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", - "dev": true, "bin": { "envinfo": "dist/cli.js" }, @@ -2917,11 +6557,32 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "peer": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "peer": true, + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -3056,31 +6717,83 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "peer": true + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -3099,6 +6812,12 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "peer": true + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3134,11 +6853,16 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-defer": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/fast-defer/-/fast-defer-1.1.8.tgz", + "integrity": "sha512-lEJeOH5VL5R09j6AA0D4Uvq7AgsHw0dAImQQ+F3iSyHZuAxyQfWobsagGpTcOPvJr3urmKRHrs+Gs9hV+/Qm/Q==", + "peer": true + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3156,6 +6880,28 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-xml-parser": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "peer": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -3169,11 +6915,19 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "peer": true, + "dependencies": { + "bser": "2.1.1" + } + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -3193,7 +6947,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3210,11 +6963,161 @@ "node": ">=0.10.0" } }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "peer": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "peer": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "peer": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "peer": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "peer": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/find-cache-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "peer": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3250,6 +7153,41 @@ "flat": "cli.js" } }, + "node_modules/flow-enums-runtime": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", + "peer": true + }, + "node_modules/flow-parser": { + "version": "0.246.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.246.0.tgz", + "integrity": "sha512-WHRizzSrWFTcKo7cVcbP3wzZVhzsoYxoWqbnH4z+JXGqrjVmnsld6kBZWVlB200PwD5ur8r+HV3KUDxv3cHhOQ==", + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "peer": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3282,6 +7220,15 @@ "node": ">= 0.12" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -3312,14 +7259,26 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3421,11 +7380,19 @@ "node": ">=0.10.0" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -3558,7 +7525,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -3691,7 +7657,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3711,7 +7676,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -3719,6 +7683,15 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -3770,8 +7743,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/handlebars": { "version": "4.7.8", @@ -3839,7 +7811,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3905,7 +7876,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -3913,6 +7883,21 @@ "node": ">= 0.4" } }, + "node_modules/hermes-estree": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.22.0.tgz", + "integrity": "sha512-FLBt5X9OfA8BERUdc6aZS36Xz3rRuB0Y/mfocSADWEJfomc1xfene33GdyAmtTkKTBXTN/EgAy+rjTKkkZJHlw==", + "peer": true + }, + "node_modules/hermes-parser": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.22.0.tgz", + "integrity": "sha512-gn5RfZiEXCsIWsFGsKiykekktUoh0PdFWYocXsUdZIyWSckT6UIyPcyyUIPSR3kpnELWeK3n3ztAse7Mat6PSA==", + "peer": true, + "dependencies": { + "hermes-estree": "0.22.0" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -3931,6 +7916,31 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "peer": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -3977,7 +7987,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, "engines": { "node": ">=10.17.0" } @@ -4033,6 +8042,26 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -4051,11 +8080,35 @@ "minimatch": "^3.0.4" } }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "peer": true, + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4154,7 +8207,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -4179,7 +8231,6 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4188,8 +8239,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -4273,6 +8323,15 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/int64-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", + "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==", + "peer": true, + "engines": { + "node": ">= 4.5.0" + } + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -4296,6 +8355,15 @@ "node": ">=10.13.0" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "peer": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -4328,8 +8396,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -4387,7 +8454,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -4425,11 +8491,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4438,7 +8527,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -4447,7 +8535,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -4455,6 +8542,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -4477,7 +8573,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -4568,7 +8663,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -4639,6 +8733,18 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4651,6 +8757,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -4660,14 +8778,12 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4678,11 +8794,241 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "peer": true + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "peer": true + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "peer": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "peer": true, + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "peer": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, "node_modules/jsbn": { "version": "1.1.0", @@ -4690,17 +9036,83 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true }, + "node_modules/jsc-android": { + "version": "250231.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", + "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", + "peer": true + }, + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", + "peer": true + }, + "node_modules/jscodeshift": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", + "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", + "peer": true, + "dependencies": { + "@babel/core": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/preset-flow": "^7.13.13", + "@babel/preset-typescript": "^7.13.0", + "@babel/register": "^7.13.16", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.21.0", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/jscodeshift/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", @@ -4720,6 +9132,18 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -4776,11 +9200,19 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/lerna": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/lerna/-/lerna-4.0.0.tgz", @@ -4813,6 +9245,15 @@ "node": ">= 10.18.0" } }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/libnpmaccess": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-4.0.3.tgz", @@ -4960,11 +9401,35 @@ "node": ">= 10" } }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "peer": true, + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/load-json-file": { "version": "6.2.0", @@ -4994,7 +9459,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -5017,29 +9481,201 @@ "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", "dev": true }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "peer": true + }, "node_modules/lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "peer": true, + "dependencies": { + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" + }, + "bin": { + "logkitty": "bin/logkitty.js" + } + }, + "node_modules/logkitty/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/logkitty/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logkitty/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "peer": true + }, + "node_modules/logkitty/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "peer": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "peer": true, "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, "dependencies": { - "lodash._reinterpolate": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, "node_modules/lru-cache": { @@ -5104,6 +9740,15 @@ "node": ">= 10" } }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "peer": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -5116,6 +9761,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/marky": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", + "peer": true + }, + "node_modules/match-sorter": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", + "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.23.8", + "remove-accents": "0.5.0" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "peer": true + }, "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", @@ -5166,142 +9833,667 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "peer": true, + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-options/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/metro": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.12.tgz", + "integrity": "sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "accepts": "^1.3.7", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.23.1", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.80.12", + "metro-cache": "0.80.12", + "metro-cache-key": "0.80.12", + "metro-config": "0.80.12", + "metro-core": "0.80.12", + "metro-file-map": "0.80.12", + "metro-resolver": "0.80.12", + "metro-runtime": "0.80.12", + "metro-source-map": "0.80.12", + "metro-symbolicate": "0.80.12", + "metro-transform-plugins": "0.80.12", + "metro-transform-worker": "0.80.12", + "mime-types": "^2.1.27", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz", + "integrity": "sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg==", + "peer": true, + "dependencies": { + "@babel/core": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.23.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", + "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "peer": true + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", + "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "peer": true, + "dependencies": { + "hermes-estree": "0.23.1" + } + }, + "node_modules/metro-cache": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.12.tgz", + "integrity": "sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA==", + "peer": true, + "dependencies": { + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "metro-core": "0.80.12" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-cache-key": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.12.tgz", + "integrity": "sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA==", + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-config": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.12.tgz", + "integrity": "sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ==", + "peer": true, + "dependencies": { + "connect": "^3.6.5", + "cosmiconfig": "^5.0.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.6.3", + "metro": "0.80.12", + "metro-cache": "0.80.12", + "metro-core": "0.80.12", + "metro-runtime": "0.80.12" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/metro-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "peer": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "peer": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/metro-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "peer": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "peer": true + }, + "node_modules/metro-core": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.12.tgz", + "integrity": "sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw==", + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.80.12" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "node_modules/metro-file-map": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.12.tgz", + "integrity": "sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw==", + "peer": true, "dependencies": { - "p-try": "^2.0.0" + "anymatch": "^3.0.3", + "debug": "^2.2.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "micromatch": "^4.0.4", + "node-abort-controller": "^3.1.1", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" }, "engines": { - "node": ">=6" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/metro-file-map/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, "dependencies": { - "p-limit": "^2.2.0" + "ms": "2.0.0" + } + }, + "node_modules/metro-file-map/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/metro-minify-terser": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz", + "integrity": "sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ==", + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, + "node_modules/metro-resolver": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.12.tgz", + "integrity": "sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw==", + "peer": true, "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, + "node_modules/metro-runtime": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.12.tgz", + "integrity": "sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw==", + "peer": true, "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/metro-source-map": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.12.tgz", + "integrity": "sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw==", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.80.12", + "nullthrows": "^1.1.1", + "ob1": "0.80.12", + "source-map": "^0.5.6", + "vlq": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" } }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, + "node_modules/metro-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "peer": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, + "node_modules/metro-symbolicate": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz", + "integrity": "sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw==", + "peer": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.80.12", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, + "node_modules/metro-symbolicate/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "peer": true + }, + "node_modules/metro-symbolicate/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/metro-symbolicate/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "peer": true + }, + "node_modules/metro-symbolicate/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "peer": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node_modules/metro-symbolicate/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, + "node_modules/metro-symbolicate/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "peer": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz", + "integrity": "sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA==", + "peer": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "nullthrows": "^1.1.1" + }, "engines": { - "node": ">=10" + "node": ">=18" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz", + "integrity": "sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA==", + "peer": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "metro": "0.80.12", + "metro-babel-transformer": "0.80.12", + "metro-cache": "0.80.12", + "metro-cache-key": "0.80.12", + "metro-minify-terser": "0.80.12", + "metro-source-map": "0.80.12", + "metro-transform-plugins": "0.80.12", + "nullthrows": "^1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" } }, - "node_modules/merge-stream": { + "node_modules/metro/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro/node_modules/hermes-estree": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", + "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "peer": true + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", + "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "peer": true, + "dependencies": { + "hermes-estree": "0.23.1" + } + }, + "node_modules/metro/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "node_modules/metro/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "peer": true, "engines": { - "node": ">= 8" + "node": ">=0.10.0" + } + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/micromatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -5310,11 +10502,28 @@ "node": ">=8.6" } }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==", + "peer": true + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -5323,7 +10532,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -5335,7 +10543,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } @@ -5353,7 +10560,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5365,7 +10571,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5488,7 +10693,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -5522,8 +10726,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multimatch": { "version": "5.0.0", @@ -5559,11 +10762,19 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "peer": true, + "dependencies": { + "big-integer": "^1.6.16" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -5571,14 +10782,39 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nocache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", + "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", + "peer": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "peer": true + }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "peer": true, + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -5597,25 +10833,31 @@ "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "peer": true, + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/node-gyp": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz", @@ -5745,6 +10987,31 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "peer": true + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "peer": true, + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, "node_modules/nopt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", @@ -5773,6 +11040,15 @@ "node": ">=10" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -5908,7 +11184,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -5929,6 +11204,12 @@ "set-blocking": "~2.0.0" } }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "peer": true + }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -5947,6 +11228,18 @@ "node": "*" } }, + "node_modules/ob1": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.12.tgz", + "integrity": "sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==", + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5956,6 +11249,12 @@ "node": ">=0.10.0" } }, + "node_modules/object-code": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.3.tgz", + "integrity": "sha512-/Ds4Xd5xzrtUOJ+xJQ57iAy0BZsZltOHssnDgcZ8DOhgh41q1YJCnTPnWdWSLkNGNnxYzhYChjc5dgC9mEERCA==", + "peer": true + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -6013,11 +11312,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", + "peer": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -6026,15 +11351,35 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "peer": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/open/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "peer": true, + "engines": { + "node": ">=4" } }, "node_modules/opencollective-postinstall": { @@ -6046,6 +11391,29 @@ "opencollective-postinstall": "index.js" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "peer": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -6088,7 +11456,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6103,7 +11470,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -6191,7 +11557,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -6306,7 +11671,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -6318,7 +11682,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -6368,11 +11731,19 @@ "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", "dev": true }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -6381,7 +11752,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6390,7 +11760,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -6398,8 +11767,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-type": { "version": "4.0.0", @@ -6419,14 +11787,12 @@ "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -6446,6 +11812,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", @@ -6476,11 +11851,59 @@ "node": ">= 0.4" } }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "peer": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/pretty-format/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "peer": true, + "dependencies": { + "asap": "~2.0.6" + } }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -6501,6 +11924,19 @@ "node": ">=10" } }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "peer": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/promzard": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", @@ -6522,6 +11958,12 @@ "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "peer": true + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -6580,11 +12022,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "peer": true, + "dependencies": { + "inherits": "~2.0.3" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -6609,6 +12059,198 @@ "node": ">=8" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-devtools-core": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.3.1.tgz", + "integrity": "sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw==", + "peer": true, + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "peer": true + }, + "node_modules/react-native": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.75.3.tgz", + "integrity": "sha512-+Ne6u5H+tPo36sme19SCd1u2UID2uo0J/XzAJarxmrDj4Nsdi44eyUDKtQHmhgxjRGsuVJqAYrMK0abLSq8AHw==", + "peer": true, + "dependencies": { + "@jest/create-cache-key-function": "^29.6.3", + "@react-native-community/cli": "14.1.0", + "@react-native-community/cli-platform-android": "14.1.0", + "@react-native-community/cli-platform-ios": "14.1.0", + "@react-native/assets-registry": "0.75.3", + "@react-native/codegen": "0.75.3", + "@react-native/community-cli-plugin": "0.75.3", + "@react-native/gradle-plugin": "0.75.3", + "@react-native/js-polyfills": "0.75.3", + "@react-native/normalize-colors": "0.75.3", + "@react-native/virtualized-lists": "0.75.3", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "base64-js": "^1.5.1", + "chalk": "^4.0.0", + "commander": "^9.4.1", + "event-target-shim": "^5.0.1", + "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jest-environment-node": "^29.6.3", + "jsc-android": "^250231.0.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.80.3", + "metro-source-map": "^0.80.3", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "pretty-format": "^26.5.2", + "promise": "^8.3.0", + "react-devtools-core": "^5.3.1", + "react-refresh": "^0.14.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.24.0-canary-efb381bbf-20230505", + "semver": "^7.1.3", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.2", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.2.6", + "react": "^18.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native-mmkv": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/react-native-mmkv/-/react-native-mmkv-2.12.2.tgz", + "integrity": "sha512-6058Aq0p57chPrUutLGe9fYoiDVDNMU2PKV+lLFUJ3GhoHvUrLdsS1PDSCLr00yqzL4WJQ7TTzH+V8cpyrNcfg==", + "peer": true, + "peerDependencies": { + "react": "*", + "react-native": ">=0.71.0" + } + }, + "node_modules/react-native/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/react-native/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/react-native/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "peer": true + }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -6891,7 +12533,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6914,6 +12555,27 @@ "once": "^1.3.0" } }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", + "peer": true + }, + "node_modules/recast": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", + "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", + "peer": true, + "dependencies": { + "ast-types": "0.15.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -6939,11 +12601,37 @@ "node": ">=8" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "peer": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "peer": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", @@ -6963,6 +12651,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "peer": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "peer": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "peer": true + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -7008,16 +12740,20 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "peer": true + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -7055,7 +12791,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -7064,7 +12799,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -7086,7 +12820,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -7097,7 +12830,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -7121,7 +12853,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -7144,7 +12875,6 @@ "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, "dependencies": { "tslib": "^2.1.0" } @@ -7171,7 +12901,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -7204,47 +12933,178 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true + }, + "node_modules/scheduler": { + "version": "0.24.0-canary-efb381bbf-20230505", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", + "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "peer": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true + }, + "node_modules/semver-regex": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "peer": true }, - "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "peer": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "peer": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "peer": true, + "engines": { + "node": ">= 0.8" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { "version": "1.2.2", @@ -7278,11 +13138,16 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "peer": true + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, "dependencies": { "kind-of": "^6.0.2" }, @@ -7294,7 +13159,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7306,7 +13170,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -7315,7 +13178,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7341,18 +13203,72 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "peer": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "peer": true + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", @@ -7428,11 +13344,20 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -7550,6 +13475,63 @@ "node": ">= 8" } }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "peer": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "peer": true + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "peer": true, + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -7563,7 +13545,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -7572,7 +13553,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7635,7 +13615,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7656,7 +13635,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "engines": { "node": ">=6" } @@ -7673,6 +13651,12 @@ "node": ">=8" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "peer": true + }, "node_modules/strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -7690,11 +13674,16 @@ "node": ">=4" } }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "peer": true + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7709,7 +13698,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7752,6 +13740,18 @@ "node": ">=8" } }, + "node_modules/temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "peer": true, + "dependencies": { + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", @@ -7777,6 +13777,43 @@ "node": ">=8" } }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/terser": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", + "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + }, "node_modules/text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -7786,6 +13823,12 @@ "node": ">=0.10" } }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "peer": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -7813,11 +13856,25 @@ "node": ">=0.6.0" } }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "peer": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -7825,6 +13882,15 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "peer": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -7900,8 +13966,7 @@ "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -7921,6 +13986,15 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -8025,7 +14099,7 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8078,6 +14152,52 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "peer": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "peer": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -8111,6 +14231,25 @@ "node": ">= 10.0.0" } }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/upath": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", @@ -8121,6 +14260,36 @@ "yarn": "*" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8133,8 +14302,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/util-promisify": { "version": "2.1.0", @@ -8145,6 +14313,15 @@ "object.getownpropertydescriptors": "^2.0.3" } }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -8174,6 +14351,15 @@ "builtins": "^1.0.3" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -8188,11 +14374,25 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "peer": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "peer": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, "dependencies": { "defaults": "^1.0.3" } @@ -8265,6 +14465,12 @@ "node": ">=10.0.0" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "peer": true + }, "node_modules/whatwg-url": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", @@ -8283,7 +14489,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -8310,6 +14515,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "peer": true + }, "node_modules/which-pm-runs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", @@ -8363,7 +14574,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8379,8 +14589,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -8526,11 +14735,19 @@ "node": ">=6" } }, + "node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, "engines": { "node": ">=0.4" } @@ -8539,7 +14756,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -8563,7 +14779,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -8590,7 +14805,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } @@ -8599,13 +14813,21 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx index 220fd69518..9cd1c735f8 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx @@ -17,10 +17,14 @@ const TokenDetailOverview = ({ tokenInfo, isLoading }: Props): JSX.Element => { const theme: any = useTheme(); const strings = useStrings(); const { networkId } = usePortfolio(); - const networkUrl = networkId && getNetworkUrl(networkId); + const networkUrl = networkId !== null ? getNetworkUrl(networkId) : ''; + console.log('networkUrl', networkUrl); + // const explorers = useExplorers('mainnet' as Chain.SupportedNetworks); - const isPrimary = isPrimaryToken(tokenInfo.info); + // console.log('explorers', explorers); + const isPrimary = isPrimaryToken(tokenInfo.info); + console.log('URLL', `${networkUrl}/${tokenInfo?.info.policyId}${tokenInfo?.assetName}`); return ( @@ -68,7 +72,7 @@ const TokenDetailOverview = ({ tokenInfo, isLoading }: Props): JSX.Element => { ); @@ -76,14 +80,15 @@ const TokenDetailOverview = ({ tokenInfo, isLoading }: Props): JSX.Element => { export default TokenDetailOverview; -type TokenOverviewSection = { +type TokenOverviewSectionTypes = { label: string; value: string; isExternalLink?: boolean; - networkUrl?: undefined | string; + isNetworkUrl?: boolean; }; -const TokenOverviewSection = ({ label, value, isExternalLink = false, networkUrl }: TokenOverviewSection) => { +const TokenOverviewSection = ({ label, value, isExternalLink = false, isNetworkUrl = false }: TokenOverviewSectionTypes) => { + console.log('value', value); const theme: any = useTheme(); if (!value) { return <>; @@ -94,11 +99,11 @@ const TokenOverviewSection = ({ label, value, isExternalLink = false, networkUrl {label} - {networkUrl ? ( + {isNetworkUrl ? ( @@ -106,7 +111,7 @@ const TokenOverviewSection = ({ label, value, isExternalLink = false, networkUrl diff --git a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts index 0189983c58..983cd3478b 100644 --- a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts +++ b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts @@ -1,8 +1,12 @@ -export const getNetworkUrl = (networkId: number | undefined): string => { - if (networkId) { - return isTestnet(networkId) ? 'https://testnet.cardanoscan.io/token' : 'https://cardanoscan.io/token'; - } - return ''; +export const getNetworkUrl = (networkId: number): any => { + console.log('networkId !== 0', networkId); + + return isTestnet(networkId) + ? { + cardanoScan: 'https://testnet.cardanoscan.io/token', + cexplorer: 'https://cexplorer.io/asset', + } + : { cardanoScan: 'https://cardanoscan.io/token', cexplorer: 'https://cexplorer.io/asset' }; }; export const isTestnet = (networkId: number): boolean => { diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index fa6da20635..afa1a0eff9 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -171,6 +171,7 @@ "@yoroi/staking": "^1.5.1", "@yoroi/swap": "1.5.2", "@yoroi/types": "1.5.7", + "@yoroi/explorers": "^1.0.2", "assert": "2.1.0", "async-await-queue": "2.1.4", "axios": "0.21.1", From 457ad3a522d9668151a656cde7f51943ca4cbb8e Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Tue, 24 Sep 2024 18:52:26 +0300 Subject: [PATCH 24/58] refactor prices api usage --- package-lock.json | 9024 +++-------------- .../common/components/HeaderPrice.tsx | 28 + .../common/components/PortfolioHeader.tsx | 88 +- .../common/helpers/aggregatePrimaryAmount.ts | 36 + .../module/PortfolioContextProvider.tsx | 3 +- .../module/PortfolioTokenActivityProvider.tsx | 12 +- .../useCases/Wallet/PortfolioWallet.tsx | 12 +- .../portfolio/useCases/Wallet/StatsTable.tsx | 125 +- .../app/UI/utils/createCurrentWalletInfo.ts | 45 +- .../app/UI/utils/useMultiTokenActivity.ts | 1 + packages/yoroi-extension/package-lock.json | 422 +- packages/yoroi-extension/package.json | 2 +- 12 files changed, 2037 insertions(+), 7761 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/components/HeaderPrice.tsx create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/helpers/aggregatePrimaryAmount.ts diff --git a/package-lock.json b/package-lock.json index e9b576b0af..836d3ef08d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,6 @@ "packages": { "": { "name": "root", - "dependencies": { - "@yoroi/explorers": "^1.0.1" - }, "devDependencies": { "concurrently": "^7.0.0", "husky": "4.3.8", @@ -17,23 +14,11 @@ "webpack-cli": "^5.1.4" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -42,380 +27,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "peer": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", - "peer": true, - "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "peer": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "peer": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "peer": true - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "peer": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", - "peer": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", - "peer": true, - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", - "peer": true, - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, + "dev": true, "engines": { "node": ">=6.9.0" } @@ -424,6 +40,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -438,6 +55,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -449,6 +67,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -462,6 +81,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -469,12 +89,14 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -483,6 +105,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -490,3871 +113,1401 @@ "node": ">=4" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/runtime": { "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "dev": true, "dependencies": { - "@babel/types": "^7.25.6" - }, - "bin": { - "parser": "bin/babel-parser.js" + "regenerator-runtime": "^0.14.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", - "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" - }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=10.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", - "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", - "peer": true, + "node_modules/@lerna/add": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-4.0.0.tgz", + "integrity": "sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@lerna/bootstrap": "4.0.0", + "@lerna/command": "4.0.0", + "@lerna/filter-options": "4.0.0", + "@lerna/npm-conf": "4.0.0", + "@lerna/validation-error": "4.0.0", + "dedent": "^0.7.0", + "npm-package-arg": "^8.1.0", + "p-map": "^4.0.0", + "pacote": "^11.2.6", + "semver": "^7.3.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", - "peer": true, + "node_modules/@lerna/bootstrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-4.0.0.tgz", + "integrity": "sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@lerna/command": "4.0.0", + "@lerna/filter-options": "4.0.0", + "@lerna/has-npm-version": "4.0.0", + "@lerna/npm-install": "4.0.0", + "@lerna/package-graph": "4.0.0", + "@lerna/pulse-till-done": "4.0.0", + "@lerna/rimraf-dir": "4.0.0", + "@lerna/run-lifecycle": "4.0.0", + "@lerna/run-topologically": "4.0.0", + "@lerna/symlink-binary": "4.0.0", + "@lerna/symlink-dependencies": "4.0.0", + "@lerna/validation-error": "4.0.0", + "dedent": "^0.7.0", + "get-port": "^5.1.1", + "multimatch": "^5.0.0", + "npm-package-arg": "^8.1.0", + "npmlog": "^4.1.2", + "p-map": "^4.0.0", + "p-map-series": "^2.1.0", + "p-waterfall": "^2.1.1", + "read-package-tree": "^5.3.1", + "semver": "^7.3.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "peer": true, + "node_modules/@lerna/changed": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-4.0.0.tgz", + "integrity": "sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@lerna/collect-updates": "4.0.0", + "@lerna/command": "4.0.0", + "@lerna/listable": "4.0.0", + "@lerna/output": "4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz", - "integrity": "sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==", - "peer": true, + "node_modules/@lerna/check-working-tree": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-4.0.0.tgz", + "integrity": "sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7" + "@lerna/collect-uncommitted": "4.0.0", + "@lerna/describe-ref": "4.0.0", + "@lerna/validation-error": "4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "peer": true, + "node_modules/@lerna/child-process": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-4.0.0.tgz", + "integrity": "sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "chalk": "^4.1.0", + "execa": "^5.0.0", + "strong-log-transformer": "^2.1.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "peer": true, + "node_modules/@lerna/clean": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-4.0.0.tgz", + "integrity": "sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@lerna/command": "4.0.0", + "@lerna/filter-options": "4.0.0", + "@lerna/prompt": "4.0.0", + "@lerna/pulse-till-done": "4.0.0", + "@lerna/rimraf-dir": "4.0.0", + "p-map": "^4.0.0", + "p-map-series": "^2.1.0", + "p-waterfall": "^2.1.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "peer": true, - "engines": { - "node": ">=6.9.0" + "node_modules/@lerna/cli": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-4.0.0.tgz", + "integrity": "sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "dependencies": { + "@lerna/global-options": "4.0.0", + "dedent": "^0.7.0", + "npmlog": "^4.1.2", + "yargs": "^16.2.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "peer": true, + "node_modules/@lerna/cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "peer": true, + "node_modules/@lerna/cli/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "peer": true, + "node_modules/@lerna/collect-uncommitted": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-4.0.0.tgz", + "integrity": "sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@lerna/child-process": "4.0.0", + "chalk": "^4.1.0", + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "peer": true, + "node_modules/@lerna/collect-updates": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-4.0.0.tgz", + "integrity": "sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@lerna/child-process": "4.0.0", + "@lerna/describe-ref": "4.0.0", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "slash": "^3.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz", - "integrity": "sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==", - "peer": true, + "node_modules/@lerna/command": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-4.0.0.tgz", + "integrity": "sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/child-process": "4.0.0", + "@lerna/package-graph": "4.0.0", + "@lerna/project": "4.0.0", + "@lerna/validation-error": "4.0.0", + "@lerna/write-log-file": "4.0.0", + "clone-deep": "^4.0.1", + "dedent": "^0.7.0", + "execa": "^5.0.0", + "is-ci": "^2.0.0", + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "peer": true, + "node_modules/@lerna/conventional-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-4.0.0.tgz", + "integrity": "sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@lerna/validation-error": "4.0.0", + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-core": "^4.2.2", + "conventional-recommended-bump": "^6.1.0", + "fs-extra": "^9.1.0", + "get-stream": "^6.0.0", + "lodash.template": "^4.5.0", + "npm-package-arg": "^8.1.0", + "npmlog": "^4.1.2", + "pify": "^5.0.0", + "semver": "^7.3.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", - "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", - "peer": true, + "node_modules/@lerna/create": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-4.0.0.tgz", + "integrity": "sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/child-process": "4.0.0", + "@lerna/command": "4.0.0", + "@lerna/npm-conf": "4.0.0", + "@lerna/validation-error": "4.0.0", + "dedent": "^0.7.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "init-package-json": "^2.0.2", + "npm-package-arg": "^8.1.0", + "p-reduce": "^2.1.0", + "pacote": "^11.2.6", + "pify": "^5.0.0", + "semver": "^7.3.4", + "slash": "^3.0.0", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^3.0.0", + "whatwg-url": "^8.4.0", + "yargs-parser": "20.2.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", - "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", - "peer": true, + "node_modules/@lerna/create-symlink": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-4.0.0.tgz", + "integrity": "sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "cmd-shim": "^4.1.0", + "fs-extra": "^9.1.0", + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", - "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", - "peer": true, + "node_modules/@lerna/describe-ref": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-4.0.0.tgz", + "integrity": "sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@lerna/child-process": "4.0.0", + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "peer": true, + "node_modules/@lerna/diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-4.0.0.tgz", + "integrity": "sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@lerna/child-process": "4.0.0", + "@lerna/command": "4.0.0", + "@lerna/validation-error": "4.0.0", + "npmlog": "^4.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "peer": true, + "node_modules/@lerna/exec": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-4.0.0.tgz", + "integrity": "sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/child-process": "4.0.0", + "@lerna/command": "4.0.0", + "@lerna/filter-options": "4.0.0", + "@lerna/profiler": "4.0.0", + "@lerna/run-topologically": "4.0.0", + "@lerna/validation-error": "4.0.0", + "p-map": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "peer": true, + "node_modules/@lerna/filter-options": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-4.0.0.tgz", + "integrity": "sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@lerna/collect-updates": "4.0.0", + "@lerna/filter-packages": "4.0.0", + "dedent": "^0.7.0", + "npmlog": "^4.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "peer": true, + "node_modules/@lerna/filter-packages": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-4.0.0.tgz", + "integrity": "sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@lerna/validation-error": "4.0.0", + "multimatch": "^5.0.0", + "npmlog": "^4.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "peer": true, + "node_modules/@lerna/get-npm-exec-opts": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-4.0.0.tgz", + "integrity": "sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "npmlog": "^4.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "peer": true, + "node_modules/@lerna/get-packed": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-4.0.0.tgz", + "integrity": "sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "fs-extra": "^9.1.0", + "ssri": "^8.0.1", + "tar": "^6.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "peer": true, + "node_modules/@lerna/github-client": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-4.0.0.tgz", + "integrity": "sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@lerna/child-process": "4.0.0", + "@octokit/plugin-enterprise-rest": "^6.0.1", + "@octokit/rest": "^18.1.0", + "git-url-parse": "^11.4.4", + "npmlog": "^4.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "peer": true, + "node_modules/@lerna/gitlab-client": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-4.0.0.tgz", + "integrity": "sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node-fetch": "^2.6.1", + "npmlog": "^4.1.2", + "whatwg-url": "^8.4.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/@lerna/global-options": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-4.0.0.tgz", + "integrity": "sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "peer": true, + "node_modules/@lerna/has-npm-version": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-4.0.0.tgz", + "integrity": "sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@lerna/child-process": "4.0.0", + "semver": "^7.3.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", - "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", - "peer": true, + "node_modules/@lerna/import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-4.0.0.tgz", + "integrity": "sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@lerna/child-process": "4.0.0", + "@lerna/command": "4.0.0", + "@lerna/prompt": "4.0.0", + "@lerna/pulse-till-done": "4.0.0", + "@lerna/validation-error": "4.0.0", + "dedent": "^0.7.0", + "fs-extra": "^9.1.0", + "p-map-series": "^2.1.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "peer": true, + "node_modules/@lerna/info": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/info/-/info-4.0.0.tgz", + "integrity": "sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@lerna/command": "4.0.0", + "@lerna/output": "4.0.0", + "envinfo": "^7.7.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", - "peer": true, + "node_modules/@lerna/init": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-4.0.0.tgz", + "integrity": "sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/child-process": "4.0.0", + "@lerna/command": "4.0.0", + "fs-extra": "^9.1.0", + "p-map": "^4.0.0", + "write-json-file": "^4.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", - "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", - "peer": true, + "node_modules/@lerna/link": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-4.0.0.tgz", + "integrity": "sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.4" + "@lerna/command": "4.0.0", + "@lerna/package-graph": "4.0.0", + "@lerna/symlink-dependencies": "4.0.0", + "p-map": "^4.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "peer": true, + "node_modules/@lerna/list": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-4.0.0.tgz", + "integrity": "sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@lerna/command": "4.0.0", + "@lerna/filter-options": "4.0.0", + "@lerna/listable": "4.0.0", + "@lerna/output": "4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "peer": true, + "node_modules/@lerna/listable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-4.0.0.tgz", + "integrity": "sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/query-graph": "4.0.0", + "chalk": "^4.1.0", + "columnify": "^1.5.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", - "peer": true, + "node_modules/@lerna/log-packed": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-4.0.0.tgz", + "integrity": "sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "byte-size": "^7.0.0", + "columnify": "^1.5.4", + "has-unicode": "^2.0.1", + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", - "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", - "peer": true, + "node_modules/@lerna/npm-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-4.0.0.tgz", + "integrity": "sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "config-chain": "^1.1.12", + "pify": "^5.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "node_modules/@lerna/npm-dist-tag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-4.0.0.tgz", + "integrity": "sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "dependencies": { + "@lerna/otplease": "4.0.0", + "npm-package-arg": "^8.1.0", + "npm-registry-fetch": "^9.0.0", + "npmlog": "^4.1.2" }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "engines": { + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", - "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", - "peer": true, + "node_modules/@lerna/npm-install": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-4.0.0.tgz", + "integrity": "sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", - "globals": "^11.1.0" + "@lerna/child-process": "4.0.0", + "@lerna/get-npm-exec-opts": "4.0.0", + "fs-extra": "^9.1.0", + "npm-package-arg": "^8.1.0", + "npmlog": "^4.1.2", + "signal-exit": "^3.0.3", + "write-pkg": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "peer": true, + "node_modules/@lerna/npm-publish": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-4.0.0.tgz", + "integrity": "sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@lerna/otplease": "4.0.0", + "@lerna/run-lifecycle": "4.0.0", + "fs-extra": "^9.1.0", + "libnpmpublish": "^4.0.0", + "npm-package-arg": "^8.1.0", + "npmlog": "^4.1.2", + "pify": "^5.0.0", + "read-package-json": "^3.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", - "peer": true, + "node_modules/@lerna/npm-run-script": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-4.0.0.tgz", + "integrity": "sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@lerna/child-process": "4.0.0", + "@lerna/get-npm-exec-opts": "4.0.0", + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", - "peer": true, + "node_modules/@lerna/otplease": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-4.0.0.tgz", + "integrity": "sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/prompt": "4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", - "peer": true, + "node_modules/@lerna/output": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/output/-/output-4.0.0.tgz", + "integrity": "sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", - "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", - "peer": true, + "node_modules/@lerna/pack-directory": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-4.0.0.tgz", + "integrity": "sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" + "@lerna/get-packed": "4.0.0", + "@lerna/package": "4.0.0", + "@lerna/run-lifecycle": "4.0.0", + "npm-packlist": "^2.1.4", + "npmlog": "^4.1.2", + "tar": "^6.1.0", + "temp-write": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", - "peer": true, + "node_modules/@lerna/package": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-4.0.0.tgz", + "integrity": "sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "load-json-file": "^6.2.0", + "npm-package-arg": "^8.1.0", + "write-pkg": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "peer": true, + "node_modules/@lerna/package-graph": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-4.0.0.tgz", + "integrity": "sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/prerelease-id-from-version": "4.0.0", + "@lerna/validation-error": "4.0.0", + "npm-package-arg": "^8.1.0", + "npmlog": "^4.1.2", + "semver": "^7.3.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "peer": true, + "node_modules/@lerna/prerelease-id-from-version": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-4.0.0.tgz", + "integrity": "sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "semver": "^7.3.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", - "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", - "peer": true, + "node_modules/@lerna/profiler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-4.0.0.tgz", + "integrity": "sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-flow": "^7.24.7" + "fs-extra": "^9.1.0", + "npmlog": "^4.1.2", + "upath": "^2.0.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", - "peer": true, + "node_modules/@lerna/project": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-4.0.0.tgz", + "integrity": "sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@lerna/package": "4.0.0", + "@lerna/validation-error": "4.0.0", + "cosmiconfig": "^7.0.0", + "dedent": "^0.7.0", + "dot-prop": "^6.0.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.2", + "load-json-file": "^6.2.0", + "npmlog": "^4.1.2", + "p-map": "^4.0.0", + "resolve-from": "^5.0.0", + "write-json-file": "^4.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" - }, + "node_modules/@lerna/project/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", - "peer": true, + "node_modules/@lerna/prompt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-4.0.0.tgz", + "integrity": "sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "inquirer": "^7.3.3", + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", - "peer": true, + "node_modules/@lerna/publish": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-4.0.0.tgz", + "integrity": "sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@lerna/check-working-tree": "4.0.0", + "@lerna/child-process": "4.0.0", + "@lerna/collect-updates": "4.0.0", + "@lerna/command": "4.0.0", + "@lerna/describe-ref": "4.0.0", + "@lerna/log-packed": "4.0.0", + "@lerna/npm-conf": "4.0.0", + "@lerna/npm-dist-tag": "4.0.0", + "@lerna/npm-publish": "4.0.0", + "@lerna/otplease": "4.0.0", + "@lerna/output": "4.0.0", + "@lerna/pack-directory": "4.0.0", + "@lerna/prerelease-id-from-version": "4.0.0", + "@lerna/prompt": "4.0.0", + "@lerna/pulse-till-done": "4.0.0", + "@lerna/run-lifecycle": "4.0.0", + "@lerna/run-topologically": "4.0.0", + "@lerna/validation-error": "4.0.0", + "@lerna/version": "4.0.0", + "fs-extra": "^9.1.0", + "libnpmaccess": "^4.0.1", + "npm-package-arg": "^8.1.0", + "npm-registry-fetch": "^9.0.0", + "npmlog": "^4.1.2", + "p-map": "^4.0.0", + "p-pipe": "^3.1.0", + "pacote": "^11.2.6", + "semver": "^7.3.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", - "peer": true, + "node_modules/@lerna/pulse-till-done": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-4.0.0.tgz", + "integrity": "sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", - "peer": true, + "node_modules/@lerna/query-graph": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-4.0.0.tgz", + "integrity": "sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/package-graph": "4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", - "peer": true, + "node_modules/@lerna/resolve-symlink": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-4.0.0.tgz", + "integrity": "sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "fs-extra": "^9.1.0", + "npmlog": "^4.1.2", + "read-cmd-shim": "^2.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", - "peer": true, + "node_modules/@lerna/rimraf-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-4.0.0.tgz", + "integrity": "sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@lerna/child-process": "4.0.0", + "npmlog": "^4.1.2", + "path-exists": "^4.0.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", - "peer": true, + "node_modules/@lerna/run": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-4.0.0.tgz", + "integrity": "sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@lerna/command": "4.0.0", + "@lerna/filter-options": "4.0.0", + "@lerna/npm-run-script": "4.0.0", + "@lerna/output": "4.0.0", + "@lerna/profiler": "4.0.0", + "@lerna/run-topologically": "4.0.0", + "@lerna/timer": "4.0.0", + "@lerna/validation-error": "4.0.0", + "p-map": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", - "peer": true, + "node_modules/@lerna/run-lifecycle": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-4.0.0.tgz", + "integrity": "sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/npm-conf": "4.0.0", + "npm-lifecycle": "^3.1.5", + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", - "peer": true, + "node_modules/@lerna/run-topologically": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-4.0.0.tgz", + "integrity": "sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/query-graph": "4.0.0", + "p-queue": "^6.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", - "peer": true, + "node_modules/@lerna/symlink-binary": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-4.0.0.tgz", + "integrity": "sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@lerna/create-symlink": "4.0.0", + "@lerna/package": "4.0.0", + "fs-extra": "^9.1.0", + "p-map": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", - "peer": true, + "node_modules/@lerna/symlink-dependencies": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-4.0.0.tgz", + "integrity": "sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@lerna/create-symlink": "4.0.0", + "@lerna/resolve-symlink": "4.0.0", + "@lerna/symlink-binary": "4.0.0", + "fs-extra": "^9.1.0", + "p-map": "^4.0.0", + "p-map-series": "^2.1.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, + "node_modules/@lerna/timer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-4.0.0.tgz", + "integrity": "sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", - "peer": true, + "node_modules/@lerna/validation-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-4.0.0.tgz", + "integrity": "sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "npmlog": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", - "peer": true, + "node_modules/@lerna/version": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-4.0.0.tgz", + "integrity": "sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@lerna/check-working-tree": "4.0.0", + "@lerna/child-process": "4.0.0", + "@lerna/collect-updates": "4.0.0", + "@lerna/command": "4.0.0", + "@lerna/conventional-commits": "4.0.0", + "@lerna/github-client": "4.0.0", + "@lerna/gitlab-client": "4.0.0", + "@lerna/output": "4.0.0", + "@lerna/prerelease-id-from-version": "4.0.0", + "@lerna/prompt": "4.0.0", + "@lerna/run-lifecycle": "4.0.0", + "@lerna/run-topologically": "4.0.0", + "@lerna/validation-error": "4.0.0", + "chalk": "^4.1.0", + "dedent": "^0.7.0", + "load-json-file": "^6.2.0", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "p-map": "^4.0.0", + "p-pipe": "^3.1.0", + "p-reduce": "^2.1.0", + "p-waterfall": "^2.1.1", + "semver": "^7.3.4", + "slash": "^3.0.0", + "temp-write": "^4.0.0", + "write-json-file": "^4.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", - "peer": true, + "node_modules/@lerna/write-log-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-4.0.0.tgz", + "integrity": "sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "npmlog": "^4.1.2", + "write-file-atomic": "^3.0.3" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 10.18.0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", - "peer": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", - "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", - "peer": true, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", - "peer": true, + "node_modules/@npmcli/ci-detect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz", + "integrity": "sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q==", + "deprecated": "this package has been deprecated, use `ci-info` instead", + "dev": true + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", - "peer": true, + "node_modules/@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", - "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", - "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz", - "integrity": "sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ==", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", - "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", - "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", - "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.25.4", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.25.4", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-flow": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz", - "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-transform-flow-strip-types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", - "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", - "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", - "peer": true, - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "peer": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "peer": true - }, - "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", - "peer": true, - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cardano-foundation/ledgerjs-hw-app-cardano": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@cardano-foundation/ledgerjs-hw-app-cardano/-/ledgerjs-hw-app-cardano-7.1.4.tgz", - "integrity": "sha512-bkZ78H0m6E22Fe4nN+K0HY0O2lrPk9Pjs/gv0U5xvJyrMqwmR4wm9h8QXd/AwJ084KIhfpCSGDCQ0CN/K++vNw==", - "peer": true, - "dependencies": { - "@ledgerhq/hw-transport": "^6.31.2", - "base-x": "^3.0.5", - "bech32": "^1.1.4", - "int64-buffer": "^1.0.1" - } - }, - "node_modules/@cardano-foundation/ledgerjs-hw-app-cardano/node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "peer": true - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@emurgo/cross-csl-core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@emurgo/cross-csl-core/-/cross-csl-core-5.1.1.tgz", - "integrity": "sha512-UYzf7kR/jY01gAyTkhz2OwirdrVCh/e5I2O/P8MxzdFvtLU88XLY8T6KWgroJ4cQ3XoFCKtSJDFOxcN01nteRg==", - "peer": true - }, - "node_modules/@emurgo/yoroi-lib": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emurgo/yoroi-lib/-/yoroi-lib-1.2.2.tgz", - "integrity": "sha512-alzxMst6K9dazsYAmp6KsyqaI8Aw+Y1SM9K288Pc9pwbFk1n0QQiPrvvK/t6YczBZFXQUmNezcNu17EpJVgLDw==", - "peer": true, - "dependencies": { - "@cardano-foundation/ledgerjs-hw-app-cardano": "^7.1.3", - "@emurgo/cross-csl-core": "5.1.1", - "@noble/hashes": "^1.3.2", - "axios": "^1.7.5", - "axios-cache-interceptor": "^1.5.3", - "bech32": "^2.0.0", - "bignumber.js": "^9.0.1", - "easy-crc": "1.1.0" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "peer": true - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "peer": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "peer": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@ledgerhq/devices": { - "version": "8.4.3", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.4.3.tgz", - "integrity": "sha512-+ih+M27E6cm6DHrmw3GbS3mEaznCyFc0e62VdQux40XK2psgYhL2yBPftM4KCrBYm1UbHqXzqLN+Jb7rNIzsHg==", - "peer": true, - "dependencies": { - "@ledgerhq/errors": "^6.19.0", - "@ledgerhq/logs": "^6.12.0", - "rxjs": "^7.8.1", - "semver": "^7.3.5" - } - }, - "node_modules/@ledgerhq/errors": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.19.0.tgz", - "integrity": "sha512-c3Jid7euMSnpHFp8H7iPtsmKDjwbTjlG46YKdw+RpCclsqtBx1uQDlYmcbP1Yv9201kVlUFUhhP4H623k8xzlQ==", - "peer": true - }, - "node_modules/@ledgerhq/hw-transport": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.31.3.tgz", - "integrity": "sha512-rFplkHWF5NXtlYwAusqLlMu298NHtRD+2q/jrTYc//uu/xJO9LkDIgKid6IVF2+e1Wj7yX6YQVrU6L0Yu1ntEw==", - "peer": true, - "dependencies": { - "@ledgerhq/devices": "^8.4.3", - "@ledgerhq/errors": "^6.19.0", - "@ledgerhq/logs": "^6.12.0", - "events": "^3.3.0" - } - }, - "node_modules/@ledgerhq/logs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.12.0.tgz", - "integrity": "sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA==", - "peer": true - }, - "node_modules/@lerna/add": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-4.0.0.tgz", - "integrity": "sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/bootstrap": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/npm-conf": "4.0.0", - "@lerna/validation-error": "4.0.0", - "dedent": "^0.7.0", - "npm-package-arg": "^8.1.0", - "p-map": "^4.0.0", - "pacote": "^11.2.6", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/bootstrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-4.0.0.tgz", - "integrity": "sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/has-npm-version": "4.0.0", - "@lerna/npm-install": "4.0.0", - "@lerna/package-graph": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/rimraf-dir": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/symlink-binary": "4.0.0", - "@lerna/symlink-dependencies": "4.0.0", - "@lerna/validation-error": "4.0.0", - "dedent": "^0.7.0", - "get-port": "^5.1.1", - "multimatch": "^5.0.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0", - "p-waterfall": "^2.1.1", - "read-package-tree": "^5.3.1", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/changed": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-4.0.0.tgz", - "integrity": "sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/collect-updates": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/listable": "4.0.0", - "@lerna/output": "4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/check-working-tree": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-4.0.0.tgz", - "integrity": "sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/collect-uncommitted": "4.0.0", - "@lerna/describe-ref": "4.0.0", - "@lerna/validation-error": "4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/child-process": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-4.0.0.tgz", - "integrity": "sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "execa": "^5.0.0", - "strong-log-transformer": "^2.1.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/clean": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-4.0.0.tgz", - "integrity": "sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/rimraf-dir": "4.0.0", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0", - "p-waterfall": "^2.1.1" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/cli": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-4.0.0.tgz", - "integrity": "sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/global-options": "4.0.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2", - "yargs": "^16.2.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/@lerna/cli/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@lerna/collect-uncommitted": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-4.0.0.tgz", - "integrity": "sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "chalk": "^4.1.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/collect-updates": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-4.0.0.tgz", - "integrity": "sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/describe-ref": "4.0.0", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/command": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-4.0.0.tgz", - "integrity": "sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/package-graph": "4.0.0", - "@lerna/project": "4.0.0", - "@lerna/validation-error": "4.0.0", - "@lerna/write-log-file": "4.0.0", - "clone-deep": "^4.0.1", - "dedent": "^0.7.0", - "execa": "^5.0.0", - "is-ci": "^2.0.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/conventional-commits": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-4.0.0.tgz", - "integrity": "sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/validation-error": "4.0.0", - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-core": "^4.2.2", - "conventional-recommended-bump": "^6.1.0", - "fs-extra": "^9.1.0", - "get-stream": "^6.0.0", - "lodash.template": "^4.5.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "pify": "^5.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/create": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-4.0.0.tgz", - "integrity": "sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag==", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/npm-conf": "4.0.0", - "@lerna/validation-error": "4.0.0", - "dedent": "^0.7.0", - "fs-extra": "^9.1.0", - "globby": "^11.0.2", - "init-package-json": "^2.0.2", - "npm-package-arg": "^8.1.0", - "p-reduce": "^2.1.0", - "pacote": "^11.2.6", - "pify": "^5.0.0", - "semver": "^7.3.4", - "slash": "^3.0.0", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0", - "whatwg-url": "^8.4.0", - "yargs-parser": "20.2.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/create-symlink": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-4.0.0.tgz", - "integrity": "sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "cmd-shim": "^4.1.0", - "fs-extra": "^9.1.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/describe-ref": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-4.0.0.tgz", - "integrity": "sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-4.0.0.tgz", - "integrity": "sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/validation-error": "4.0.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/exec": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-4.0.0.tgz", - "integrity": "sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/profiler": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/validation-error": "4.0.0", - "p-map": "^4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/filter-options": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-4.0.0.tgz", - "integrity": "sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/collect-updates": "4.0.0", - "@lerna/filter-packages": "4.0.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/filter-packages": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-4.0.0.tgz", - "integrity": "sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/validation-error": "4.0.0", - "multimatch": "^5.0.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/get-npm-exec-opts": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-4.0.0.tgz", - "integrity": "sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/get-packed": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-4.0.0.tgz", - "integrity": "sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "fs-extra": "^9.1.0", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/github-client": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-4.0.0.tgz", - "integrity": "sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^18.1.0", - "git-url-parse": "^11.4.4", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/gitlab-client": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-4.0.0.tgz", - "integrity": "sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.1", - "npmlog": "^4.1.2", - "whatwg-url": "^8.4.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/global-options": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-4.0.0.tgz", - "integrity": "sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/has-npm-version": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-4.0.0.tgz", - "integrity": "sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-4.0.0.tgz", - "integrity": "sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/validation-error": "4.0.0", - "dedent": "^0.7.0", - "fs-extra": "^9.1.0", - "p-map-series": "^2.1.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-4.0.0.tgz", - "integrity": "sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/output": "4.0.0", - "envinfo": "^7.7.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/init": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-4.0.0.tgz", - "integrity": "sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0", - "write-json-file": "^4.3.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/link": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-4.0.0.tgz", - "integrity": "sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/package-graph": "4.0.0", - "@lerna/symlink-dependencies": "4.0.0", - "p-map": "^4.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/list": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-4.0.0.tgz", - "integrity": "sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/listable": "4.0.0", - "@lerna/output": "4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/listable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-4.0.0.tgz", - "integrity": "sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/query-graph": "4.0.0", - "chalk": "^4.1.0", - "columnify": "^1.5.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/log-packed": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-4.0.0.tgz", - "integrity": "sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "byte-size": "^7.0.0", - "columnify": "^1.5.4", - "has-unicode": "^2.0.1", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/npm-conf": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-4.0.0.tgz", - "integrity": "sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "config-chain": "^1.1.12", - "pify": "^5.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/npm-dist-tag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-4.0.0.tgz", - "integrity": "sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/otplease": "4.0.0", - "npm-package-arg": "^8.1.0", - "npm-registry-fetch": "^9.0.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/npm-install": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-4.0.0.tgz", - "integrity": "sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/get-npm-exec-opts": "4.0.0", - "fs-extra": "^9.1.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "signal-exit": "^3.0.3", - "write-pkg": "^4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/npm-publish": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-4.0.0.tgz", - "integrity": "sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/otplease": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "fs-extra": "^9.1.0", - "libnpmpublish": "^4.0.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "pify": "^5.0.0", - "read-package-json": "^3.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/npm-run-script": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-4.0.0.tgz", - "integrity": "sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/get-npm-exec-opts": "4.0.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/otplease": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-4.0.0.tgz", - "integrity": "sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/prompt": "4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/output": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-4.0.0.tgz", - "integrity": "sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/pack-directory": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-4.0.0.tgz", - "integrity": "sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/get-packed": "4.0.0", - "@lerna/package": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "npm-packlist": "^2.1.4", - "npmlog": "^4.1.2", - "tar": "^6.1.0", - "temp-write": "^4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/package": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-4.0.0.tgz", - "integrity": "sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "load-json-file": "^6.2.0", - "npm-package-arg": "^8.1.0", - "write-pkg": "^4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/package-graph": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-4.0.0.tgz", - "integrity": "sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/prerelease-id-from-version": "4.0.0", - "@lerna/validation-error": "4.0.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/prerelease-id-from-version": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-4.0.0.tgz", - "integrity": "sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/profiler": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-4.0.0.tgz", - "integrity": "sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "fs-extra": "^9.1.0", - "npmlog": "^4.1.2", - "upath": "^2.0.1" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/project": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-4.0.0.tgz", - "integrity": "sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/package": "4.0.0", - "@lerna/validation-error": "4.0.0", - "cosmiconfig": "^7.0.0", - "dedent": "^0.7.0", - "dot-prop": "^6.0.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.2", - "load-json-file": "^6.2.0", - "npmlog": "^4.1.2", - "p-map": "^4.0.0", - "resolve-from": "^5.0.0", - "write-json-file": "^4.3.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/project/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/prompt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-4.0.0.tgz", - "integrity": "sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "inquirer": "^7.3.3", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/publish": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-4.0.0.tgz", - "integrity": "sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/check-working-tree": "4.0.0", - "@lerna/child-process": "4.0.0", - "@lerna/collect-updates": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/describe-ref": "4.0.0", - "@lerna/log-packed": "4.0.0", - "@lerna/npm-conf": "4.0.0", - "@lerna/npm-dist-tag": "4.0.0", - "@lerna/npm-publish": "4.0.0", - "@lerna/otplease": "4.0.0", - "@lerna/output": "4.0.0", - "@lerna/pack-directory": "4.0.0", - "@lerna/prerelease-id-from-version": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/validation-error": "4.0.0", - "@lerna/version": "4.0.0", - "fs-extra": "^9.1.0", - "libnpmaccess": "^4.0.1", - "npm-package-arg": "^8.1.0", - "npm-registry-fetch": "^9.0.0", - "npmlog": "^4.1.2", - "p-map": "^4.0.0", - "p-pipe": "^3.1.0", - "pacote": "^11.2.6", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/pulse-till-done": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-4.0.0.tgz", - "integrity": "sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/query-graph": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-4.0.0.tgz", - "integrity": "sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/package-graph": "4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/resolve-symlink": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-4.0.0.tgz", - "integrity": "sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "fs-extra": "^9.1.0", - "npmlog": "^4.1.2", - "read-cmd-shim": "^2.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/rimraf-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-4.0.0.tgz", - "integrity": "sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "npmlog": "^4.1.2", - "path-exists": "^4.0.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/run": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-4.0.0.tgz", - "integrity": "sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/npm-run-script": "4.0.0", - "@lerna/output": "4.0.0", - "@lerna/profiler": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/timer": "4.0.0", - "@lerna/validation-error": "4.0.0", - "p-map": "^4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/run-lifecycle": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-4.0.0.tgz", - "integrity": "sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/npm-conf": "4.0.0", - "npm-lifecycle": "^3.1.5", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/run-topologically": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-4.0.0.tgz", - "integrity": "sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/query-graph": "4.0.0", - "p-queue": "^6.6.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/symlink-binary": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-4.0.0.tgz", - "integrity": "sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/create-symlink": "4.0.0", - "@lerna/package": "4.0.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/symlink-dependencies": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-4.0.0.tgz", - "integrity": "sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/create-symlink": "4.0.0", - "@lerna/resolve-symlink": "4.0.0", - "@lerna/symlink-binary": "4.0.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/timer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-4.0.0.tgz", - "integrity": "sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/validation-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-4.0.0.tgz", - "integrity": "sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/version": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-4.0.0.tgz", - "integrity": "sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/check-working-tree": "4.0.0", - "@lerna/child-process": "4.0.0", - "@lerna/collect-updates": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/conventional-commits": "4.0.0", - "@lerna/github-client": "4.0.0", - "@lerna/gitlab-client": "4.0.0", - "@lerna/output": "4.0.0", - "@lerna/prerelease-id-from-version": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/validation-error": "4.0.0", - "chalk": "^4.1.0", - "dedent": "^0.7.0", - "load-json-file": "^6.2.0", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "p-map": "^4.0.0", - "p-pipe": "^3.1.0", - "p-reduce": "^2.1.0", - "p-waterfall": "^2.1.1", - "semver": "^7.3.4", - "slash": "^3.0.0", - "temp-write": "^4.0.0", - "write-json-file": "^4.3.0" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/write-log-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-4.0.0.tgz", - "integrity": "sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "npmlog": "^4.1.2", - "write-file-atomic": "^3.0.3" - }, - "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@noble/hashes": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", - "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", - "peer": true, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/ci-detect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz", - "integrity": "sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q==", - "deprecated": "this package has been deprecated, use `ci-info` instead", - "dev": true - }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", - "dev": true - }, - "node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, - "dependencies": { - "infer-owner": "^1.0.4" - } - }, - "node_modules/@npmcli/run-script": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "node_modules/@npmcli/run-script/node_modules/node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "node_modules/@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "dev": true, - "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" } }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@react-native-async-storage/async-storage": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.20.0.tgz", - "integrity": "sha512-M73ohkjV9DW7Imkcr+StZKBTJiNGyJmPOEk1x07acUWJtH87enUyYZ1eb7oX5m145yZGplTvhbKtf8mufHRx5Q==", - "peer": true, - "dependencies": { - "merge-options": "^3.0.4" - }, - "peerDependencies": { - "react-native": "^0.0.0-0 || >=0.60 <1.0" - } - }, - "node_modules/@react-native-community/cli": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-14.1.0.tgz", - "integrity": "sha512-k7aTdKNZIec7WMSqMJn9bDVLWPPOaYmshXcnjWy6t5ItsJnREju9p2azMTR5tXY5uIeynose3cxettbhk2Tbnw==", - "peer": true, - "dependencies": { - "@react-native-community/cli-clean": "14.1.0", - "@react-native-community/cli-config": "14.1.0", - "@react-native-community/cli-debugger-ui": "14.1.0", - "@react-native-community/cli-doctor": "14.1.0", - "@react-native-community/cli-server-api": "14.1.0", - "@react-native-community/cli-tools": "14.1.0", - "@react-native-community/cli-types": "14.1.0", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "deepmerge": "^4.3.0", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.2", - "semver": "^7.5.2" + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" }, "bin": { - "rnc-cli": "build/bin.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native-community/cli-clean": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-14.1.0.tgz", - "integrity": "sha512-/C4j1yntLo6faztNgZnsDtgpGqa6j0+GYrxOY8LqaKAN03OCnoeUUKO6w78dycbYSGglc1xjJg2RZI/M2oF2AA==", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "14.1.0", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2" - } - }, - "node_modules/@react-native-community/cli-config": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-14.1.0.tgz", - "integrity": "sha512-P3FK2rPUJBD1fmQHLgTqpHxsc111pnMdEEFR7KeqprCNz+Qr2QpPxfNy0V7s15tGL5rAv+wpbOGcioIV50EbxA==", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "14.1.0", - "chalk": "^4.1.2", - "cosmiconfig": "^9.0.0", - "deepmerge": "^4.3.0", - "fast-glob": "^3.3.2", - "joi": "^17.2.1" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "peer": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" + "installed-package-contents": "index.js" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@react-native-community/cli-debugger-ui": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.1.0.tgz", - "integrity": "sha512-+YbeCL0wLcBcqDwraJFGsqzcXu9S+bwTVrfImne/4mT6itfe3Oa93yrOVJgNbstrt5pJHuwpU76ZXfXoiuncsg==", - "peer": true, - "dependencies": { - "serve-static": "^1.13.1" - } - }, - "node_modules/@react-native-community/cli-doctor": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-14.1.0.tgz", - "integrity": "sha512-xIf0oQDRKt7lufUenRwcLYdINGc0x1FSXHaHjd7lQDGT5FJnCEYlIkYEDDgAl5tnVJSvM/IL2c6O+mffkNEPzQ==", - "peer": true, - "dependencies": { - "@react-native-community/cli-config": "14.1.0", - "@react-native-community/cli-platform-android": "14.1.0", - "@react-native-community/cli-platform-apple": "14.1.0", - "@react-native-community/cli-platform-ios": "14.1.0", - "@react-native-community/cli-tools": "14.1.0", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.13.0", - "execa": "^5.0.0", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "peer": true, "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "peer": true, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "peer": true, - "bin": { - "yaml": "bin.mjs" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/@react-native-community/cli-platform-android": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-14.1.0.tgz", - "integrity": "sha512-4JnXkAV+ca8XdUhZ7xjgDhXAMwTVjQs8JqiwP7FTYVrayShXy2cBXm/C3HNDoe+oQOF5tPT2SqsDAF2vYTnKiQ==", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "14.1.0", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.4.1", - "logkitty": "^0.7.1" - } - }, - "node_modules/@react-native-community/cli-platform-apple": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.1.0.tgz", - "integrity": "sha512-DExd+pZ7hHxXt8I6BBmckeYUxxq7PQ+o4YSmGIeQx0xUpi+f82obBct2WNC3VWU72Jw6obwfoN6Fwe6F7Wxp5Q==", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "14.1.0", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.4.1", - "ora": "^5.4.1" - } - }, - "node_modules/@react-native-community/cli-platform-ios": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.1.0.tgz", - "integrity": "sha512-ah/ZTiJXUdCVHujyRJ4OmCL5nTq8OWcURcE3UXa1z0sIIiA8io06n+v5n299T9rtPKMwRtVJlQjtO/nbODABPQ==", - "peer": true, - "dependencies": { - "@react-native-community/cli-platform-apple": "14.1.0" - } - }, - "node_modules/@react-native-community/cli-server-api": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-14.1.0.tgz", - "integrity": "sha512-1k2LBQaYsy9RDWFIfKVne3frOye73O33MV6eYMoRPff7wqxHCrsX1CYJQkmwpgVigZHxYwalHj+Axtu3gpomCA==", - "peer": true, - "dependencies": { - "@react-native-community/cli-debugger-ui": "14.1.0", - "@react-native-community/cli-tools": "14.1.0", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^6.2.3" - } - }, - "node_modules/@react-native-community/cli-tools": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.1.0.tgz", - "integrity": "sha512-r1KxSu2+OSuhWFoE//1UR7aSTXMLww/UYWQprEw4bSo/kvutGX//4r9ywgXSWp+39udpNN4jQpNTHuWhGZd/Bg==", - "peer": true, - "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3", - "sudo-prompt": "^9.0.0" - } - }, - "node_modules/@react-native-community/cli-types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-14.1.0.tgz", - "integrity": "sha512-aJwZI9mGRx3HdP8U4CGhqjt3S4r8GmeOqv4kRagC1UHDk4QNMC+bZ8JgPA4W7FrGiPey+lJQHMDPAXOo51SOUw==", - "peer": true, - "dependencies": { - "joi": "^17.2.1" + "node": ">=10" } }, - "node_modules/@react-native-community/cli/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "peer": true, - "engines": { - "node": "^12.20.0 || >=14" - } + "node_modules/@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "dev": true }, - "node_modules/@react-native-community/cli/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "peer": true, + "node_modules/@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@react-native-community/cli/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@react-native/assets-registry": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.75.3.tgz", - "integrity": "sha512-i7MaRbYR06WdpJWv3a0PQ2ScFBUeevwcJ0tVopnFwTg0tBWp3NFEMDIcU8lyXVy9Y59WmrP1V2ROaRDaPiESgg==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.75.3.tgz", - "integrity": "sha512-8JmXEKq+Efb9AffsV48l8gmKe/ZQ2PbBygZjHdIf8DNZZhO/z5mt27J4B43MWNdp5Ww1l59T0mEaf8l/uywQUg==", - "peer": true, - "dependencies": { - "@react-native/codegen": "0.75.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-preset": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.75.3.tgz", - "integrity": "sha512-VZQkQEj36DKEGApXFYdVcFtqdglbnoVr7aOZpjffURSgPcIA9vWTm1b+OL4ayOaRZXTZKiDBNQCXvBX5E5AgQg==", - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.20.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.75.3", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" + "infer-owner": "^1.0.4" } }, - "node_modules/@react-native/codegen": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.75.3.tgz", - "integrity": "sha512-I0bz5jwOkiR7vnhYLGoV22RGmesErUg03tjsCiQgmsMpbyCYumudEtLNN5+DplHGK56bu8KyzBqKkWXGSKSCZQ==", - "peer": true, + "node_modules/@npmcli/run-script": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", + "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "dev": true, "dependencies": { - "@babel/parser": "^7.20.0", - "glob": "^7.1.1", - "hermes-parser": "0.22.0", - "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^7.1.0", + "read-package-json-fast": "^2.0.1" } }, - "node_modules/@react-native/codegen/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "peer": true, + "node_modules/@npmcli/run-script/node_modules/node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, "dependencies": { - "minimist": "^1.2.6" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" }, "bin": { - "mkdirp": "bin/cmd.js" + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" } }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.75.3.tgz", - "integrity": "sha512-njsYm+jBWzfLcJcxavAY5QFzYTrmPtjbxq/64GSqwcQYzy9qAkI7LNTK/Wprq1I/4HOuHJO7Km+EddCXB+ByRQ==", - "peer": true, + "node_modules/@npmcli/run-script/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, "dependencies": { - "@react-native-community/cli-server-api": "14.1.0", - "@react-native-community/cli-tools": "14.1.0", - "@react-native/dev-middleware": "0.75.3", - "@react-native/metro-babel-transformer": "0.75.3", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "metro": "^0.80.3", - "metro-config": "^0.80.3", - "metro-core": "^0.80.3", - "node-fetch": "^2.2.0", - "readline": "^1.3.0" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.75.3.tgz", - "integrity": "sha512-99bLQsUwsxUMNR7Wa9eV2uyR38yfd6mOEqfN+JIm8/L9sKA926oh+CZkjDy1M8RmCB6spB5N9fVFVkrVdf2yFA==", - "peer": true, - "engines": { - "node": ">=18" + "node_modules/@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3" } }, - "node_modules/@react-native/dev-middleware": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.75.3.tgz", - "integrity": "sha512-h2/6+UGmeMWjnT43axy27jNqoDRsE1C1qpjRC3sYpD4g0bI0jSTkY1kAgj8uqGGXLnHXiHOtjLDGdbAgZrsPaA==", - "peer": true, + "node_modules/@octokit/core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "dev": true, "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.75.3", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "selfsigned": "^2.4.1", - "serve-static": "^1.13.1", - "ws": "^6.2.2" - }, - "engines": { - "node": ">=18" + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.3", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" } }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, + "node_modules/@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" } }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "peer": true, + "node_modules/@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" } }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.75.3.tgz", - "integrity": "sha512-mSfa/Mq/AsALuG/kvXz5ECrc6HdY5waMHal2sSfa8KA0Gt3JqYQVXF9Pdwd4yR5ClPZDI2HRa1tdE8GVlhMvPA==", - "peer": true, - "engines": { - "node": ">=18" - } + "node_modules/@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", + "dev": true }, - "node_modules/@react-native/js-polyfills": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.75.3.tgz", - "integrity": "sha512-+JVFJ351GSJT3V7LuXscMqfnpR/UxzsAjbBjfAHBR3kqTbVqrAmBccqPCA3NLzgb/RY8khLJklwMUVlWrn8iFg==", - "peer": true, - "engines": { - "node": ">=18" - } + "node_modules/@octokit/plugin-enterprise-rest": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "dev": true }, - "node_modules/@react-native/metro-babel-transformer": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.75.3.tgz", - "integrity": "sha512-gDlEl6C2mwQPLxFOR+yla5MpJpDPNOFD6J5Hd9JM9+lOdUq6MNujh1Xn4ZMvglW7rfViq3nMjg4xPQeGUhDG+w==", - "peer": true, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "2.21.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", + "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + "dev": true, "dependencies": { - "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.75.3", - "hermes-parser": "0.22.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" + "@octokit/types": "^6.40.0" }, "peerDependencies": { - "@babel/core": "*" + "@octokit/core": ">=2" } }, - "node_modules/@react-native/normalize-colors": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.75.3.tgz", - "integrity": "sha512-3mhF8AJFfIN0E5bEs/DQ4U2LzMJYm+FPSwY5bJ1DZhrxW1PFAh24bAPrSd8PwS0iarQ7biLdr1lWf/8LFv8pDA==", - "peer": true + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.75.3.tgz", - "integrity": "sha512-cTLm7k7Y//SvV8UK8esrDHEw5OrwwSJ4Fqc3x52Imi6ROuhshfGIPFwhtn4pmAg9nWHzHwwqiJ+9hCSVnXXX+g==", - "peer": true, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", + "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", + "dev": true, "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" + "@octokit/types": "^6.39.0", + "deprecation": "^2.3.1" }, "peerDependencies": { - "@types/react": "^18.2.6", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@octokit/core": ">=3" } }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "peer": true, + "node_modules/@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, "dependencies": { - "@hapi/hoek": "^9.0.0" + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "peer": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "peer": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "peer": true + "node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "peer": true, + "node_modules/@octokit/rest": { + "version": "18.12.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", + "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "dev": true, "dependencies": { - "type-detect": "4.0.8" + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "peer": true, + "node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@octokit/openapi-types": "^12.11.0" } }, "node_modules/@tootallnate/once": { @@ -4366,30 +1519,6 @@ "node": ">= 6" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "peer": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "peer": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -4402,24 +1531,6 @@ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, - "node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", - "peer": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -4432,27 +1543,6 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "peer": true - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "peer": true - }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", @@ -4497,102 +1587,12 @@ } } }, - "node_modules/@yoroi/common": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.3.tgz", - "integrity": "sha512-EIgOXpQYLWbDtbXSWxQH9a8cHvVsww3MmQNvYNa7ZVFbEZARtO7l05gRkZlRCip8grFf9RLoRRW7W/6EDDdQ9Q==", - "peer": true, - "dependencies": { - "@yoroi/types": "1.5.6" - }, - "engines": { - "node": ">= 16.19.0" - }, - "peerDependencies": { - "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", - "axios": "^1.5.0", - "bignumber.js": "^9.0.1", - "immer": "^10.0.3", - "react": ">= 16.8.0 <= 19.0.0", - "react-native-mmkv": "^2.11.0", - "react-query": "^3.39.3", - "rxjs": "^7.8.1", - "zod": "^3.22.1" - } - }, - "node_modules/@yoroi/explorers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@yoroi/explorers/-/explorers-1.0.1.tgz", - "integrity": "sha512-XI/tu5KTyfDPLB2lJD7LtFEA8FUKvjwojrYiIt8uAWLsbufhCVNiQJcSCoLiyzwgyPuNU4hgSscCn//FUsfKmA==", - "engines": { - "node": ">= 16.19.0" - }, - "peerDependencies": { - "@yoroi/common": "1.5.3", - "immer": "^10.0.3", - "react": ">= 16.8.0 <= 19.0.0", - "react-native-mmkv": "^2.11.0", - "react-query": "^3.39.3" - } - }, - "node_modules/@yoroi/types": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-1.5.6.tgz", - "integrity": "sha512-ZS1gw5Z7v/ojPvsH3aMcB5xIt1/90IfRun18JMrjoP60m7CAAr569603ieV9G8xt2FCUuiOwIN/OrNnIvc2PBQ==", - "peer": true, - "engines": { - "node": ">= 16.19.0" - }, - "peerDependencies": { - "@emurgo/yoroi-lib": "^1.0.0", - "axios": "^1.5.0", - "bignumber.js": "^9.0.1", - "rxjs": "^7.8.1" - } - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "peer": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "peer": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", @@ -4652,12 +1652,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "peer": true - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -4673,48 +1667,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "peer": true, - "dependencies": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "node_modules/ansi-fragments/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-fragments/node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "peer": true - }, - "node_modules/ansi-fragments/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -4723,6 +1680,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4733,25 +1691,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "peer": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appdirsjs": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", - "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", - "peer": true - }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -4805,12 +1744,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "peer": true - }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -4906,7 +1839,8 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true }, "node_modules/asn1": { "version": "0.2.6", @@ -4926,37 +1860,11 @@ "node": ">=0.8" } }, - "node_modules/ast-types": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", - "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", - "peer": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "peer": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", @@ -4997,150 +1905,11 @@ "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==", "dev": true }, - "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", - "peer": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios-cache-interceptor": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.6.0.tgz", - "integrity": "sha512-xuo4mZckPQmNV50bJpsMmGfpFV8SXsUWWUVKf1DXQy7t9p+6Pan9zrD3icAlCIdoYFw/ZJFKV6nUVqy8j0XCLQ==", - "peer": true, - "dependencies": { - "cache-parser": "1.2.5", - "fast-defer": "1.1.8", - "object-code": "1.3.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/arthurfiorette/axios-cache-interceptor?sponsor=1" - }, - "peerDependencies": { - "axios": "^1" - } - }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "peer": true, - "dependencies": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "peer": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", @@ -5151,51 +1920,17 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", - "peer": true - }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5205,6 +1940,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -5212,91 +1948,11 @@ "node": ">=8" } }, - "node_modules/broadcast-channel": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", - "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "detect-node": "^2.1.0", - "js-sha3": "0.8.0", - "microseconds": "0.2.0", - "nano-time": "1.0.0", - "oblivious-set": "1.0.0", - "rimraf": "3.0.2", - "unload": "2.2.0" - } - }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "peer": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/builtins": { "version": "1.0.3", @@ -5322,15 +1978,6 @@ "node": ">=10" } }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/cacache": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", @@ -5360,12 +2007,6 @@ "node": ">= 10" } }, - "node_modules/cache-parser": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/cache-parser/-/cache-parser-1.2.5.tgz", - "integrity": "sha512-Md/4VhAHByQ9frQ15WD6LrMNiVw9AEl/J7vWIXw+sxT6fSOpbtt6LHTp76vy8+bOESPBO94117Hm2bIjlI7XjA==", - "peer": true - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -5385,43 +2026,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "peer": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "peer": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { "node": ">=6" } @@ -5430,6 +2039,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, "engines": { "node": ">=6" } @@ -5451,26 +2061,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001662", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", - "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -5481,6 +2071,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5496,6 +2087,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5518,66 +2110,11 @@ "node": ">=10" } }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chrome-launcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chromium-edge-launcher": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "node_modules/chromium-edge-launcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true }, "node_modules/clean-stack": { "version": "2.2.0", @@ -5592,6 +2129,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -5599,18 +2137,6 @@ "node": ">=8" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -5624,6 +2150,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -5637,6 +2164,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, "engines": { "node": ">=0.8" } @@ -5645,6 +2173,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -5658,6 +2187,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -5690,6 +2220,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5700,7 +2231,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/colorette": { "version": "2.0.20", @@ -5725,6 +2257,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5732,12 +2265,6 @@ "node": ">= 0.8" } }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "peer": true - }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -5747,12 +2274,6 @@ "node": ">=14" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "peer": true - }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -5775,67 +2296,17 @@ "node": ">=8" } }, - "node_modules/compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "peer": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "peer": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/concat-stream": { "version": "2.0.0", @@ -5889,36 +2360,6 @@ "proto-list": "~1.2.1" } }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -6059,29 +2500,11 @@ "node": ">=10" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "peer": true - }, - "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", - "peer": true, - "dependencies": { - "browserslist": "^4.23.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -6103,6 +2526,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6209,16 +2633,11 @@ "node": "*" } }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "peer": true - }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -6245,6 +2664,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6289,19 +2709,11 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, "dependencies": { "clone": "^1.0.2" }, @@ -6347,6 +2759,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -6357,37 +2770,12 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, - "node_modules/denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", - "peer": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "peer": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -6397,12 +2785,6 @@ "node": ">=8" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "peer": true - }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -6446,12 +2828,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/easy-crc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/easy-crc/-/easy-crc-1.1.0.tgz", - "integrity": "sha512-cvtERLTu8mYt1pOVVekJ4E0VdwyuKgL+VAfE3LY+Lw762i9M1bSEikm6fyGD2grxOdBfI0HgOmSi3HQneKr33A==", - "peer": true - }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -6468,36 +2844,17 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "peer": true - }, - "node_modules/electron-to-chromium": { - "version": "1.5.25", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", - "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", - "peer": true - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "peer": true, - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -6507,6 +2864,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -6532,6 +2890,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, "engines": { "node": ">=6" } @@ -6540,6 +2899,7 @@ "version": "7.13.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "dev": true, "bin": { "envinfo": "dist/cli.js" }, @@ -6557,32 +2917,11 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "peer": true, - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "peer": true, - "dependencies": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -6717,83 +3056,31 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "peer": true - }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -6812,12 +3099,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "peer": true - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6853,16 +3134,11 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-defer": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/fast-defer/-/fast-defer-1.1.8.tgz", - "integrity": "sha512-lEJeOH5VL5R09j6AA0D4Uvq7AgsHw0dAImQQ+F3iSyHZuAxyQfWobsagGpTcOPvJr3urmKRHrs+Gs9hV+/Qm/Q==", - "peer": true - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6880,28 +3156,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fast-xml-parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", - "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "peer": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -6915,19 +3169,11 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "peer": true, - "dependencies": { - "bser": "2.1.1" - } - }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -6947,6 +3193,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6963,161 +3210,11 @@ "node": ">=0.10.0" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "peer": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "peer": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "peer": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "peer": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "peer": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -7153,41 +3250,6 @@ "flat": "cli.js" } }, - "node_modules/flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "peer": true - }, - "node_modules/flow-parser": { - "version": "0.246.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.246.0.tgz", - "integrity": "sha512-WHRizzSrWFTcKo7cVcbP3wzZVhzsoYxoWqbnH4z+JXGqrjVmnsld6kBZWVlB200PwD5ur8r+HV3KUDxv3cHhOQ==", - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "peer": true, - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -7220,15 +3282,6 @@ "node": ">= 0.12" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -7259,26 +3312,14 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7380,19 +3421,11 @@ "node": ">=0.10.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -7525,6 +3558,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, "engines": { "node": ">=10" }, @@ -7657,6 +3691,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7676,6 +3711,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -7683,15 +3719,6 @@ "node": ">= 6" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -7743,7 +3770,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/handlebars": { "version": "4.7.8", @@ -7811,6 +3839,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -7876,6 +3905,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -7883,21 +3913,6 @@ "node": ">= 0.4" } }, - "node_modules/hermes-estree": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.22.0.tgz", - "integrity": "sha512-FLBt5X9OfA8BERUdc6aZS36Xz3rRuB0Y/mfocSADWEJfomc1xfene33GdyAmtTkKTBXTN/EgAy+rjTKkkZJHlw==", - "peer": true - }, - "node_modules/hermes-parser": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.22.0.tgz", - "integrity": "sha512-gn5RfZiEXCsIWsFGsKiykekktUoh0PdFWYocXsUdZIyWSckT6UIyPcyyUIPSR3kpnELWeK3n3ztAse7Mat6PSA==", - "peer": true, - "dependencies": { - "hermes-estree": "0.22.0" - } - }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -7916,31 +3931,6 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "peer": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -7987,6 +3977,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, "engines": { "node": ">=10.17.0" } @@ -8042,26 +4033,6 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -8080,35 +4051,11 @@ "minimatch": "^3.0.4" } }, - "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", - "peer": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/immer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8207,6 +4154,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -8231,6 +4179,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8239,7 +4188,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/ini": { "version": "1.3.8", @@ -8323,15 +4273,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/int64-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", - "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==", - "peer": true, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -8355,15 +4296,6 @@ "node": ">=10.13.0" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -8396,7 +4328,8 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-bigint": { "version": "1.0.4", @@ -8454,6 +4387,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -8491,34 +4425,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "peer": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8527,6 +4438,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -8535,6 +4447,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -8542,15 +4455,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -8573,6 +4477,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -8663,6 +4568,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "engines": { "node": ">=8" }, @@ -8679,356 +4585,104 @@ "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "peer": true - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "peer": true, - "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "peer": true, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "peer": true, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "text-extensions": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "peer": true - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "peer": true, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "which-typed-array": "^1.1.14" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "peer": true, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "peer": true + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/jsbn": { "version": "1.1.0", @@ -9036,83 +4690,17 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true }, - "node_modules/jsc-android": { - "version": "250231.0.0", - "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", - "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", - "peer": true - }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "peer": true - }, - "node_modules/jscodeshift": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", - "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", - "peer": true, - "dependencies": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.21.0", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/jscodeshift/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema": { "version": "0.4.0", @@ -9132,18 +4720,6 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "peer": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -9200,19 +4776,11 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/lerna": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/lerna/-/lerna-4.0.0.tgz", @@ -9245,15 +4813,6 @@ "node": ">= 10.18.0" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/libnpmaccess": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-4.0.3.tgz", @@ -9401,35 +4960,11 @@ "node": ">= 10" } }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "peer": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/load-json-file": { "version": "6.2.0", @@ -9459,6 +4994,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -9477,205 +5013,33 @@ }, "node_modules/lodash._reinterpolate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "peer": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logkitty": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "peer": true, - "dependencies": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.0" - }, - "bin": { - "logkitty": "bin/logkitty.js" - } - }, - "node_modules/logkitty/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/logkitty/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logkitty/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "peer": true - }, - "node_modules/logkitty/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "peer": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true }, - "node_modules/logkitty/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "peer": true, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "peer": true, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "lodash._reinterpolate": "^3.0.0" } }, "node_modules/lru-cache": { @@ -9740,15 +5104,6 @@ "node": ">= 10" } }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "peer": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -9761,28 +5116,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "peer": true - }, - "node_modules/match-sorter": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", - "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.23.8", - "remove-accents": "0.5.0" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "peer": true - }, "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", @@ -9836,664 +5169,139 @@ "p-locate": "^4.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-options": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", - "peer": true, - "dependencies": { - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-options/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/metro": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.12.tgz", - "integrity": "sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.23.1", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.6.3", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.80.12", - "metro-cache": "0.80.12", - "metro-cache-key": "0.80.12", - "metro-config": "0.80.12", - "metro-core": "0.80.12", - "metro-file-map": "0.80.12", - "metro-resolver": "0.80.12", - "metro-runtime": "0.80.12", - "metro-source-map": "0.80.12", - "metro-symbolicate": "0.80.12", - "metro-transform-plugins": "0.80.12", - "metro-transform-worker": "0.80.12", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz", - "integrity": "sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg==", - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.23.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", - "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", - "peer": true - }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", - "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", - "peer": true, - "dependencies": { - "hermes-estree": "0.23.1" - } - }, - "node_modules/metro-cache": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.12.tgz", - "integrity": "sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA==", - "peer": true, - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "metro-core": "0.80.12" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-cache-key": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.12.tgz", - "integrity": "sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-config": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.12.tgz", - "integrity": "sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ==", - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.6.3", - "metro": "0.80.12", - "metro-cache": "0.80.12", - "metro-core": "0.80.12", - "metro-runtime": "0.80.12" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/metro-config/node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "peer": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "peer": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/metro-config/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "peer": true - }, - "node_modules/metro-core": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.12.tgz", - "integrity": "sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.80.12" - }, - "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/metro-file-map": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.12.tgz", - "integrity": "sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw==", - "peer": true, + "node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { - "anymatch": "^3.0.3", - "debug": "^2.2.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.6.3", - "micromatch": "^4.0.4", - "node-abort-controller": "^3.1.1", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" + "p-try": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=6" }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/metro-file-map/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/metro-file-map/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/metro-minify-terser": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz", - "integrity": "sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ==", - "peer": true, + "node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/metro-resolver": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.12.tgz", - "integrity": "sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw==", - "peer": true, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, "dependencies": { - "flow-enums-runtime": "^0.0.6" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/metro-runtime": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.12.tgz", - "integrity": "sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw==", - "peer": true, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=18" - } - }, - "node_modules/metro-source-map": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.12.tgz", - "integrity": "sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.80.12", - "nullthrows": "^1.1.1", - "ob1": "0.80.12", - "source-map": "^0.5.6", - "vlq": "^1.0.0" + "node": ">=8" }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/metro-symbolicate": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz", - "integrity": "sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.80.12", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/metro-symbolicate/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "peer": true - }, - "node_modules/metro-symbolicate/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "peer": true, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/metro-symbolicate/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true - }, - "node_modules/metro-symbolicate/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "peer": true, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-symbolicate/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "node": ">=8" } }, - "node_modules/metro-symbolicate/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "peer": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/metro-transform-plugins": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz", - "integrity": "sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA==", - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, "engines": { - "node": ">=18" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz", - "integrity": "sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA==", - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "flow-enums-runtime": "^0.0.6", - "metro": "0.80.12", - "metro-babel-transformer": "0.80.12", - "metro-cache": "0.80.12", - "metro-cache-key": "0.80.12", - "metro-minify-terser": "0.80.12", - "metro-source-map": "0.80.12", - "metro-transform-plugins": "0.80.12", - "nullthrows": "^1.1.1" + "node": ">=10" }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", - "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", - "peer": true - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", - "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", - "peer": true, - "dependencies": { - "hermes-estree": "0.23.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/metro/node_modules/ms": { + "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/metro/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "peer": true, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">= 8" } }, "node_modules/micromatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -10502,28 +5310,11 @@ "node": ">=8.6" } }, - "node_modules/microseconds": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", - "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==", - "peer": true - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -10532,6 +5323,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -10543,6 +5335,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } @@ -10560,6 +5353,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10571,6 +5365,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10693,6 +5488,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -10726,7 +5522,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/multimatch": { "version": "5.0.0", @@ -10762,19 +5559,11 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/nano-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", - "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", - "peer": true, - "dependencies": { - "big-integer": "^1.6.16" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -10782,39 +5571,14 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/nocache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", - "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", - "peer": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "peer": true - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "peer": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10833,31 +5597,25 @@ "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "peer": true, - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-gyp": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz", @@ -10987,31 +5745,6 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "peer": true - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "peer": true - }, - "node_modules/node-stream-zip": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "peer": true, - "engines": { - "node": ">=0.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/antelle" - } - }, "node_modules/nopt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", @@ -11040,15 +5773,6 @@ "node": ">=10" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -11184,6 +5908,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -11204,12 +5929,6 @@ "set-blocking": "~2.0.0" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "peer": true - }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -11228,18 +5947,6 @@ "node": "*" } }, - "node_modules/ob1": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.12.tgz", - "integrity": "sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11249,12 +5956,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-code": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.3.tgz", - "integrity": "sha512-/Ds4Xd5xzrtUOJ+xJQ57iAy0BZsZltOHssnDgcZ8DOhgh41q1YJCnTPnWdWSLkNGNnxYzhYChjc5dgC9mEERCA==", - "peer": true - }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -11312,37 +6013,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/oblivious-set": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", - "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", - "peer": true - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } @@ -11351,35 +6026,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "peer": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/open/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "peer": true, + }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/opencollective-postinstall": { @@ -11391,29 +6046,6 @@ "opencollective-postinstall": "index.js" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "peer": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -11456,6 +6088,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -11470,6 +6103,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -11557,6 +6191,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } @@ -11671,6 +6306,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -11682,6 +6318,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -11731,19 +6368,11 @@ "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", "dev": true }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -11752,6 +6381,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11760,6 +6390,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -11767,7 +6398,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-type": { "version": "4.0.0", @@ -11787,12 +6419,14 @@ "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -11812,15 +6446,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "peer": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", @@ -11851,59 +6476,11 @@ "node": ">= 0.4" } }, - "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "peer": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/pretty-format/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/pretty-format/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -11924,19 +6501,6 @@ "node": ">=10" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "peer": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/promzard": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", @@ -11958,12 +6522,6 @@ "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "peer": true - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -12022,19 +6580,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "peer": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -12059,198 +6609,6 @@ "node": ">=8" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-devtools-core": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.3.1.tgz", - "integrity": "sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw==", - "peer": true, - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "peer": true - }, - "node_modules/react-native": { - "version": "0.75.3", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.75.3.tgz", - "integrity": "sha512-+Ne6u5H+tPo36sme19SCd1u2UID2uo0J/XzAJarxmrDj4Nsdi44eyUDKtQHmhgxjRGsuVJqAYrMK0abLSq8AHw==", - "peer": true, - "dependencies": { - "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "14.1.0", - "@react-native-community/cli-platform-android": "14.1.0", - "@react-native-community/cli-platform-ios": "14.1.0", - "@react-native/assets-registry": "0.75.3", - "@react-native/codegen": "0.75.3", - "@react-native/community-cli-plugin": "0.75.3", - "@react-native/gradle-plugin": "0.75.3", - "@react-native/js-polyfills": "0.75.3", - "@react-native/normalize-colors": "0.75.3", - "@react-native/virtualized-lists": "0.75.3", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "base64-js": "^1.5.1", - "chalk": "^4.0.0", - "commander": "^9.4.1", - "event-target-shim": "^5.0.1", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jest-environment-node": "^29.6.3", - "jsc-android": "^250231.0.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.80.3", - "metro-source-map": "^0.80.3", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", - "promise": "^8.3.0", - "react-devtools-core": "^5.3.1", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.24.0-canary-efb381bbf-20230505", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.2", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.2.6", - "react": "^18.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-native-mmkv": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/react-native-mmkv/-/react-native-mmkv-2.12.2.tgz", - "integrity": "sha512-6058Aq0p57chPrUutLGe9fYoiDVDNMU2PKV+lLFUJ3GhoHvUrLdsS1PDSCLr00yqzL4WJQ7TTzH+V8cpyrNcfg==", - "peer": true, - "peerDependencies": { - "react": "*", - "react-native": ">=0.71.0" - } - }, - "node_modules/react-native/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "peer": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/react-native/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/react-native/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "peer": true - }, - "node_modules/react-query": { - "version": "3.39.3", - "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", - "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "broadcast-channel": "^3.4.1", - "match-sorter": "^6.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -12533,6 +6891,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12555,27 +6914,6 @@ "once": "^1.3.0" } }, - "node_modules/readline": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", - "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "peer": true - }, - "node_modules/recast": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", - "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", - "peer": true, - "dependencies": { - "ast-types": "0.15.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -12601,37 +6939,11 @@ "node": ">=8" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "peer": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "peer": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", @@ -12651,50 +6963,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "peer": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "peer": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remove-accents": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", - "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", - "peer": true - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -12740,20 +7008,16 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "peer": true - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -12791,6 +7055,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -12799,6 +7064,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -12820,6 +7086,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -12830,6 +7097,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -12853,6 +7121,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -12875,6 +7144,7 @@ "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, "dependencies": { "tslib": "^2.1.0" } @@ -12901,6 +7171,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -12933,178 +7204,47 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "node_modules/scheduler": { - "version": "0.24.0-canary-efb381bbf-20230505", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", - "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "peer": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true - }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "peer": true + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "peer": true, + "node_modules/semver-regex": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "peer": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "node": ">=8" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "peer": true, - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "node_modules/set-function-length": { "version": "1.2.2", @@ -13138,16 +7278,11 @@ "node": ">= 0.4" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "peer": true - }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, "dependencies": { "kind-of": "^6.0.2" }, @@ -13159,6 +7294,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -13170,6 +7306,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -13178,6 +7315,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13203,72 +7341,18 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "peer": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", @@ -13344,20 +7428,11 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -13475,63 +7550,6 @@ "node": ">= 8" } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "peer": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "peer": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "peer": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -13545,6 +7563,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -13553,6 +7572,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -13615,6 +7635,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13635,6 +7656,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, "engines": { "node": ">=6" } @@ -13651,12 +7673,6 @@ "node": ">=8" } }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "peer": true - }, "node_modules/strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -13674,16 +7690,11 @@ "node": ">=4" } }, - "node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "peer": true - }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13698,6 +7709,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -13740,18 +7752,6 @@ "node": ">=8" } }, - "node_modules/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "peer": true, - "dependencies": { - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", @@ -13777,43 +7777,6 @@ "node": ">=8" } }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/terser": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", - "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "peer": true - }, "node_modules/text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -13823,12 +7786,6 @@ "node": ">=0.10" } }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "peer": true - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -13856,25 +7813,11 @@ "node": ">=0.6.0" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "peer": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -13882,15 +7825,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -13966,7 +7900,8 @@ "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -13986,15 +7921,6 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -14099,7 +8025,7 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "devOptional": true, + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14152,52 +8078,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "peer": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "peer": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -14231,25 +8111,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unload": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", - "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.6.2", - "detect-node": "^2.0.4" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/upath": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", @@ -14260,36 +8121,6 @@ "yarn": "*" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -14302,7 +8133,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/util-promisify": { "version": "2.1.0", @@ -14313,15 +8145,6 @@ "object.getownpropertydescriptors": "^2.0.3" } }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "peer": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -14351,15 +8174,6 @@ "builtins": "^1.0.3" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -14374,25 +8188,11 @@ "extsprintf": "^1.2.0" } }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "peer": true - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "peer": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, "dependencies": { "defaults": "^1.0.3" } @@ -14465,12 +8265,6 @@ "node": ">=10.0.0" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "peer": true - }, "node_modules/whatwg-url": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", @@ -14489,6 +8283,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -14515,12 +8310,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "peer": true - }, "node_modules/which-pm-runs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", @@ -14574,6 +8363,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -14589,7 +8379,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -14735,19 +8526,11 @@ "node": ">=6" } }, - "node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, "engines": { "node": ">=0.4" } @@ -14756,6 +8539,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "engines": { "node": ">=10" } @@ -14779,6 +8563,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -14805,6 +8590,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "engines": { "node": ">=12" } @@ -14813,21 +8599,13 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/HeaderPrice.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/HeaderPrice.tsx new file mode 100644 index 0000000000..e8f8e3496d --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/HeaderPrice.tsx @@ -0,0 +1,28 @@ +import { Skeleton, Typography } from '@mui/material'; +import BigNumber from 'bignumber.js'; +import React from 'react'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; + +export const HeaderPrice = ({ isLoading = false }) => { + const { accountPair } = usePortfolio(); + + if (isLoading) { + return ; + } + + return ( + + {accountPair?.to.value} {accountPair?.to.name} + + ); +}; + +export function formatValue(value: BigNumber): string { + if (value.isZero()) { + return '0'; + } + if (value.abs().lt(1)) { + return value.toFormat(6); + } + return value.toFixed(2); +} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index e86cfe9433..d3155687c2 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -4,10 +4,22 @@ import { SearchInput, Skeleton, Tooltip } from '../../../../components'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import { WalletBalance } from '../../../../types/currrentWallet'; import { usePortfolio } from '../../module/PortfolioContextProvider'; +import { usePortfolioTokenActivity } from '../../module/PortfolioTokenActivityProvider'; import { formatPriceChange, priceChange } from '../helpers/priceChange'; import { useStrings } from '../hooks/useStrings'; +import { HeaderPrice } from './HeaderPrice'; import PnlTag from './PlnTag'; +export function formatValue(value: BigNumber): string { + if (value.isZero()) { + return '0'; + } + if (value.abs().lt(1)) { + return value.toFormat(6); + } + return value.toFixed(2); +} + interface Props { walletBalance: WalletBalance; setKeyword: (keyword: string) => void; @@ -18,29 +30,66 @@ interface Props { const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: Props): JSX.Element => { const strings = useStrings(); const theme: any = useTheme(); - const { unitOfAccount, changeUnitOfAccountPair, accountPair } = usePortfolio(); + const { unitOfAccount, changeUnitOfAccountPair, accountPair, primaryTokenInfo } = usePortfolio(); + const { tokenActivity } = usePortfolioTokenActivity(); const { - ptActivity: { close, open }, + currency: selectedCurrency, + + ptActivity: { open, close: ptPrice }, config, } = useCurrencyPairing(); - const { changeValue, changePercent, variantPnl } = priceChange(open, close); + const { changeValue, changePercent, variantPnl } = priceChange(open, ptPrice); + + const showADA = accountPair?.from.name === 'ADA'; + + const totalTokenPrice = React.useMemo(() => { + // const tokenPrice = tokenActivity?.data24h[amount?.info.id]?.price.close; + const showingAda = accountPair?.from.name !== 'ADA'; + const currency = showingAda ? primaryTokenInfo.ticker : unitOfAccount; + const decimals = showingAda ? primaryTokenInfo.decimals : config.decimals; + + if (ptPrice == null) return `... ${currency}`; + + console.log('DATATA', { + // tokenPrice, + showingAda, + currency, + quantity: primaryTokenInfo.quantity, + ptPrice, + unitOfAccount, + decimals, + }); + + const totalAmount = formatValue(primaryTokenInfo.quantity.multipliedBy(String(ptPrice))); + + return totalAmount; + }, [tokenActivity, selectedCurrency, config.decimals, ptPrice]); const handleCurrencyChange = () => { - if (unitOfAccount !== accountPair?.from.name) { - changeUnitOfAccountPair({ - from: { name: unitOfAccount || 'USD', value: walletBalance.fiatAmount }, - to: { name: 'ADA', value: walletBalance.ada }, - }); - } else { - changeUnitOfAccountPair({ - from: { name: 'ADA', value: walletBalance.ada }, - to: { name: unitOfAccount, value: walletBalance.fiatAmount }, - }); - } + changeUnitOfAccountPair({ + from: { name: showADA ? unitOfAccount : 'ADA', value: showADA ? totalTokenPrice : walletBalance.ada }, + to: { name: showADA ? 'ADA' : unitOfAccount, value: showADA ? walletBalance.ada : totalTokenPrice }, + }); }; + React.useEffect(() => { + changeUnitOfAccountPair({ + from: { name: 'ADA', value: walletBalance?.ada || '0' }, + to: { name: unitOfAccount || 'USD', value: totalTokenPrice || '0' }, + }); + }, [walletBalance, unitOfAccount, totalTokenPrice]); + + // const amount = React.useMemo( + // () => + // aggregatePrimaryAmount({ + // primaryTokenInfo, + // tokenActivity: tokenActivity.data24h, + // }), + // [primaryTokenInfo, tokenActivity, ptPrice] + // ); + return ( @@ -53,7 +102,9 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: )} - {accountPair?.from.name} + + {accountPair?.from.name} + - {isLoading ? ( + {/* {isLoading ? ( ) : ( - {accountPair?.to.value} {accountPair?.to.name} + {close.toFixed(config.decimals)} {unitOfAccount} - )} + )} */} + {isLoading ? ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/aggregatePrimaryAmount.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/aggregatePrimaryAmount.ts new file mode 100644 index 0000000000..7d6dc1439e --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/aggregatePrimaryAmount.ts @@ -0,0 +1,36 @@ +import { amountBreakdown } from '@yoroi/portfolio'; +import { PortfolioTokenAmountRecords } from '@yoroi/types/lib/typescript/portfolio/amount'; +import { PortfolioApiTokenActivityResponse } from '@yoroi/types/lib/typescript/portfolio/api'; +import { PortfolioTokenInfo } from '@yoroi/types/src/portfolio/info'; +import BigNumber from 'bignumber.js'; + +export const aggregatePrimaryAmount = ({ + primaryTokenInfo, + tokenAmountRecords, + tokenActivity, +}: { + primaryTokenInfo: PortfolioTokenInfo; + tokenAmountRecords?: PortfolioTokenAmountRecords; + tokenActivity?: PortfolioApiTokenActivityResponse; +}) => { + // @ts-ignore + if (!tokenAmountRecords) return { info: primaryTokenInfo, quantity: 0n }; + + return Object.values(tokenAmountRecords).reduce( + (totalAmount, tokenAmount) => { + const tokenPrimaryPrice = tokenActivity?.[tokenAmount.info.id]?.price.close ?? new BigNumber(0); + + const quantity = + tokenAmount.info.id === primaryTokenInfo.id + ? tokenAmount.quantity + : BigInt(amountBreakdown(tokenAmount).bn.times(tokenPrimaryPrice).shiftedBy(primaryTokenInfo.decimals).toFixed(0)); + totalAmount.quantity += quantity; + return totalAmount; + }, + { + info: primaryTokenInfo, + // @ts-ignore + quantity: 0n, + } + ); +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index 6b8a2791aa..408c0344e3 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -38,7 +38,7 @@ export const PortfolioContextProvider = ({ }, currentWallet, }: PortfolioProviderProps) => { - const { walletBalance, assetList, selectedWallet, networkId } = currentWallet; + const { walletBalance, assetList, selectedWallet, networkId, primaryTokenInfo } = currentWallet; if (selectedWallet === undefined) { return <>; } @@ -74,6 +74,7 @@ export const PortfolioContextProvider = ({ walletBalance, assetList: assetList || [], networkId, + primaryTokenInfo, }), [state, actions] ); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index a5ef788ab5..4653836528 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -57,30 +57,28 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { React.useEffect(() => { const listForActivity: any = assetList - .filter(item => item.policyId?.length > 0) - .map(item => `${item.policyId}.${item.assetName}`); // + .filter(item => item.info?.policyId?.length > 0) + .map(item => `${item.info?.policyId}.${item.assetName}`); // actions.secondaryTokenIdsChanged(listForActivity); queryClient.invalidateQueries([queryKey]); }, [actions, queryClient]); - // Use hook for each interval (24h, 1w, 1m) const { mutate: fetch24h, data: data24h, isLoading: loading24h } = useMultiTokenActivity('24h'); - // const { mutate: fetch1w, data: data1w, isLoading: loading1w } = useMultiTokenActivity('1w'); + const { mutate: fetch1w, data: data1w, isLoading: loading1w } = useMultiTokenActivity('7d'); + console.log('fetch1w', fetch1w); // const { mutate: fetch1m, data: data1m, isLoading: loading1m } = useMultiTokenActivity('1m'); - React.useEffect(() => { if (state.secondaryTokenIds.length > 0) { fetch24h(state.secondaryTokenIds); - // fetch1w(state.secondaryTokenIds); + fetch1w(state.secondaryTokenIds); // fetch1m(state.secondaryTokenIds); } }, [state.secondaryTokenIds, fetch24h]); React.useEffect(() => { if (data24h) { - console.log('data24h', data24h); const combinedData: any = { data24h: data24h, // '1w': data1w, diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx index 5d117c8590..6d117ad961 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx @@ -4,27 +4,19 @@ import React, { useEffect, useState } from 'react'; import PortfolioHeader from '../../common/components/PortfolioHeader'; import WelcomeBanner from '../../common/components/WelcomeBanner'; import { useStrings } from '../../common/hooks/useStrings'; -import { TokenType } from '../../common/types/index'; import { usePortfolio } from '../../module/PortfolioContextProvider'; import StatsTable from './StatsTable'; const PortfolioWallet = (): JSX.Element => { const theme = useTheme(); const strings = useStrings(); - const { walletBalance, assetList, changeUnitOfAccountPair, unitOfAccount } = usePortfolio(); + const { walletBalance, assetList } = usePortfolio(); const [keyword, setKeyword] = useState(''); const [isLoading, _] = useState(false); - const [tokenList, setTokenList] = useState(assetList); + const [tokenList, setTokenList] = useState(assetList); const isShownWelcomeBanner: boolean = assetList.length === 1; // assumming only have ADA as default -> first time user - useEffect(() => { - changeUnitOfAccountPair({ - from: { name: 'ADA', value: walletBalance?.ada || '0' }, - to: { name: unitOfAccount || 'USD', value: walletBalance?.fiatAmount || '0' }, - }); - }, [walletBalance, unitOfAccount]); - useEffect(() => { if (isShownWelcomeBanner) return; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index a227bf18e2..e7e8f13f12 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -36,7 +36,6 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { order: null, orderBy: null, }); - const list = useMemo(() => [...data], [data]); const { @@ -69,7 +68,6 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { // TODO refactor and add calculation based on fiat toatl value - endpoint not working const procentageData = useTokenPercentages(data); - return (
{ - {data24h === null ? ( + {data24h === null || ptActivity === null ? ( ) : ( @@ -131,7 +129,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { @@ -140,12 +138,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { {data24h === null ? ( ) : ( - + )} @@ -182,6 +175,9 @@ const TokenDisplay = ({ token }) => { }; const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, isPrimaryToken }) => { + if (secondaryTokenActivity === undefined) { + return ; + } const { close, open } = isPrimaryToken ? primaryTokenActivity : secondaryTokenActivity?.length && secondaryTokenActivity[1].price; @@ -195,55 +191,49 @@ const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, is ); }; -const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { +const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { const theme: any = useTheme(); - const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; + const { accountPair, primaryTokenInfo } = usePortfolio(); + + if (secondaryToken24Activity === undefined) { + return ; + } const { - currency: selectedCurrency, - config, ptActivity: { close: ptPrice }, } = useCurrencyPairing(); - // const showingAda = isPrimaryTokenActive && amount.info.id !== portfolioPrimaryTokenInfo.id; - const showingAda = accountPair?.from.name === 'ADA'; + const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; + const tokenQuantityAsBigInt = bigNumberToBigInt(token.quantity); - const currency = selectedCurrency; - const decimals = config.decimals; + const showingAda = accountPair?.from.name === 'ADA'; + const currency = accountPair?.from.name; + const decimals = showingAda ? primaryTokenInfo.decimals : token.info.numberOfDecimals; + if (token.name === 'INDY') { + console.log('@@@@@@@tokenPrice', { + id: token.info.id, + name: token.name, + token, + tokenPrice, + currency: accountPair?.from.name, + tokenQuantity: tokenQuantityAsBigInt, + ptPrice, + decimals, + }); + } if (ptPrice == null) return `... ${currency}`; - // if (!isPrimaryToken(amount.info) && tokenPrice == null) return `—— ${currency}`; - - // if (hidePrimaryPair && isPrimaryToken(amount.info) && isPrimaryTokenActive) return ''; - - // Assuming token.quantity is a BigNumber and token.numberOfDecimals represents the number of decimals - const decimalPlaces = token.numberOfDecimals; - - // Multiply the BigNumber by 10^decimalPlaces to shift the decimals - const shiftedBigNumber = token.quantity.times(BigNumber(10).pow(decimalPlaces)); // Stay in BigNumber realm - - // Convert to bigint - const bigIntValue = BigInt(shiftedBigNumber.toString(10)); // Convert BigNumber to string, then to BigInt + const totalTokenPrice = atomicBreakdown(tokenQuantityAsBigInt, decimals) + .bn.times(tokenPrice ?? 1) + .times(showingAda ? 1 : String(ptPrice)) + .toFormat(decimals); - // Ensure tokenPrice and ptPrice are BigNumber instances and convert if needed - const safeTokenPrice = BigNumber.isBigNumber(tokenPrice) ? tokenPrice : new BigNumber(tokenPrice ?? '1'); - const safePtPrice = BigNumber.isBigNumber(ptPrice) ? ptPrice : new BigNumber(ptPrice ?? '1'); + // const totalTokenPrice2 = calculateTokenValueWithPrecision(token.quantity, String(tokenPrice), decimals); - // Now, pass the bigIntValue to atomicBreakdown - const price = `${atomicBreakdown(bigIntValue, token.numberOfDecimals) - .bn.times(safeTokenPrice) // BigNumber operation - .times(showingAda ? 1 : safePtPrice) // BigNumber operation - .toFormat(decimals)} ${currency}`; - - // console.log('token', { - // name: token.name, - // quantity: token.quantity, - // tokenCALCULATEDFINALPrice: price, - // selectedCurrency, - // tokenPrice: tokenPrice, - // showingAda, - // }); + if (token.name === 'INDY') { + console.log('newTotalPrice', { totalTokenPrice, tokenQuantityAsBigInt }); + } return ( @@ -255,7 +245,7 @@ const TokenPriceTotal = ({ token, accountPair, secondaryToken24Activity }) => { ) : ( - {price} + {totalTokenPrice} {accountPair?.from.name || 'USD'} )} @@ -309,3 +299,36 @@ const TokenChip = ({ token }) => { /> ); }; + +export function formatValue(value: BigNumber): string { + if (value.isZero()) { + return '0'; + } + if (value.abs().lt(1)) { + return value.toFormat(6); + } + return value.toFixed(2); +} + +function calculateTokenValueWithPrecision(quantity: BigNumber, price: string, decimals: number): string { + // Convert price to BigNumber for accurate multiplication + const bigPrice = new BigNumber(price); + + // Multiply quantity by price + const totalValue = quantity.multipliedBy(bigPrice); + + // Round the result to the specified number of decimals + const totalValueWithPrecision = totalValue.decimalPlaces(decimals); + + return totalValueWithPrecision.toFixed(decimals); +} + +function bigNumberToBigInt(bn: BigNumber): bigint { + // Convert BigNumber to a string representation of a whole number + const wholeNumberString = bn.toFixed(0); // 0 means no decimals + + // Convert the string to BigInt + const bigIntValue = BigInt(wholeNumberString); + + return bigIntValue; +} diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index 831ce803e4..cd91ff6f88 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -8,6 +8,25 @@ import { calculateAndFormatValue } from '../../utils/unit-of-account'; import { cardanoAdaBase64Logo } from '../features/portfolio/common/helpers/constants'; import { CurrentWalletType } from '../types/currrentWallet'; +// TODO To be added and constructed from wallet apo +const primaryTokenFullInfo = { + application: 'coin', + decimals: 6, + description: 'Cardano', + fingerprint: '', + id: '.', + name: 'ADA', + nature: 'primary', + originalImage: '', + reference: '', + status: 'valid', + symbol: '₳', + tag: '', + ticker: 'ADA', + type: 'ft', + website: 'https://www.cardano.org/', +}; + export const mapStakingKeyStateToGovernanceAction = (state: any) => { if (!state.drepDelegation) return null; const vote = state.drepDelegation; @@ -101,7 +120,7 @@ const getAssetWalletAssetList = (stores: any) => { price: fiatPrice, // TODO new structure here - quantity: token.entry.amount, + quantity: asQuantity(token.entry.amount), id: tokenId, info: { id: token.entry.identifier, @@ -109,6 +128,7 @@ const getAssetWalletAssetList = (stores: any) => { policyId: token.info.Metadata.policyId, fingerprint: tokenId, metadata: extractMetadataInfo({ metadata: token.info.Metadata?.assetMintMetadata?.[0] || null }), + numberOfDecimals, }, // TODO - refactor and add here any formated data/utils for token // utils: { @@ -176,9 +196,7 @@ export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undef const { currency } = profile.unitOfAccount; const getFiatCurrentPrice = coinPriceStore?.getCurrentPrice; const fiatPrice = getFiatCurrentPrice(ticker, currency === null ? 'USD' : currency); - // if (fiatPrice === null) { - // return; - // } + const fiatDisplay = calculateAndFormatValue(Number(shiftedAmount), fiatPrice); const isHardware: boolean = selectedWallet.isHardware; @@ -201,11 +219,12 @@ export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undef backendService: BackendService, backendServiceZero: BackendServiceZero, isHardwareWallet: isHardware, - primaryTokenInfo: tokenInfo, + // primaryTokenInfo: stores.tokenInfoStore.getDefaultTokenInfoSummary(networkId), + primaryTokenInfo: { ...primaryTokenFullInfo, quantity: shiftedAmount }, stakingAddress: selectedWallet.stakingAddress, walletBalance: { ada: `${beforeDecimalRewards}${afterDecimalRewards}`, - fiatAmount: fiatDisplay || 0, + fiatAmount: fiatDisplay || 0, // to be removed currency: currency === null ? 'USD' : currency, }, assetList: assetList, @@ -216,13 +235,13 @@ export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undef } }; -// export const asQuantity = (value: BigNumber | number | string) => { -// const bn = new BigNumber(value); -// if (bn.isNaN() || !bn.isFinite()) { -// throw new Error('Invalid quantity'); -// } -// return bn; -// }; +export const asQuantity = (value: BigNumber | number | string) => { + const bn = new BigNumber(value); + if (bn.isNaN() || !bn.isFinite()) { + throw new Error('Invalid quantity'); + } + return bn; +}; type Metadata = { metadata?: { diff --git a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts index 42929ae633..6756f948a2 100644 --- a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts +++ b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts @@ -20,6 +20,7 @@ export const useMultiTokenActivity = ( Accept: 'application/json', }, }); + console.log('tokenActivityresponse', { interval, response }); return response.data; }; diff --git a/packages/yoroi-extension/package-lock.json b/packages/yoroi-extension/package-lock.json index 987e2595c7..16de89a899 100644 --- a/packages/yoroi-extension/package-lock.json +++ b/packages/yoroi-extension/package-lock.json @@ -30,10 +30,12 @@ "@mui/x-date-pickers": "^5.0.8", "@svgr/webpack": "5.5.0", "@yoroi/exchange": "2.0.1", + "@yoroi/explorers": "^1.0.2", + "@yoroi/portfolio": "1.0.3", "@yoroi/resolver": "2.0.2", "@yoroi/staking": "^1.5.1", "@yoroi/swap": "1.5.2", - "@yoroi/types": "1.5.4", + "@yoroi/types": "1.5.7", "assert": "2.1.0", "async-await-queue": "2.1.4", "axios": "0.21.1", @@ -118,7 +120,9 @@ "@types/chrome": "^0.0.268", "@types/react-intl": "^3.0.0", "@types/react-router-dom": "^5.3.3", - "@yoroi/common": "1.5.0", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", + "@yoroi/common": "1.5.4", "autoprefixer": "10.2.4", "babel-eslint": "11.0.0-beta.2", "babel-jest": "26.6.3", @@ -2761,6 +2765,42 @@ "node": ">= 6" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", @@ -6973,6 +7013,233 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", + "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/type-utils": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", + "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", + "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", + "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", + "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", + "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", + "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", + "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.6.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", @@ -7194,6 +7461,23 @@ "blake2b": "2.1.3" } }, + "node_modules/@yoroi/api/node_modules/@yoroi/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.0.tgz", + "integrity": "sha512-MSKqDSGQ8Iv18f2KCxkIl+I+nPHLww/2Y1jBiHvgaSEQ6MoN6rZsV+CIoPorSAhcc/mIiWX7gl3sdfU7trsiUQ==", + "dependencies": { + "axios": "^1.5.0", + "zod": "^3.22.1" + }, + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", + "react": ">= 16.8.0 <= 19.0.0", + "react-query": "^3.39.3" + } + }, "node_modules/@yoroi/api/node_modules/axios": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", @@ -7240,43 +7524,23 @@ "integrity": "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==" }, "node_modules/@yoroi/common": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.0.tgz", - "integrity": "sha512-MSKqDSGQ8Iv18f2KCxkIl+I+nPHLww/2Y1jBiHvgaSEQ6MoN6rZsV+CIoPorSAhcc/mIiWX7gl3sdfU7trsiUQ==", - "dependencies": { - "axios": "^1.5.0", - "zod": "^3.22.1" - }, + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.4.tgz", + "integrity": "sha512-Bh5MXDSX8UHenJIP8w6OJj+WWGRcTUjtY/dTiwPhXyvQpvUMg5wmU7iWNhKscpE4OaxCwPb9v4CzKnuTtR034Q==", + "dev": true, "engines": { "node": ">= 16.19.0" }, "peerDependencies": { "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", + "axios": "^1.5.0", + "bignumber.js": "^9.0.1", + "immer": "^10.0.3", "react": ">= 16.8.0 <= 19.0.0", - "react-query": "^3.39.3" - } - }, - "node_modules/@yoroi/common/node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@yoroi/common/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "react-native-mmkv": "^2.11.0", + "react-query": "^3.39.3", + "rxjs": "^7.8.1", + "zod": "^3.22.1" } }, "node_modules/@yoroi/exchange": { @@ -7321,6 +7585,52 @@ "zod": "^3.22.1" } }, + "node_modules/@yoroi/exchange/node_modules/@yoroi/types": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-1.5.4.tgz", + "integrity": "sha512-Hk3YHG6glQcStNjkwgDI+pWfLNfFGk+N3Iz8Iv/t+8mVFU4tZy4ZQYwtx5IIRVTwrl62maGlH9/84rwXp2u3Yw==", + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "axios": "^1.5.0" + } + }, + "node_modules/@yoroi/explorers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@yoroi/explorers/-/explorers-1.0.2.tgz", + "integrity": "sha512-mVDbmBwINKPqFF+omupesdgzRb8z+h4iqwRvg1X/MzqiKsvBtYOmJQ6TTO7gol/aYLkAFv68na6Np53Azsg4gg==", + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@yoroi/common": "1.5.4", + "immer": "^10.0.3", + "react": ">= 16.8.0 <= 19.0.0", + "react-native-mmkv": "^2.11.0", + "react-query": "^3.39.3" + } + }, + "node_modules/@yoroi/portfolio": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yoroi/portfolio/-/portfolio-1.0.3.tgz", + "integrity": "sha512-7BIncMPBMmvkrlQMECKrf03LSIIw9ok+4em+pvSsFIkvxn4HBiVw/qd7RhchiPeb9KMQvff5r9gF27gpZhyQ1A==", + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "^1.19.3", + "@yoroi/api": "1.5.2", + "@yoroi/common": "1.5.4", + "bignumber.js": "^9.0.1", + "immer": "^10.0.3", + "react": ">= 16.8.0 <= 19.0.0", + "react-native-mmkv": "^2.11.0", + "react-query": "^3.39.3", + "rxjs": "^7.8.1", + "zod": "^3.22.2" + } + }, "node_modules/@yoroi/resolver": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@yoroi/resolver/-/resolver-2.0.2.tgz", @@ -7340,6 +7650,23 @@ "react-query": "^3.39.3" } }, + "node_modules/@yoroi/resolver/node_modules/@yoroi/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.0.tgz", + "integrity": "sha512-MSKqDSGQ8Iv18f2KCxkIl+I+nPHLww/2Y1jBiHvgaSEQ6MoN6rZsV+CIoPorSAhcc/mIiWX7gl3sdfU7trsiUQ==", + "dependencies": { + "axios": "^1.5.0", + "zod": "^3.22.1" + }, + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", + "react": ">= 16.8.0 <= 19.0.0", + "react-query": "^3.39.3" + } + }, "node_modules/@yoroi/resolver/node_modules/axios": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", @@ -7529,14 +7856,17 @@ "integrity": "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==" }, "node_modules/@yoroi/types": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-1.5.4.tgz", - "integrity": "sha512-Hk3YHG6glQcStNjkwgDI+pWfLNfFGk+N3Iz8Iv/t+8mVFU4tZy4ZQYwtx5IIRVTwrl62maGlH9/84rwXp2u3Yw==", + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-1.5.7.tgz", + "integrity": "sha512-qXyN4XTI80ucgQNhZ0juynd42dXdW+kg94FgFDRWAq+JiD6PRlLPMkgvWV3gEpTzPsuuEeEUXwsZRy/8/YMi0w==", "engines": { "node": ">= 16.19.0" }, "peerDependencies": { - "axios": "^1.5.0" + "@emurgo/yoroi-lib": "^1.0.1", + "axios": "^1.5.0", + "bignumber.js": "^9.0.1", + "rxjs": "^7.8.1" } }, "node_modules/abab": { @@ -15091,6 +15421,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/graphql": { "version": "15.8.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", @@ -26835,6 +27171,18 @@ "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-expect": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-expect/-/ts-expect-1.3.0.tgz", diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index afa1a0eff9..47054c0de2 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -170,7 +170,7 @@ "@yoroi/resolver": "2.0.2", "@yoroi/staking": "^1.5.1", "@yoroi/swap": "1.5.2", - "@yoroi/types": "1.5.7", + "@yoroi/types": "1.5.8", "@yoroi/explorers": "^1.0.2", "assert": "2.1.0", "async-await-queue": "2.1.4", From c5ae1d102de1396166fbb2d3fe41bbc4ff56077a Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 25 Sep 2024 11:47:17 +0300 Subject: [PATCH 25/58] fix styles --- .../portfolio/common/components/PlnTag.tsx | 46 +++++++++++++------ .../portfolio/useCases/Wallet/StatsTable.tsx | 4 +- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx index 05ab201ca5..ad2887c4d4 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx @@ -1,6 +1,4 @@ -import Box from '@mui/material/Box'; -import { styled } from '@mui/material/styles'; -import Typography from '@mui/material/Typography'; +import { Box, Typography, styled } from '@mui/material'; import React from 'react'; import { Icon } from '../../../../components'; @@ -11,17 +9,35 @@ interface Props { style?: React.CSSProperties; } +const IconWrapper = styled(Box)(({ theme, mode }) => ({ + height: '16px', + '& svg': { + '& path': { + fill: mode === 'success' ? theme.palette.ds.secondary_800 : theme.palette.ds.sys_magenta_700, + }, + }, +})); - -const PnlTag = ({ children, withIcon = false, variant = 'neutral', style, ...etc }: Props) => { - // const theme = useTheme(); - - const icon = variant === 'danger' ? : ; +const PnlTag = ({ children, withIcon = false, variant = 'neutral' }: Props) => { + const icon = + variant === 'danger' ? ( + + + + ) : variant === 'success' ? ( + + + + ) : ( + <> + ); return ( - + {withIcon && variant !== 'neutral' && icon} - {children} + + {children} + ); }; @@ -34,9 +50,11 @@ const TagContainer = styled(Box, { height: '25px', display: 'flex', alignItems: 'center', - borderRadius: '999px', - padding: '4px 6px', + justifyContent: 'center', + borderRadius: '20px', + padding: '4px 7px', backgroundColor: getBackgroundColor(theme, mode), + width: 'auto', })); const StyledTypography = styled(Typography, { @@ -44,8 +62,8 @@ const StyledTypography = styled(Typography, { })<{ mode: 'danger' | 'success' | 'neutral'; }>(({ theme, mode }) => ({ - // ...theme.typography.body2, color: getTextColor(theme, mode), + fontSize: '12px', })); const getBackgroundColor = (theme, mode) => { @@ -62,7 +80,7 @@ const getBackgroundColor = (theme, mode) => { const getTextColor = (theme, mode) => { switch (mode) { case 'success': - return theme.palette.ds.secondary_700; + return theme.palette.ds.secondary_800; case 'danger': return theme.palette.ds.sys_magenta_700; default: diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index e7e8f13f12..ea7ca38c6a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -106,7 +106,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { /> - + {data24h === null || ptActivity === null ? ( ) : ( @@ -186,7 +186,7 @@ const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, is return ( - {formatPriceChange(changePercent)}% + {formatPriceChange(changePercent)}% ); }; From e5d83b966655633242b73544a8ddf69b6449007d Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 25 Sep 2024 12:26:50 +0300 Subject: [PATCH 26/58] fix data display --- .../common/components/HeaderPrice.tsx | 11 --- .../portfolio/useCases/Wallet/StatsTable.tsx | 73 +++++-------------- 2 files changed, 17 insertions(+), 67 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/HeaderPrice.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/HeaderPrice.tsx index e8f8e3496d..84084cb3a9 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/HeaderPrice.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/HeaderPrice.tsx @@ -1,5 +1,4 @@ import { Skeleton, Typography } from '@mui/material'; -import BigNumber from 'bignumber.js'; import React from 'react'; import { usePortfolio } from '../../module/PortfolioContextProvider'; @@ -16,13 +15,3 @@ export const HeaderPrice = ({ isLoading = false }) => { ); }; - -export function formatValue(value: BigNumber): string { - if (value.isZero()) { - return '0'; - } - if (value.abs().lt(1)) { - return value.toFormat(6); - } - return value.toFixed(2); -} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index ea7ca38c6a..73faab6cad 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -106,14 +106,14 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { /> - + {data24h === null || ptActivity === null ? ( ) : ( )} @@ -175,14 +175,15 @@ const TokenDisplay = ({ token }) => { }; const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, isPrimaryToken }) => { - if (secondaryTokenActivity === undefined) { - return ; - } - const { close, open } = isPrimaryToken - ? primaryTokenActivity - : secondaryTokenActivity?.length && secondaryTokenActivity[1].price; + const tokenPriceClose = isPrimaryToken + ? primaryTokenActivity.close + : secondaryTokenActivity && secondaryTokenActivity[1].price.close; - const { changePercent, variantPnl } = priceChange(open, close); + const tokenPriceOpen = isPrimaryToken + ? primaryTokenActivity.open + : secondaryTokenActivity && secondaryTokenActivity[1].price.open; + + const { changePercent, variantPnl } = priceChange(tokenPriceOpen, tokenPriceClose); return ( @@ -193,11 +194,9 @@ const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, is const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { const theme: any = useTheme(); - const { accountPair, primaryTokenInfo } = usePortfolio(); + const { accountPair, primaryTokenInfo, walletBalance } = usePortfolio(); - if (secondaryToken24Activity === undefined) { - return ; - } + const isPrimary: boolean = token.info.policyId?.length === 0; const { ptActivity: { close: ptPrice }, @@ -209,43 +208,28 @@ const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { const showingAda = accountPair?.from.name === 'ADA'; const currency = accountPair?.from.name; const decimals = showingAda ? primaryTokenInfo.decimals : token.info.numberOfDecimals; - if (token.name === 'INDY') { - console.log('@@@@@@@tokenPrice', { - id: token.info.id, - name: token.name, - token, - tokenPrice, - currency: accountPair?.from.name, - tokenQuantity: tokenQuantityAsBigInt, - ptPrice, - decimals, - }); - } if (ptPrice == null) return `... ${currency}`; - const totalTokenPrice = atomicBreakdown(tokenQuantityAsBigInt, decimals) + const totaPrice = atomicBreakdown(tokenQuantityAsBigInt, decimals) .bn.times(tokenPrice ?? 1) .times(showingAda ? 1 : String(ptPrice)) .toFormat(decimals); - // const totalTokenPrice2 = calculateTokenValueWithPrecision(token.quantity, String(tokenPrice), decimals); - - if (token.name === 'INDY') { - console.log('newTotalPrice', { totalTokenPrice, tokenQuantityAsBigInt }); - } + const totalTokenPrice = isPrimary && showingAda ? accountPair?.to.value : totaPrice; + const totalTicker = isPrimary && showingAda ? accountPair?.to.name : accountPair?.from.name; return ( - {token.totalAmount} {token.name} + {isPrimary ? walletBalance?.ada : token.totalAmount} {token.name} {token.name === accountPair?.to.name ? ( ) : ( - {totalTokenPrice} {accountPair?.from.name || 'USD'} + {totalTokenPrice} {totalTicker || 'USD'} )} @@ -300,29 +284,6 @@ const TokenChip = ({ token }) => { ); }; -export function formatValue(value: BigNumber): string { - if (value.isZero()) { - return '0'; - } - if (value.abs().lt(1)) { - return value.toFormat(6); - } - return value.toFixed(2); -} - -function calculateTokenValueWithPrecision(quantity: BigNumber, price: string, decimals: number): string { - // Convert price to BigNumber for accurate multiplication - const bigPrice = new BigNumber(price); - - // Multiply quantity by price - const totalValue = quantity.multipliedBy(bigPrice); - - // Round the result to the specified number of decimals - const totalValueWithPrecision = totalValue.decimalPlaces(decimals); - - return totalValueWithPrecision.toFixed(decimals); -} - function bigNumberToBigInt(bn: BigNumber): bigint { // Convert BigNumber to a string representation of a whole number const wholeNumberString = bn.toFixed(0); // 0 means no decimals From 81daa2718529dc66a6a805be43d8f21c296a43b4 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 25 Sep 2024 13:12:20 +0300 Subject: [PATCH 27/58] fix y axis color --- .../portfolio/common/hooks/useChart.tsx | 19 +++++++++---------- .../TokenDetails/TokenChartInterval.tsx | 7 +++++-- .../useCases/TokenDetails/TokenDetails.tsx | 16 +++++++++++++--- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx index 6104a3edcb..b75dafc4f3 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx @@ -14,7 +14,7 @@ const useChart = (data: IChartData) => { // { id: 'start1YearAgo', label: strings['1Y'], active: false }, // { id: 'ALL', label: strings['ALL'], active: false }, // ]); - const [detailInfo, setDetailInfo] = useState<{ value?: number; label?: string, changeValue?: number, changePercent?: number }>({ + const [detailInfo, setDetailInfo] = useState<{ value?: number; label?: string; changeValue?: number; changePercent?: number }>({ label: data[0]?.label, value: data[0]?.value, changeValue: data[0]?.changeValue, @@ -38,6 +38,7 @@ const useChart = (data: IChartData) => { dy={4} textAnchor="end" sx={{ color: theme.palette.ds.gray_700, fontSize: '0.75rem', lineHeight: '1rem', fontWeight: 400 }} + stroke={theme.palette.ds.gray_700} > {payload.value.toFixed(1)} @@ -123,20 +124,20 @@ const useChart = (data: IChartData) => { const value = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.value : 0; const changeValue = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.changeValue : 0; - const changePercent = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.changePercent : 0; - const label = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.label : ""; + const changePercent = + props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.changePercent : 0; + const label = props.activePayload && props.activePayload.length > 0 ? props.activePayload[0].payload.label : ''; if (!value || !changeValue) return; setDetailInfo({ value, changeValue, changePercent, - label + label, }); }; const handleMouseDown = (props: any) => { - console.log(" handleMouseDown props", props) if (!props || !props.activePayload || props.activePayload.length <= 0) return; const value = props.activePayload[0].payload.value; @@ -149,7 +150,7 @@ const useChart = (data: IChartData) => { value, changeValue, changePercent, - label + label, }); setIsDragging(true); }; @@ -159,13 +160,11 @@ const useChart = (data: IChartData) => { value: data ? data[0]?.value : 0, changeValue: data ? data[0]?.changeValue : 0, changePercent: data ? data[0]?.changePercent : 0, - label: data ? data[0]?.label : "", + label: data ? data[0]?.label : '', }); setIsDragging(false); }; - - return { CustomYAxisTick, CustomActiveDot, @@ -176,4 +175,4 @@ const useChart = (data: IChartData) => { }; }; -export default useChart; \ No newline at end of file +export default useChart; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx index 8d01688567..cc66974dee 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx @@ -86,9 +86,11 @@ export const TokenChartInterval = ({ tokenInfo, isPrimaryToken }: Props): JSX.El ) : ( - + {formatNumber(detailInfo?.value || chartData[0]?.value)} -  {unitOfAccount} + +  {unitOfAccount} + @@ -126,6 +128,7 @@ export const TokenChartInterval = ({ tokenInfo, isPrimaryToken }: Props): JSX.El type={'number'} tick={CustomYAxisTick} tickCount={9} + stroke="red" /> } /> ({ + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, +})); + const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { console.log('tokenInfo', tokenInfo); const theme: any = useTheme(); @@ -79,13 +87,15 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { cursor: 'pointer', }} > - + + + {strings.backToPortfolio} - navigateTo.swapPage(tokenInfo.info.id)} label={strings.swap} /> + navigateTo.swapPage(tokenInfo.info.id)} label={strings.swap} /> navigateTo.sendPage()} label={strings.send} /> navigateTo.receivePage()} label={strings.receive} /> @@ -110,7 +120,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { Date: Wed, 25 Sep 2024 13:39:30 +0300 Subject: [PATCH 28/58] add interval requests --- .../common/components/PortfolioHeader.tsx | 10 ----- .../module/PortfolioTokenActivityProvider.tsx | 17 +++---- .../portfolio/useCases/Wallet/StatsTable.tsx | 45 ++++++++++++------- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index d3155687c2..b33ca60161 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -52,16 +52,6 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: if (ptPrice == null) return `... ${currency}`; - console.log('DATATA', { - // tokenPrice, - showingAda, - currency, - quantity: primaryTokenInfo.quantity, - ptPrice, - unitOfAccount, - decimals, - }); - const totalAmount = formatValue(primaryTokenInfo.quantity.multipliedBy(String(ptPrice))); return totalAmount; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index 4653836528..65eb4c8d10 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -66,14 +66,15 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { }, [actions, queryClient]); // Use hook for each interval (24h, 1w, 1m) const { mutate: fetch24h, data: data24h, isLoading: loading24h } = useMultiTokenActivity('24h'); - const { mutate: fetch1w, data: data1w, isLoading: loading1w } = useMultiTokenActivity('7d'); - console.log('fetch1w', fetch1w); + const { mutate: fetch30d, data: data30d, isLoading: loading30d } = useMultiTokenActivity('30d'); + const { mutate: fetch7d, data: data7d, isLoading: loading7d } = useMultiTokenActivity('7d'); + console.log('data7d', data7d); // const { mutate: fetch1m, data: data1m, isLoading: loading1m } = useMultiTokenActivity('1m'); React.useEffect(() => { if (state.secondaryTokenIds.length > 0) { fetch24h(state.secondaryTokenIds); - fetch1w(state.secondaryTokenIds); - // fetch1m(state.secondaryTokenIds); + fetch7d(state.secondaryTokenIds); + fetch30d(state.secondaryTokenIds); } }, [state.secondaryTokenIds, fetch24h]); @@ -81,12 +82,12 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { if (data24h) { const combinedData: any = { data24h: data24h, - // '1w': data1w, - // '1m': data1m, + data7d: data7d, + data30d: data30d, }; actions.tokenActivityChanged(combinedData); } - }, [data24h, actions, loading24h, walletBalance?.ada]); + }, [data24h, actions, data30d, data7d, loading24h, loading30d, loading7d, walletBalance?.ada]); const value = React.useMemo( () => ({ @@ -94,7 +95,7 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { isLoading: loading24h, // || loading1w || loading1m, // Combine loading states from all intervals }), - [loading24h, state] + [loading24h, data7d, data30d, state] ); return {children}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index 73faab6cad..e30ea678f5 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -39,11 +39,13 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { const list = useMemo(() => [...data], [data]); const { - tokenActivity: { data24h }, + tokenActivity: { data24h, data7d, data30d }, // isLoading: isActivityLoading, } = usePortfolioTokenActivity(); const ptActivity = useCurrencyPairing().ptActivity; + console.log('data7d', data7d); + const headCells: IHeadCell[] = [ { id: 'name', label: strings.name, align: 'left', sortType: 'character' }, { id: 'price', label: strings.price, align: 'left', sortType: 'numeric' }, @@ -106,24 +108,28 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { /> - - {data24h === null || ptActivity === null ? ( - - ) : ( - - )} + + - - + + - + @@ -175,6 +181,9 @@ const TokenDisplay = ({ token }) => { }; const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, isPrimaryToken }) => { + if (secondaryTokenActivity === null || primaryTokenActivity === null) { + return ; + } const tokenPriceClose = isPrimaryToken ? primaryTokenActivity.close : secondaryTokenActivity && secondaryTokenActivity[1].price.close; @@ -186,9 +195,11 @@ const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, is const { changePercent, variantPnl } = priceChange(tokenPriceOpen, tokenPriceClose); return ( - - {formatPriceChange(changePercent)}% - + + + {formatPriceChange(changePercent)}% + + ); }; From 0be14f23e61f9465726319773d363dcb751c275f Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 25 Sep 2024 15:09:56 +0300 Subject: [PATCH 29/58] add ada token interval prices --- .../common/components/PortfolioHeader.tsx | 5 +-- .../portfolio/common/helpers/constants.ts | 9 +++++ .../helpers/getTimestampsTokenInterval.ts | 18 +++++++++ .../common/hooks/usePortfolioTokenChart.ts | 38 +++++-------------- .../module/PortfolioTokenActivityProvider.tsx | 4 +- .../TokenDetails/TokenChartInterval.tsx | 4 +- .../portfolio/useCases/Wallet/StatsTable.tsx | 19 +++++++--- .../app/UI/utils/useMultiTokenActivity.ts | 1 - 8 files changed, 54 insertions(+), 44 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/helpers/getTimestampsTokenInterval.ts diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index b33ca60161..fda5344dcb 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -34,8 +34,6 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: const { tokenActivity } = usePortfolioTokenActivity(); const { - currency: selectedCurrency, - ptActivity: { open, close: ptPrice }, config, } = useCurrencyPairing(); @@ -48,14 +46,13 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: // const tokenPrice = tokenActivity?.data24h[amount?.info.id]?.price.close; const showingAda = accountPair?.from.name !== 'ADA'; const currency = showingAda ? primaryTokenInfo.ticker : unitOfAccount; - const decimals = showingAda ? primaryTokenInfo.decimals : config.decimals; if (ptPrice == null) return `... ${currency}`; const totalAmount = formatValue(primaryTokenInfo.quantity.multipliedBy(String(ptPrice))); return totalAmount; - }, [tokenActivity, selectedCurrency, config.decimals, ptPrice]); + }, [tokenActivity, config.decimals, ptPrice]); const handleCurrencyChange = () => { changeUnitOfAccountPair({ diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/constants.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/constants.ts index 9049e8dfe9..9ac870cd06 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/constants.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/constants.ts @@ -1,2 +1,11 @@ +export const TOKEN_CHART_INTERVAL = { + DAY: '24 H', + WEEK: '1 W', + MONTH: '1 M', + SIX_MONTHS: '6 M', + YEAR: '1 Y', + ALL: 'ALL', +} as const; + export const cardanoAdaBase64Logo: string = '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'; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/getTimestampsTokenInterval.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/getTimestampsTokenInterval.ts new file mode 100644 index 0000000000..d55736c15b --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/getTimestampsTokenInterval.ts @@ -0,0 +1,18 @@ +import { time } from '../../../../utils/constants'; +import { TokenChartInterval } from '../hooks/usePortfolioTokenChart'; +import { TOKEN_CHART_INTERVAL } from './constants'; + +export const getTimestampsTokenInterval = (timeInterval: TokenChartInterval) => { + const now = Date.now(); + const [from, resolution]: any = { + [TOKEN_CHART_INTERVAL.DAY]: [now - time.oneDay, 96], + [TOKEN_CHART_INTERVAL.WEEK]: [now - time.oneWeek, 168], + [TOKEN_CHART_INTERVAL.MONTH]: [now - time.oneMonth, 180], + [TOKEN_CHART_INTERVAL.SIX_MONTHS]: [now - time.sixMonths, 180], + [TOKEN_CHART_INTERVAL.YEAR]: [now - time.oneYear, 365], + [TOKEN_CHART_INTERVAL.ALL]: [new Date('2018').getTime(), 256], + }[timeInterval]; + + const step: any = (now - from) / resolution; + return Array.from({ length: resolution }, (_, i) => from + Math.round(step * i)); +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts index bdfe34bec3..8e6ad363dc 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts @@ -4,17 +4,10 @@ import { useQuery, UseQueryOptions } from 'react-query'; // import { useLanguage } from '../../../kernel/i18n'; import { supportedCurrencies, time } from '../../../../utils/constants'; import { fetchPtPriceActivity } from '../../../../utils/usePrimaryTokenActivity'; +import { TOKEN_CHART_INTERVAL } from '../helpers/constants'; +import { getTimestampsTokenInterval } from '../helpers/getTimestampsTokenInterval'; import { priceChange } from '../helpers/priceChange'; -export const TOKEN_CHART_INTERVAL = { - DAY: '24 H', - WEEK: '1 W', - MONTH: '1 M', - SIX_MONTHS: '6 M', - YEAR: '1 Y', - ALL: 'ALL', -} as const; - export type TokenChartInterval = typeof TOKEN_CHART_INTERVAL[keyof typeof TOKEN_CHART_INTERVAL]; type TokenChartData = { @@ -78,21 +71,6 @@ type TokenChartData = { // return chartData; // } -const getTimestamps = (timeInterval: TokenChartInterval) => { - const now = Date.now(); - const [from, resolution]: any = { - [TOKEN_CHART_INTERVAL.DAY]: [now - time.oneDay, 96], - [TOKEN_CHART_INTERVAL.WEEK]: [now - time.oneWeek, 168], - [TOKEN_CHART_INTERVAL.MONTH]: [now - time.oneMonth, 180], - [TOKEN_CHART_INTERVAL.SIX_MONTHS]: [now - time.sixMonths, 180], - [TOKEN_CHART_INTERVAL.YEAR]: [now - time.oneYear, 365], - [TOKEN_CHART_INTERVAL.ALL]: [new Date('2018').getTime(), 256], - }[timeInterval]; - - const step: any = (now - from) / resolution; - return Array.from({ length: resolution }, (_, i) => from + Math.round(step * i)); -}; - const ptTicker = 'ADA'; export const useGetPortfolioTokenChart = ( @@ -116,15 +94,19 @@ export const useGetPortfolioTokenChart = ( refetchInterval: time.halfHour, useErrorBoundary: true, refetchOnMount: false, - enabled: tokenInfo && tokenInfo.info.id?.length === 0, + enabled: tokenInfo && tokenInfo.info?.id.length === 0, ...options, - queryKey: ['useGetPortfolioTokenChart', tokenInfo?.info.id ?? '', timeInterval, currency], + queryKey: ['useGetPortfolioTokenChart', tokenInfo.info?.id ?? '', timeInterval, currency], queryFn: async () => { + console.log('responseresponseresponse22222'); + // @ts-ignore - const response = await fetchPtPriceActivity(getTimestamps(timeInterval)); + const response = await fetchPtPriceActivity(getTimestampsTokenInterval(timeInterval)); + console.log('responseresponseresponse', response); if (isRight(response)) { if (response.value.data.error) throw new Error(response.value.data.error); + console.log('AFTERR TEST', response); const tickers = response.value.data.tickers; // @ts-ignore const validCurrency = currency === ptTicker ? supportedCurrencies.USD : currency ?? supportedCurrencies.USD; @@ -143,7 +125,6 @@ export const useGetPortfolioTokenChart = ( return { label, value, changePercent, changeValue }; }) .filter(Boolean) as TokenChartData[]; - return records; } throw new Error('Failed to fetch token chart data'); @@ -161,6 +142,7 @@ export const useGetPortfolioTokenChart = ( // return generateMockChartData(timeInterval); // }, // }); + console.log('ptQuery', ptQuery.data); return ptQuery; // return tokenInfo && isPrimaryToken(tokenInfo.info) ? ptQuery : otherQuery; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index 65eb4c8d10..3faa6c37b5 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -66,10 +66,8 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { }, [actions, queryClient]); // Use hook for each interval (24h, 1w, 1m) const { mutate: fetch24h, data: data24h, isLoading: loading24h } = useMultiTokenActivity('24h'); - const { mutate: fetch30d, data: data30d, isLoading: loading30d } = useMultiTokenActivity('30d'); const { mutate: fetch7d, data: data7d, isLoading: loading7d } = useMultiTokenActivity('7d'); - console.log('data7d', data7d); - // const { mutate: fetch1m, data: data1m, isLoading: loading1m } = useMultiTokenActivity('1m'); + const { mutate: fetch30d, data: data30d, isLoading: loading30d } = useMultiTokenActivity('30d'); React.useEffect(() => { if (state.secondaryTokenIds.length > 0) { fetch24h(state.secondaryTokenIds); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx index cc66974dee..6e1ef381cd 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx @@ -5,10 +5,11 @@ import { CartesianGrid, Line, LineChart, Tooltip as RechartTooltip, ResponsiveCo import { Chip, ChipTypes, Icon, Skeleton } from '../../../../components'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import chartSkeletonPng from '../../common/assets/images/token-detail-chart-skeleton.png'; +import { TOKEN_CHART_INTERVAL } from '../../common/helpers/constants'; import { formatNumber } from '../../common/helpers/formatHelper'; import { priceChange } from '../../common/helpers/priceChange'; import useChart from '../../common/hooks/useChart'; -import { TOKEN_CHART_INTERVAL, useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; +import { useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; import { useStrings } from '../../common/hooks/useStrings'; import { usePortfolio } from '../../module/PortfolioContextProvider'; @@ -128,7 +129,6 @@ export const TokenChartInterval = ({ tokenInfo, isPrimaryToken }: Props): JSX.El type={'number'} tick={CustomYAxisTick} tickCount={9} - stroke="red" /> } /> { const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); - const { unitOfAccount, accountPair } = usePortfolio(); + const { unitOfAccount } = usePortfolio(); const [{ order, orderBy }, setSortState] = useState({ order: null, orderBy: null, @@ -44,8 +46,6 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { } = usePortfolioTokenActivity(); const ptActivity = useCurrencyPairing().ptActivity; - console.log('data7d', data7d); - const headCells: IHeadCell[] = [ { id: 'name', label: strings.name, align: 'left', sortType: 'character' }, { id: 'price', label: strings.price, align: 'left', sortType: 'numeric' }, @@ -121,6 +121,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { secondaryTokenActivity={data7d && data7d[`${row.info.policyId}.${row.assetName}`]} primaryTokenActivity={ptActivity} isPrimaryToken={row.info.policyId?.length === 0} + timeInterval={TOKEN_CHART_INTERVAL.WEEK} /> @@ -129,6 +130,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { secondaryTokenActivity={data30d && data30d[`${row.info.policyId}.${row.assetName}`]} primaryTokenActivity={ptActivity} isPrimaryToken={row.info.policyId?.length === 0} + timeInterval={TOKEN_CHART_INTERVAL.MONTH} /> @@ -180,10 +182,13 @@ const TokenDisplay = ({ token }) => { ); }; -const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, isPrimaryToken }) => { - if (secondaryTokenActivity === null || primaryTokenActivity === null) { +const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, isPrimaryToken, timeInterval }) => { + const { data: ptTokenDataInterval, isFetching } = useGetPortfolioTokenChart(timeInterval, { info: { id: '' } }); + + if (secondaryTokenActivity === null || primaryTokenActivity === null || isFetching) { return ; } + const tokenPriceClose = isPrimaryToken ? primaryTokenActivity.close : secondaryTokenActivity && secondaryTokenActivity[1].price.close; @@ -197,7 +202,9 @@ const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, is return ( - {formatPriceChange(changePercent)}% + + {formatPriceChange(isPrimaryToken ? ptTokenDataInterval[50]?.changePercent : changePercent)}% + ); diff --git a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts index 6756f948a2..42929ae633 100644 --- a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts +++ b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts @@ -20,7 +20,6 @@ export const useMultiTokenActivity = ( Accept: 'application/json', }, }); - console.log('tokenActivityresponse', { interval, response }); return response.data; }; From c96a9b30aee93269a4b47932d048f12d4d1fc3ee Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 25 Sep 2024 18:15:53 +0300 Subject: [PATCH 30/58] restructure portfolio folder, fix search --- .../portfolio/common/components/Menu.tsx | 5 +- .../TransactionTable.tsx | 24 ++-- .../ChartDetails/MarketPriceOverview.tsx | 116 ++++++++++++++++++ .../{ => ChartDetails}/TokenChartInterval.tsx | 105 +++++----------- .../TokenDetails/HeaderDetails/Header.tsx | 49 ++++++++ .../Overview.tsx} | 51 ++++---- .../OverviewPerformance.tsx | 69 +++++++++++ .../Performance.tsx} | 8 +- .../useCases/TokenDetails/TokenDetails.tsx | 106 ++-------------- .../useCases/Wallet/PortfolioWallet.tsx | 6 +- 10 files changed, 314 insertions(+), 225 deletions(-) rename packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/{ => AssetTransactionDetails}/TransactionTable.tsx (93%) create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx rename packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/{ => ChartDetails}/TokenChartInterval.tsx (57%) create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx rename packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/{TokenDetailOverview.tsx => OverviewPerformanceDetails/Overview.tsx} (72%) create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/OverviewPerformance.tsx rename packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/{TokenDetailPerformance.tsx => OverviewPerformanceDetails/Performance.tsx} (94%) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/Menu.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/Menu.tsx index a24e9e923d..1eafefbe42 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/Menu.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/Menu.tsx @@ -1,5 +1,4 @@ -import { Box, Stack, Typography } from '@mui/material'; -import { useTheme } from '@mui/material'; +import { Box, Stack, Typography, useTheme } from '@mui/material'; import React from 'react'; import { SubMenuOption } from '../types'; @@ -13,7 +12,7 @@ const Menu = ({ options, onItemClick, isActiveItem }: Props) => { const theme: any = useTheme(); return ( - + {options.map((option, index) => ( ({ width: '100%', diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx new file mode 100644 index 0000000000..5f4242724f --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx @@ -0,0 +1,116 @@ +import { Button, Stack, Typography, styled } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import React from 'react'; +import { Chip, ChipTypes, Icon, Skeleton } from '../../../../../components'; +import { useCurrencyPairing } from '../../../../../context/CurrencyContext'; +import { formatNumber } from '../../../common/helpers/formatHelper'; +import { priceChange } from '../../../common/helpers/priceChange'; +import { useStrings } from '../../../common/hooks/useStrings'; +import { usePortfolio } from '../../../module/PortfolioContextProvider'; + +// Styling for the period buttons +const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; disabled: boolean; variant: string }) => ({ + fontWeight: 500, + fontSize: '0.75rem', + lineHeight: '1.125rem', + height: '30px', + padding: '6px !important', + minWidth: '36px', + backgroundColor: + variant === 'contained' ? (disabled ? theme.palette.ds.gray_100 : theme.palette.ds.el_primary_medium) : `transparent`, + + '&.MuiButton-contained': { + color: theme.palette.ds.white_static, + }, + '&.MuiButton-secondary': { + color: disabled ? theme.palette.ds.gray_100 : theme.palette.ds.text_primary_medium, + }, +})); + +interface Props { + chartData: any; + detailInfo: any; + isLoading: boolean; +} + +export const TokenMarketPriceOverview = ({ chartData, detailInfo, isLoading = false }: Props): JSX.Element => { + const theme: any = useTheme(); + const strings = useStrings(); + const { unitOfAccount } = usePortfolio(); + + // Fetch data based on the selected interval + + const { + ptActivity: { close, open }, + // config, + } = useCurrencyPairing(); + + const { changeValue, changePercent } = priceChange(open, close); + + return ( + + {isLoading ? ( + + ) : ( + + {strings.marketPrice} + + )} + + {isLoading || chartData === undefined ? ( + + ) : ( + + + {formatNumber(detailInfo?.value || chartData[0]?.value)} + +  {unitOfAccount} + + + + + + + + )} + + + ); +}; + +const PriceChangeChip = ({ value }: { value: number }) => { + const theme: any = useTheme(); + return ( + <> + 0 ? ChipTypes.ACTIVE : value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} + label={ + + {value > 0 ? ( + + ) : value < 0 ? ( + + ) : null} + {/* @ts-ignore */} + {value >= 0 ? formatNumber(value) : formatNumber(-1 * value)}% + + } + /> + + ); +}; +const PriceValueChip = ({ value, unitOfAccount }: { value: number; unitOfAccount: string }) => { + return ( + <> + 0 ? ChipTypes.ACTIVE : value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} + label={ + + {value > 0 && '+'} + {formatNumber(value)} {unitOfAccount} + + } + /> + + ); +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx similarity index 57% rename from packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx rename to packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx index 6e1ef381cd..03a1cdd3c8 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx @@ -1,17 +1,16 @@ -import { Box, Button, Stack, Typography, styled } from '@mui/material'; +import { Box, Button, Stack, styled } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import React, { useState } from 'react'; import { CartesianGrid, Line, LineChart, Tooltip as RechartTooltip, ResponsiveContainer, YAxis } from 'recharts'; -import { Chip, ChipTypes, Icon, Skeleton } from '../../../../components'; -import { useCurrencyPairing } from '../../../../context/CurrencyContext'; -import chartSkeletonPng from '../../common/assets/images/token-detail-chart-skeleton.png'; -import { TOKEN_CHART_INTERVAL } from '../../common/helpers/constants'; -import { formatNumber } from '../../common/helpers/formatHelper'; -import { priceChange } from '../../common/helpers/priceChange'; -import useChart from '../../common/hooks/useChart'; -import { useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; -import { useStrings } from '../../common/hooks/useStrings'; -import { usePortfolio } from '../../module/PortfolioContextProvider'; +import { useCurrencyPairing } from '../../../../../context/CurrencyContext'; +import chartSkeletonPng from '../../../common/assets/images/token-detail-chart-skeleton.png'; +import { TOKEN_CHART_INTERVAL } from '../../../common/helpers/constants'; +import { priceChange } from '../../../common/helpers/priceChange'; +import useChart from '../../../common/hooks/useChart'; +import { useGetPortfolioTokenChart } from '../../../common/hooks/usePortfolioTokenChart'; +import { useStrings } from '../../../common/hooks/useStrings'; +import { usePortfolio } from '../../../module/PortfolioContextProvider'; +import { TokenMarketPriceOverview } from './MarketPriceOverview'; // Styling for the period buttons const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; disabled: boolean; variant: string }) => ({ @@ -34,10 +33,11 @@ const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; interface Props { tokenInfo: TokenInfoType; - isPrimaryToken: boolean; } -export const TokenChartInterval = ({ tokenInfo, isPrimaryToken }: Props): JSX.Element => { +export const TokenChartInterval = ({ tokenInfo }: Props): JSX.Element => { + const isPrimaryToken: boolean = tokenInfo.id === '-'; + const chartHeight = isPrimaryToken ? 153 : 257; const theme: any = useTheme(); const strings = useStrings(); @@ -68,39 +68,27 @@ export const TokenChartInterval = ({ tokenInfo, isPrimaryToken }: Props): JSX.El })) || []; const { CustomYAxisTick, CustomActiveDot, handleMouseMove, handleMouseDown, handleMouseUp, detailInfo } = useChart(chartData); + if (!isPrimaryToken) { + return ( + + ); + } + return ( - - {isFetching || !data ? ( - - ) : ( - - {strings.marketPrice} - - )} - - {isFetching || !data || chartData === undefined ? ( - - ) : ( - - - {formatNumber(detailInfo?.value || chartData[0]?.value)} - -  {unitOfAccount} - - - - - - - - )} - - + ); }; - -const PriceChangeChip = ({ value }: { value: number }) => { - const theme: any = useTheme(); - return ( - <> - 0 ? ChipTypes.ACTIVE : value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} - label={ - - {value > 0 ? ( - - ) : value < 0 ? ( - - ) : null} - {/* @ts-ignore */} - {value >= 0 ? formatNumber(value) : formatNumber(-1 * value)}% - - } - /> - - ); -}; -const PriceValueChip = ({ value, unitOfAccount }: { value: number; unitOfAccount: string }) => { - return ( - <> - 0 ? ChipTypes.ACTIVE : value < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} - label={ - - {value > 0 && '+'} - {formatNumber(value)} {unitOfAccount} - - } - /> - - ); -}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx new file mode 100644 index 0000000000..42cbbe311f --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx @@ -0,0 +1,49 @@ +import { Stack, Typography } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import React from 'react'; +import { useStrings } from '../../../common/hooks/useStrings'; +import { usePortfolio } from '../../../module/PortfolioContextProvider'; + +interface Props { + tokenInfo: TokenInfoType; +} + +const HeaderSection = ({ tokenInfo }: Props): JSX.Element => { + const theme: any = useTheme(); + const strings = useStrings(); + const { unitOfAccount, walletBalance } = usePortfolio(); + const isPrimaryToken: boolean = tokenInfo.id === '-'; + const tokenTotalAmount = isPrimaryToken ? walletBalance?.ada : tokenInfo.totalAmount; + + return ( + + + {`${tokenInfo.name} ${strings.balance}`} + + + + + + {tokenTotalAmount} + + + {tokenInfo.name} + + + + + {tokenInfo.totalAmountFiat} {isPrimaryToken && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} + + + + ); +}; + +export default HeaderSection; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx similarity index 72% rename from packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx rename to packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx index 9cd1c735f8..6038167d43 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailOverview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx @@ -1,19 +1,17 @@ import { Box, Link as LinkMui, Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import React from 'react'; -import { Skeleton } from '../../../../components/Skeleton'; -import { getNetworkUrl } from '../../../../utils/getNetworkUrl'; -import tokenPng from '../../common/assets/images/token.png'; -import { isPrimaryToken } from '../../common/helpers/isPrimary'; -import { useStrings } from '../../common/hooks/useStrings'; -import { usePortfolio } from '../../module/PortfolioContextProvider'; +import { getNetworkUrl } from '../../../../../utils/getNetworkUrl'; +import tokenPng from '../../../common/assets/images/token.png'; +import { isPrimaryToken } from '../../../common/helpers/isPrimary'; +import { useStrings } from '../../../common/hooks/useStrings'; +import { usePortfolio } from '../../../module/PortfolioContextProvider'; interface Props { tokenInfo: TokenInfoType; - isLoading: boolean; } -const TokenDetailOverview = ({ tokenInfo, isLoading }: Props): JSX.Element => { +const Overview = ({ tokenInfo }: Props): JSX.Element => { const theme: any = useTheme(); const strings = useStrings(); const { networkId } = usePortfolio(); @@ -28,27 +26,20 @@ const TokenDetailOverview = ({ tokenInfo, isLoading }: Props): JSX.Element => { return ( - {isLoading ? ( - - ) : ( - - )} - {isLoading ? ( - - ) : ( - - {tokenInfo?.name} - - )} + + + + {tokenInfo?.name} + @@ -78,7 +69,7 @@ const TokenDetailOverview = ({ tokenInfo, isLoading }: Props): JSX.Element => { ); }; -export default TokenDetailOverview; +export default Overview; type TokenOverviewSectionTypes = { label: string; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/OverviewPerformance.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/OverviewPerformance.tsx new file mode 100644 index 0000000000..82333bdaa5 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/OverviewPerformance.tsx @@ -0,0 +1,69 @@ +import { Box, Divider } from '@mui/material'; +import { styled, useTheme } from '@mui/material/styles'; +import React, { useState } from 'react'; +import { Card } from '../../../../../components'; +import Menu from '../../../common/components/Menu'; +import { useStrings } from '../../../common/hooks/useStrings'; +import { SubMenuOption } from '../../../common/types/index'; +import TokenDetailOverview from './Overview'; +import TokenDetailPerformance from './Performance'; + +const TabContent = styled(Box)({ + flex: 1, +}); + +interface Props { + tokenInfo: TokenInfoType; +} + +const OverviewPerformance = ({ tokenInfo }: Props): JSX.Element => { + const theme: any = useTheme(); + const strings = useStrings(); + + const subMenuOptions: SubMenuOption[] = [ + { + label: strings.overview, + className: 'overview', + route: 'overview', + }, + // { + // label: strings.performance, + // className: 'performance', + // route: 'performance', + // }, + ]; + + const [selectedTab, setSelectedTab] = useState(subMenuOptions[0]?.route); + + const isActiveItem = (route: string) => { + if (route === selectedTab) { + return true; + } else { + return false; + } + }; + + return ( + + + setSelectedTab(route)} isActiveItem={isActiveItem} /> + + + + {selectedTab === subMenuOptions[0]?.route ? ( + + + + ) : null} + + {selectedTab === subMenuOptions[1]?.route ? ( + + + + ) : null} + + + ); +}; + +export default OverviewPerformance; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Performance.tsx similarity index 94% rename from packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx rename to packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Performance.tsx index 8544da8b9b..af327fbbb7 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetailPerformance.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Performance.tsx @@ -1,7 +1,7 @@ import { Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import React from 'react'; -import { useStrings } from '../../common/hooks/useStrings'; +import { useStrings } from '../../../common/hooks/useStrings'; // const PerformanceItemType = { // FIAT: 'fiat', @@ -11,10 +11,10 @@ import { useStrings } from '../../common/hooks/useStrings'; interface Props { tokenInfo: TokenInfoType; - isLoading: boolean; + isLoading?: boolean; } -const TokenDetailPerformance = ({ tokenInfo, isLoading }: Props): JSX.Element => { +const Performance = ({ tokenInfo, isLoading }: Props): JSX.Element => { console.log({ tokenInfo, isLoading }); const theme = useTheme(); const strings = useStrings(); @@ -97,4 +97,4 @@ const TokenDetailPerformance = ({ tokenInfo, isLoading }: Props): JSX.Element => ); }; -export default TokenDetailPerformance; +export default Performance; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index be8cd1e9a0..24b351f408 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -1,19 +1,15 @@ import { Box, Divider, Stack, Typography } from '@mui/material'; import { styled, useTheme } from '@mui/material/styles'; -import React, { useState } from 'react'; +import React from 'react'; import { ReactComponent as BackIcon } from '../../../../../assets/images/assets-page/back-arrow.inline.svg'; -import { Card, Skeleton } from '../../../../components'; -import Menu from '../../common/components/Menu'; +import { Card } from '../../../../components'; import NavigationButton from '../../common/components/NavigationButton'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useStrings } from '../../common/hooks/useStrings'; -import mockData from '../../common/mockData'; -import { SubMenuOption } from '../../common/types/index'; import { usePortfolio } from '../../module/PortfolioContextProvider'; -import { TokenChartInterval } from './TokenChartInterval'; -import TokenDetailOverview from './TokenDetailOverview'; -import TokenDetailPerformance from './TokenDetailPerformance'; -import TransactionTable from './TransactionTable'; +import { TokenChartInterval } from './ChartDetails/TokenChartInterval'; +import HeaderSection from './HeaderDetails/Header'; +import OverviewPerformance from './OverviewPerformanceDetails/OverviewPerformance'; const Header = styled(Box)({ display: 'flex', @@ -24,10 +20,6 @@ const TokenInfo = styled(Stack)({ width: '100%', }); -const TabContent = styled(Box)({ - flex: 1, -}); - interface Props { tokenInfo: TokenInfoType; } @@ -41,38 +33,13 @@ const IconWrapper = styled(Box)(({ theme }) => ({ })); const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { - console.log('tokenInfo', tokenInfo); const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); const { unitOfAccount, walletBalance } = usePortfolio(); - const [isLoading, _] = useState(false); const isPrimaryToken: boolean = tokenInfo.id === '-'; const tokenTotalAmount = isPrimaryToken ? walletBalance?.ada : tokenInfo.totalAmount; - const subMenuOptions: SubMenuOption[] = [ - { - label: strings.overview, - className: 'overview', - route: 'overview', - }, - // { - // label: strings.performance, - // className: 'performance', - // route: 'performance', - // }, - ]; - - const [selectedTab, setSelectedTab] = useState(subMenuOptions[0]?.route); - - const isActiveItem = (route: string) => { - if (route === selectedTab) { - return true; - } else { - return false; - } - }; - return (
@@ -102,70 +69,17 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => {
- + - - - {isLoading ? : `${tokenInfo.name} ${strings.balance}`} - - - - {isLoading ? ( - - ) : ( - - - {tokenTotalAmount} - - - {tokenInfo.name} - - - )} - - {isLoading ? ( - - ) : ( - - {tokenInfo.totalAmountFiat} {isPrimaryToken && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} - - )} - - - + - {isPrimaryToken && } + - - - setSelectedTab(route)} isActiveItem={isActiveItem} /> - - - - {selectedTab === subMenuOptions[0]?.route ? ( - - - - ) : null} - - {selectedTab === subMenuOptions[1]?.route ? ( - - - - ) : null} - - + - + {/* */} ); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx index 6d117ad961..a86061ba4a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx @@ -40,9 +40,9 @@ const PortfolioWallet = (): JSX.Element => { const temp = assetList.filter(item => { return ( - item.name.toLowerCase().includes(lowercaseKeyword) || - item.id.toLowerCase().includes(lowercaseKeyword) || - item.policyId.toLowerCase().includes(lowercaseKeyword) + item.info.name.toLowerCase().includes(lowercaseKeyword) || + item.info.id.toLowerCase().includes(lowercaseKeyword) || + item.info.policyId.toLowerCase().includes(lowercaseKeyword) ); }); if (temp && temp.length > 0) { From 6bbd812a502a399dc9c15f84083ae94177d71d20 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 25 Sep 2024 19:24:20 +0300 Subject: [PATCH 31/58] fix graph UI --- .../common/hooks/usePortfolioTokenChart.ts | 5 -- .../common/hooks/useTokenPercentages.tsx | 12 ++++- .../ChartDetails/TokenChartInterval.tsx | 8 ++- .../portfolio/useCases/Wallet/StatsTable.tsx | 51 +++++-------------- 4 files changed, 30 insertions(+), 46 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts index 8e6ad363dc..06e240e55f 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/usePortfolioTokenChart.ts @@ -98,15 +98,11 @@ export const useGetPortfolioTokenChart = ( ...options, queryKey: ['useGetPortfolioTokenChart', tokenInfo.info?.id ?? '', timeInterval, currency], queryFn: async () => { - console.log('responseresponseresponse22222'); - // @ts-ignore const response = await fetchPtPriceActivity(getTimestampsTokenInterval(timeInterval)); - console.log('responseresponseresponse', response); if (isRight(response)) { if (response.value.data.error) throw new Error(response.value.data.error); - console.log('AFTERR TEST', response); const tickers = response.value.data.tickers; // @ts-ignore const validCurrency = currency === ptTicker ? supportedCurrencies.USD : currency ?? supportedCurrencies.USD; @@ -142,7 +138,6 @@ export const useGetPortfolioTokenChart = ( // return generateMockChartData(timeInterval); // }, // }); - console.log('ptQuery', ptQuery.data); return ptQuery; // return tokenInfo && isPrimaryToken(tokenInfo.info) ? ptQuery : otherQuery; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx index d8605fc719..79de6833c3 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx @@ -33,5 +33,15 @@ export const useTokenPercentages = (tokens: any[]): TokenWithPercentage[] => { }, {} as any); }, [tokens]); - return tokenPercentages; + return { + // @ts-ignore + '': '82.37', + '533bb94a8850ee3ccbe483106489399112b74c905342cb1792a797a0.494e4459': '1.11', + '9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77.53554e444145': '9.87', + '420000029ad9527271b1b1e3c27ee065c18df70a4a4cfc3093a41a44.41584f': '0.54', + '208a2ca888886921513cb777bb832a8dc685c04de990480151f12150.53484942414441': '0.01', + '29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6.4d494e': '2.53', + 'af2e27f580f7f08e93190a81f72462f153026d06450924726645891b.44524950': '1.96', + 'f43a62fdc3965df486de8a0d32fe800963589c41b38946602a0dc535.41474958': '1.62', + }; }; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx index 03a1cdd3c8..629a1354ad 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx @@ -21,14 +21,18 @@ const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; padding: '6px !important', minWidth: '36px', backgroundColor: - variant === 'contained' ? (disabled ? theme.palette.ds.gray_100 : theme.palette.ds.el_primary_medium) : `transparent`, + variant === 'contained' ? (disabled ? theme.palette.ds.gray_100 : theme.palette.ds.primary_500) : `transparent`, '&.MuiButton-contained': { - color: theme.palette.ds.white_static, + color: theme.palette.ds.gray_min, }, '&.MuiButton-secondary': { color: disabled ? theme.palette.ds.gray_100 : theme.palette.ds.text_primary_medium, }, + '&:hover': { + backgroundColor: + variant === 'contained' ? (disabled ? theme.palette.ds.gray_100 : theme.palette.ds.primary_500) : `transparent`, + }, })); interface Props { diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx index ca36388aca..a3f254ef27 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx @@ -3,16 +3,12 @@ import { useTheme } from '@mui/material/styles'; import { atomicBreakdown } from '@yoroi/common'; import BigNumber from 'bignumber.js'; import React, { useMemo, useState } from 'react'; -import { Chip } from '../../../../components'; -import { ChipTypes } from '../../../../components/Chip'; -import { Icon } from '../../../../components/icons'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import tokenPng from '../../common/assets/images/token.png'; import PnlTag from '../../common/components/PlnTag'; import Table from '../../common/components/Table'; import { TableRowSkeleton } from '../../common/components/TableRowSkeleton'; import { TOKEN_CHART_INTERVAL } from '../../common/helpers/constants'; -import { formatNumber } from '../../common/helpers/formatHelper'; import { formatPriceChange, priceChange } from '../../common/helpers/priceChange'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; @@ -78,7 +74,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { order={order} orderBy={orderBy} handleRequestSort={handleRequestSort} - isLoading={isLoading} + isLoading={false} TableRowSkeleton={} > {getSortedData(list).map((row: any) => ( @@ -134,7 +130,7 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { /> - + { - {data24h === null ? ( - - ) : ( - - )} + ))} @@ -186,7 +178,7 @@ const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, is const { data: ptTokenDataInterval, isFetching } = useGetPortfolioTokenChart(timeInterval, { info: { id: '' } }); if (secondaryTokenActivity === null || primaryTokenActivity === null || isFetching) { - return ; + return ; } const tokenPriceClose = isPrimaryToken @@ -214,6 +206,15 @@ const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { const theme: any = useTheme(); const { accountPair, primaryTokenInfo, walletBalance } = usePortfolio(); + if (secondaryToken24Activity === null) { + return ( + + + + + ); + } + const isPrimary: boolean = token.info.policyId?.length === 0; const { @@ -276,32 +277,6 @@ const TokenProcentage = ({ procentage }) => { ); }; -// MOCK DATA -const TokenChip = ({ token }) => { - const theme = useTheme(); - return ( - 0 ? ChipTypes.ACTIVE : token['1M'] < 0 ? ChipTypes.INACTIVE : ChipTypes.DISABLED} - label={ - - {token['1M'] > 0 ? ( - // @ts-ignore - - ) : token['1M'] < 0 ? ( - // @ts-ignore - - ) : null} - {/* @ts-ignore */} - - {token['1M'] >= 0 ? formatNumber(token['1M']) : formatNumber(-1 * token['1M'])}% - - - } - sx={{ cursor: 'pointer' }} - /> - ); -}; - function bigNumberToBigInt(bn: BigNumber): bigint { // Convert BigNumber to a string representation of a whole number const wholeNumberString = bn.toFixed(0); // 0 means no decimals From c2ee266e98e6ba145298b22e8c102d5373a08c3c Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 26 Sep 2024 13:26:51 +0300 Subject: [PATCH 32/58] add token price in token details --- .../useCases/Dapps/PortfolioDapps.tsx | 2 +- .../ChartDetails/MarketPriceOverview.tsx | 84 ++++++++++++------- .../ChartDetails/TokenChartInterval.tsx | 7 +- .../TokenDetails/HeaderDetails/Header.tsx | 7 ++ .../{Wallet => TokensTable}/StatsTable.tsx | 0 .../useCases/Wallet/PortfolioWallet.tsx | 4 +- .../app/UI/types/currrentWallet.ts | 2 - .../app/UI/utils/createCurrentWalletInfo.ts | 2 - 8 files changed, 67 insertions(+), 41 deletions(-) rename packages/yoroi-extension/app/UI/features/portfolio/useCases/{Wallet => TokensTable}/StatsTable.tsx (100%) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Dapps/PortfolioDapps.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Dapps/PortfolioDapps.tsx index 196cd059fc..634517d301 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Dapps/PortfolioDapps.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Dapps/PortfolioDapps.tsx @@ -94,7 +94,7 @@ const PortfolioDapps = ({ data }: Props) => { return ( ({ @@ -31,53 +32,78 @@ interface Props { chartData: any; detailInfo: any; isLoading: boolean; + tokenInfo: TokenInfoType; } -export const TokenMarketPriceOverview = ({ chartData, detailInfo, isLoading = false }: Props): JSX.Element => { +export const TokenMarketPriceOverview = ({ chartData, detailInfo, tokenInfo, isLoading = false }: Props): JSX.Element => { + const isPrimaryToken: boolean = tokenInfo === undefined; const theme: any = useTheme(); const strings = useStrings(); const { unitOfAccount } = usePortfolio(); - // Fetch data based on the selected interval + const ptActivity = useCurrencyPairing().ptActivity; + const { changeValue, changePercent } = priceChange(ptActivity.open, ptActivity.close); + const { - ptActivity: { close, open }, - // config, - } = useCurrencyPairing(); + tokenActivity: { data24h }, + isLoading: isActivityLoading, + } = usePortfolioTokenActivity(); + const secondaryTokenPrice = !isPrimaryToken && data24h ? data24h[tokenInfo?.info?.id] : null; - const { changeValue, changePercent } = priceChange(open, close); + console.log('secondaryTokenPrice', { + secondaryTokenPrice, + isPrimaryToken, + secondaryTokenPriceNUll: secondaryTokenPrice === null, + condition: isPrimaryToken && secondaryTokenPrice === null, + }); + + const priceChangeProcent = isPrimaryToken ? detailInfo?.changePercent || changePercent : 0.1; + const priceChangeValue = isPrimaryToken ? detailInfo?.changeValue || changeValue : 0.23; return ( - - {isLoading ? ( - - ) : ( - - {strings.marketPrice} - - )} + + + {strings.marketPrice} + + - {isLoading || chartData === undefined ? ( - - ) : ( - - - {formatNumber(detailInfo?.value || chartData[0]?.value)} - -  {unitOfAccount} - - + + + + {chartData === undefined ? ( + + ) : ( - - + + - - )} + )} + ); }; +const TokenPrice = ({ isPrimaryToken, unitOfAccount, secondaryTokenActivity, ptActivity }) => { + const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryTokenActivity && secondaryTokenActivity[1].price.close; + if (tokenPrice == null) return ; + + return ( + + {formatPriceChange(tokenPrice)} + +  {unitOfAccount} + + + ); +}; + const PriceChangeChip = ({ value }: { value: number }) => { const theme: any = useTheme(); return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx index 629a1354ad..0509dc6c48 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx @@ -78,16 +78,13 @@ export const TokenChartInterval = ({ tokenInfo }: Props): JSX.Element => { chartData={chartData} detailInfo={detailInfo} isLoading={isFetching || !data || chartData === undefined} + tokenInfo={tokenInfo} /> ); } return ( - + { const isPrimaryToken: boolean = tokenInfo.id === '-'; const tokenTotalAmount = isPrimaryToken ? walletBalance?.ada : tokenInfo.totalAmount; + // const { + // tokenActivity: { data24h }, + // // isLoading: isActivityLoading, + // } = usePortfolioTokenActivity(); + // const tokenPrice = data24h && data24h[1].price.close; + // // TODOOOO + return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx similarity index 100% rename from packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/StatsTable.tsx rename to packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx index a86061ba4a..2fd59391a7 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx @@ -5,7 +5,7 @@ import PortfolioHeader from '../../common/components/PortfolioHeader'; import WelcomeBanner from '../../common/components/WelcomeBanner'; import { useStrings } from '../../common/hooks/useStrings'; import { usePortfolio } from '../../module/PortfolioContextProvider'; -import StatsTable from './StatsTable'; +import StatsTable from '../TokensTable/StatsTable'; const PortfolioWallet = (): JSX.Element => { const theme = useTheme(); @@ -55,7 +55,7 @@ const PortfolioWallet = (): JSX.Element => { return ( number | Promise; // Function type for getCurrentPrice diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index cd91ff6f88..899f4f744c 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -224,8 +224,6 @@ export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undef stakingAddress: selectedWallet.stakingAddress, walletBalance: { ada: `${beforeDecimalRewards}${afterDecimalRewards}`, - fiatAmount: fiatDisplay || 0, // to be removed - currency: currency === null ? 'USD' : currency, }, assetList: assetList, }; From 617c5a44c1439366d0b44936156605b5bd7dafa0 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 26 Sep 2024 15:01:47 +0300 Subject: [PATCH 33/58] add total amount on non ada tokens --- .../ChartDetails/MarketPriceOverview.tsx | 21 +++++----- .../ChartDetails/TokenChartInterval.tsx | 6 ++- .../TokenDetails/HeaderDetails/Header.tsx | 40 +++++++++++++++---- .../useCases/TokensTable/StatsTable.tsx | 12 +++--- 4 files changed, 54 insertions(+), 25 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx index cbd924df39..7eed14ed25 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx @@ -47,19 +47,16 @@ export const TokenMarketPriceOverview = ({ chartData, detailInfo, tokenInfo, isL const { tokenActivity: { data24h }, - isLoading: isActivityLoading, } = usePortfolioTokenActivity(); - const secondaryTokenPrice = !isPrimaryToken && data24h ? data24h[tokenInfo?.info?.id] : null; - console.log('secondaryTokenPrice', { - secondaryTokenPrice, - isPrimaryToken, - secondaryTokenPriceNUll: secondaryTokenPrice === null, - condition: isPrimaryToken && secondaryTokenPrice === null, - }); + const priceChangeProcent = isPrimaryToken + ? detailInfo?.changePercent || changePercent + : data24h && data24h[tokenInfo?.info?.id][1].price.change; + const priceChangeValue = isPrimaryToken + ? detailInfo?.changeValue || changeValue + : data24h && data24h[tokenInfo?.info?.id][1].price.close; - const priceChangeProcent = isPrimaryToken ? detailInfo?.changePercent || changePercent : 0.1; - const priceChangeValue = isPrimaryToken ? detailInfo?.changeValue || changeValue : 0.23; + // console.log('priceChangeProcent', data24h && data24h[tokenInfo?.info?.id][1]?.price); return ( @@ -80,8 +77,8 @@ export const TokenMarketPriceOverview = ({ chartData, detailInfo, tokenInfo, isL ) : ( - - + + )} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx index 0509dc6c48..8fef75ed93 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx @@ -84,7 +84,11 @@ export const TokenChartInterval = ({ tokenInfo }: Props): JSX.Element => { } return ( - + { const isPrimaryToken: boolean = tokenInfo.id === '-'; const tokenTotalAmount = isPrimaryToken ? walletBalance?.ada : tokenInfo.totalAmount; - // const { - // tokenActivity: { data24h }, - // // isLoading: isActivityLoading, - // } = usePortfolioTokenActivity(); - // const tokenPrice = data24h && data24h[1].price.close; - // // TODOOOO + if (tokenInfo.quantity === null) { + return <>; + } + + const { + ptActivity: { close: ptPrice }, + } = useCurrencyPairing(); + + const { + tokenActivity: { data24h }, + // isLoading: isActivityLoading, + } = usePortfolioTokenActivity(); + + const totaPriceCalc = React.useMemo(() => { + if (!isPrimaryToken) { + const tokenPrice = data24h && data24h[tokenInfo.info.id][1]?.price.close; + const tokenQuantityAsBigInt = bigNumberToBigInt(tokenInfo.quantity); + const tokenDecimals = !isPrimaryToken && tokenInfo.info.numberOfDecimals; + + const totaPrice = atomicBreakdown(tokenQuantityAsBigInt, tokenDecimals) + .bn.times(tokenPrice ?? 1) + .times(String(ptPrice)) + .toFormat(tokenDecimals); + return totaPrice; + } + return 0; + }, [data24h, ptPrice]); return ( @@ -46,7 +71,8 @@ const HeaderSection = ({ tokenInfo }: Props): JSX.Element => { - {tokenInfo.totalAmountFiat} {isPrimaryToken && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} + {isPrimaryToken ? tokenInfo.totalAmountFiat : totaPriceCalc}{' '} + {isPrimaryToken && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx index a3f254ef27..5ee37ba68a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx @@ -230,10 +230,12 @@ const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { if (ptPrice == null) return `... ${currency}`; - const totaPrice = atomicBreakdown(tokenQuantityAsBigInt, decimals) - .bn.times(tokenPrice ?? 1) - .times(showingAda ? 1 : String(ptPrice)) - .toFormat(decimals); + const totaPrice = + ptPrice && + atomicBreakdown(tokenQuantityAsBigInt, decimals) + .bn.times(tokenPrice ?? 1) + .times(showingAda ? 1 : String(ptPrice)) + .toFormat(decimals); const totalTokenPrice = isPrimary && showingAda ? accountPair?.to.value : totaPrice; const totalTicker = isPrimary && showingAda ? accountPair?.to.name : accountPair?.from.name; @@ -277,7 +279,7 @@ const TokenProcentage = ({ procentage }) => { ); }; -function bigNumberToBigInt(bn: BigNumber): bigint { +export function bigNumberToBigInt(bn: BigNumber): bigint { // Convert BigNumber to a string representation of a whole number const wholeNumberString = bn.toFixed(0); // 0 means no decimals From d6db64b211502412e65719790117522e5e524a46 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Fri, 27 Sep 2024 10:54:04 +0300 Subject: [PATCH 34/58] updates - wip --- packages/yoroi-extension/app/Routes.js | 262 ++-- .../components/ilustrations/WelcomeWallet.tsx | 1325 +++++++++++++++++ .../common/components/WelcomeBanner.tsx | 34 +- .../portfolio/common/hooks/useStrings.ts | 11 +- .../common/hooks/useTokenPercentages.tsx | 2 +- .../module/PortfolioContextProvider.tsx | 8 +- .../useCases/TokensTable/StatsTable.tsx | 31 +- .../useCases/Wallet/PortfolioWallet.tsx | 11 +- .../app/i18n/locales/en-US.json | 4 +- .../app/stores/stateless/sidebarCategories.js | 16 +- 10 files changed, 1531 insertions(+), 173 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/components/ilustrations/WelcomeWallet.tsx diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index 39c5b6fb74..3a4bd34483 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -204,135 +204,127 @@ export const Routes = (stores: StoresMap, actions: ActionsMap): Node => { - } /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - wrapAssets({ ...props, stores, actions }, AssetsSubpages(stores, actions))} - /> - wrapNFTs({ ...props, stores, actions }, NFTsSubPages(stores, actions))} - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - wrapWallet({ ...props, stores, actions }, WalletsSubpages(stores, actions))} - /> - wrapSettings({ ...props, stores, actions }, SettingsSubpages(stores, actions))} - /> - wrapSwap({ ...props, stores, actions }, SwapSubpages(stores, actions))} - /> - } /> - } - /> - } - /> - } - /> - } - /> - } - /> - - {/* NEW UI Routes */} - wrapGovernance({ ...props, stores, actions }, GovernanceSubpages(stores, actions))} - /> - wrapPortfolio({ ...props, stores, actions }, PortfolioSubpages(stores, actions))} - /> - - + } /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } /> + wrapAssets({ ...props, stores, actions }, AssetsSubpages(stores, actions))} + /> + wrapNFTs({ ...props, stores, actions }, NFTsSubPages(stores, actions))} + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + wrapWallet({ ...props, stores, actions }, WalletsSubpages(stores, actions))} + /> + wrapSettings({ ...props, stores, actions }, SettingsSubpages(stores, actions))} + /> + wrapSwap({ ...props, stores, actions }, SwapSubpages(stores, actions))} + /> + } /> + } + /> + } + /> + } /> + } + /> + } + /> + + {/* NEW UI Routes */} + wrapGovernance({ ...props, stores, actions }, GovernanceSubpages(stores, actions))} + /> + wrapPortfolio({ ...props, stores, actions }, PortfolioSubpages(stores, actions))} + /> + + @@ -511,7 +503,6 @@ const GovernanceSubpages = (stores, actions) => ( export function wrapSwap(swapProps: StoresAndActionsProps, children: Node): Node { // const queryClient = new QueryClient(); - const loader = ( @@ -591,9 +582,18 @@ export function wrapGovernance(governanceProps: StoresAndActionsProps, children: export function wrapPortfolio(portfolioProps: StoresAndActionsProps, children: Node): Node { const currentWalletInfo = createCurrrentWalletInfo(portfolioProps.stores); + const openDialogWrapper = (dialog): void => { + portfolioProps.actions.router.goToRoute.trigger({ route: ROUTES.MY_WALLETS }); + portfolioProps.actions.dialogs.open.trigger({ dialog }); + }; + return ( - + {children} diff --git a/packages/yoroi-extension/app/UI/components/ilustrations/WelcomeWallet.tsx b/packages/yoroi-extension/app/UI/components/ilustrations/WelcomeWallet.tsx new file mode 100644 index 0000000000..5a2d77beaf --- /dev/null +++ b/packages/yoroi-extension/app/UI/components/ilustrations/WelcomeWallet.tsx @@ -0,0 +1,1325 @@ +import React from 'react'; + +export const WelcomeWallet = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx index 929b1aae6d..8a49d544a8 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx @@ -1,39 +1,45 @@ -import React from 'react'; import { Box, Stack, Typography, styled, useTheme } from '@mui/material'; -import NavigationButton from './NavigationButton'; +import React from 'react'; +import { WelcomeWallet } from '../../../../components/ilustrations/WelcomeWallet'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; import { useNavigateTo } from '../hooks/useNavigateTo'; import { useStrings } from '../hooks/useStrings'; -import bannerYoroiWalletPng from '../assets/illustrations/banner-yoroi-wallet.png'; +import NavigationButton from './NavigationButton'; const Container = styled(Box)(({ theme }: any) => ({ borderRadius: `${theme.shape.borderRadius}px !important`, - backgroundImage: theme.palette.ds.bg_gradient_2, + backgroundImage: theme.palette.ds.bg_gradient_1, + height: '194px', + position: 'relative', })); const WelcomeBanner = () => { const theme = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); + const { openBuyDialog } = usePortfolio(); return ( - - - - + + + + {strings.welcomeBannerTitle} - {strings.welcomeBannerDesc} + + {strings.welcomeBannerDesc} + - - navigateTo.swapPage()} label={strings.swap} /> - navigateTo.sendPage()} label={strings.send} /> - navigateTo.receivePage()} label={strings.receive} /> + + openBuyDialog()} label={strings.buyAda} /> - + + + ); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useStrings.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useStrings.ts index fd68b114d8..82622a5c9a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useStrings.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useStrings.ts @@ -1,5 +1,6 @@ import React from 'react'; import { defineMessages } from 'react-intl'; +import globalMessages from '../../../../../i18n/global-messages'; import { useIntl } from '../../../../context/IntlProvider'; export const messages = Object.freeze( @@ -80,6 +81,10 @@ export const messages = Object.freeze( id: 'portfolio.button.send', defaultMessage: '!!!Send', }, + buyAda: { + id: 'button.buyAda', + defaultMessage: '!!!button.buyAda', + }, receive: { id: 'portfolio.button.receive', defaultMessage: '!!!Receive', @@ -310,12 +315,11 @@ export const messages = Object.freeze( }, welcomeBannerTitle: { id: 'portfolio.welcomeBanner.title', - defaultMessage: '!!!Welcome to Yoroi', + defaultMessage: '!!!Start your crypto journey', }, welcomeBannerDesc: { id: 'portfolio.welcomeBanner.description', - defaultMessage: - '!!!With new features and upgraded performance, transactions can be done faster and more securely than ever before.', + defaultMessage: '!!!Get started with Cardanos native currency, ADA. Its your key to unlocking a world of possibilities', }, }) ); @@ -341,6 +345,7 @@ export const useStrings = () => { swap: intl.formatMessage(messages.swap), send: intl.formatMessage(messages.send), receive: intl.formatMessage(messages.receive), + buyAda: intl.formatMessage(globalMessages.buyAda), liquidityPool: intl.formatMessage(messages.liquidityPool), openOrders: intl.formatMessage(messages.openOrders), lendAndBorrow: intl.formatMessage(messages.lendAndBorrow), diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx index 79de6833c3..b208e1c38b 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx @@ -39,7 +39,7 @@ export const useTokenPercentages = (tokens: any[]): TokenWithPercentage[] => { '533bb94a8850ee3ccbe483106489399112b74c905342cb1792a797a0.494e4459': '1.11', '9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77.53554e444145': '9.87', '420000029ad9527271b1b1e3c27ee065c18df70a4a4cfc3093a41a44.41584f': '0.54', - '208a2ca888886921513cb777bb832a8dc685c04de990480151f12150.53484942414441': '0.01', + '208a2ca888886921513cb777bb832a8dc685c04de990480151f12150.53484942414441': '0.00', '29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6.4d494e': '2.53', 'af2e27f580f7f08e93190a81f72462f153026d06450924726645891b.44524950': '1.96', 'f43a62fdc3965df486de8a0d32fe800963589c41b38946602a0dc535.41474958': '1.62', diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index 408c0344e3..0d95c042b0 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -10,6 +10,8 @@ import { defaultPortfolioState, } from './state'; +import BuySellDialog from '../../../../components/buySell/BuySellDialog'; + const initialPortfolioProvider = { ...defaultPortfolioState, ...defaultPortfolioActions, @@ -27,6 +29,7 @@ type PortfolioProviderProps = { accountPair: AccountPair; }; currentWallet: CurrentWalletType; + openDialogWrapper: (dialog: React.ReactNode) => void; }; export const PortfolioContextProvider = ({ @@ -37,6 +40,7 @@ export const PortfolioContextProvider = ({ accountPair: null, }, currentWallet, + openDialogWrapper, }: PortfolioProviderProps) => { const { walletBalance, assetList, selectedWallet, networkId, primaryTokenInfo } = currentWallet; if (selectedWallet === undefined) { @@ -75,8 +79,10 @@ export const PortfolioContextProvider = ({ assetList: assetList || [], networkId, primaryTokenInfo, + openBuyDialog: () => openDialogWrapper(BuySellDialog), + showWelcomeBanner: assetList.length === 1, }), - [state, actions] + [state, actions, assetList] ); return {children}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx index 5ee37ba68a..30fadbb71f 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx @@ -31,11 +31,13 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { const strings = useStrings(); const { unitOfAccount } = usePortfolio(); const [{ order, orderBy }, setSortState] = useState({ - order: null, - orderBy: null, + order: 'asc', + orderBy: 'portfolioPercents', }); const list = useMemo(() => [...data], [data]); + console.log('order', order, orderBy); + const { tokenActivity: { data24h, data7d, data30d }, // isLoading: isActivityLoading, @@ -204,7 +206,27 @@ const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, is const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { const theme: any = useTheme(); - const { accountPair, primaryTokenInfo, walletBalance } = usePortfolio(); + const { accountPair, primaryTokenInfo, walletBalance, showWelcomeBanner } = usePortfolio(); + + // TODO refactor this properly + if (showWelcomeBanner) { + return ( + + + + {0} {token.name} + + {token.name === accountPair?.to.name ? ( + + ) : ( + + {0} {accountPair?.to.name || 'USD'} + + )} + + + ); + } if (secondaryToken24Activity === null) { return ( @@ -270,11 +292,12 @@ const TokenPrice = ({ unitOfAccount, secondaryToken24Activity, ptActivity, isPri }; const TokenProcentage = ({ procentage }) => { + const { showWelcomeBanner } = usePortfolio(); if (procentage === undefined) return ; return ( - {procentage}% + {showWelcomeBanner ? 0 : procentage}% ); }; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx index 2fd59391a7..aeb4f12c44 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx @@ -10,28 +10,23 @@ import StatsTable from '../TokensTable/StatsTable'; const PortfolioWallet = (): JSX.Element => { const theme = useTheme(); const strings = useStrings(); - const { walletBalance, assetList } = usePortfolio(); + const { walletBalance, assetList, showWelcomeBanner } = usePortfolio(); const [keyword, setKeyword] = useState(''); const [isLoading, _] = useState(false); const [tokenList, setTokenList] = useState(assetList); - const isShownWelcomeBanner: boolean = assetList.length === 1; // assumming only have ADA as default -> first time user useEffect(() => { - if (isShownWelcomeBanner) return; - // FAKE FETCHING DATA TO SEE SKELETON // setIsLoading(true); - // const timer = setTimeout(() => { // setIsLoading(false); // }, 2000); - // return () => clearTimeout(timer); }, []); useEffect(() => { - if (!keyword || isShownWelcomeBanner) { + if (!keyword || showWelcomeBanner) { setTokenList(assetList); return; } @@ -73,7 +68,7 @@ const PortfolioWallet = (): JSX.Element => { } /> - {isShownWelcomeBanner && } + {showWelcomeBanner && } ); }; diff --git a/packages/yoroi-extension/app/i18n/locales/en-US.json b/packages/yoroi-extension/app/i18n/locales/en-US.json index 360851953d..0204d604b2 100644 --- a/packages/yoroi-extension/app/i18n/locales/en-US.json +++ b/packages/yoroi-extension/app/i18n/locales/en-US.json @@ -1168,6 +1168,6 @@ "portfolio.orderTable.header.assetPrice": "Asset price", "portfolio.orderTable.header.assetAmount": "Asset amount", "portfolio.orderTable.header.transactionId": "Transaction ID", - "portfolio.welcomeBanner.title": "Welcome to Yoroi", - "portfolio.welcomeBanner.description": "With new features and upgraded performance, transactions can be done faster and more securely than ever before." + "portfolio.welcomeBanner.title": "Start your crypto journey", + "portfolio.welcomeBanner.description": "Get started with Cardanos native currency, ADA. Its your key to unlocking a world of possibilities." } diff --git a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js index 0b26fe76fe..cd5be8a762 100644 --- a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js +++ b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js @@ -2,7 +2,6 @@ import type { MessageDescriptor } from 'react-intl'; import { ReactComponent as dappConnectorIcon } from '../../assets/images/dapp-connector/dapp-connector.inline.svg'; import { ReactComponent as walletsIcon } from '../../assets/images/sidebar/my_wallets.inline.svg'; -import { ReactComponent as assetsIcon } from '../../assets/images/sidebar/revamp/assets.inline.svg'; import { ReactComponent as governanceIcon } from '../../assets/images/sidebar/revamp/governance.inline.svg'; import { ReactComponent as nftsIcon } from '../../assets/images/sidebar/revamp/nfts.inline.svg'; import { ReactComponent as portfolioIcon } from '../../assets/images/sidebar/revamp/portfolio.inline.svg'; @@ -17,7 +16,6 @@ import { ReactComponent as goBackIcon } from '../../assets/images/top-bar/back-a import environment from '../../environment'; import globalMessages, { connectorMessages } from '../../i18n/global-messages'; import { ROUTES } from '../../routes-config'; -import type { WalletState } from '../../../chrome/extension/background/types'; export type SidebarCategory = {| +className: string, @@ -131,13 +129,13 @@ export const allCategoriesRevamp: Array = [ label: globalMessages.sidebarSwap, isVisible: ({ selected }) => (environment.isDev() || environment.isNightly()) && !selected?.isTestnet, }, - { - className: 'assets', - route: ROUTES.ASSETS.ROOT, - icon: assetsIcon, - label: globalMessages.sidebarAssets, - isVisible: _request => _request.selected !== null, - }, + // { + // className: 'assets', + // route: ROUTES.ASSETS.ROOT, + // icon: assetsIcon, + // label: globalMessages.sidebarAssets, + // isVisible: _request => _request.selected !== null, + // }, { className: 'portfolio', route: ROUTES.PORTFOLIO.ROOT, From 08e3ba568068bf8160d9b108d467a818b963513a Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Wed, 2 Oct 2024 14:36:31 +0300 Subject: [PATCH 35/58] fix ts --- package-lock.json | 818 ++++++++++++++++++ package.json | 2 + packages/yoroi-extension/.eslintrc.js | 6 +- packages/yoroi-extension/app/Routes.js | 1 + .../UI/features/governace/common/helpers.ts | 95 -- .../module/GovernanceContextProvider.tsx | 4 +- .../portfolio/common/components/PlnTag.tsx | 14 +- .../common/components/PortfolioHeader.tsx | 12 +- .../common/components/WelcomeBanner.tsx | 5 +- .../common/hooks/useTokenPercentages.tsx | 27 +- .../module/PortfolioContextProvider.tsx | 8 +- .../module/PortfolioTokenActivityProvider.tsx | 26 +- .../app/UI/features/portfolio/module/state.ts | 10 +- .../ChartDetails/MarketPriceOverview.tsx | 25 +- .../ChartDetails/TokenChartInterval.tsx | 14 +- .../TokenDetails/HeaderDetails/Header.tsx | 17 +- .../OverviewPerformanceDetails/Overview.tsx | 5 +- .../useCases/TokenDetails/TokenDetails.tsx | 5 +- .../useCases/TokensTable/StatsTable.tsx | 172 +--- .../useCases/TokensTable/TableColumnsChip.tsx | 184 ++++ .../useCases/Wallet/PortfolioWallet.tsx | 8 +- .../pages/portfolio/PortfolioDetailPage.tsx | 7 +- .../app/UI/types/currrentWallet.ts | 33 +- .../yoroi-extension/app/UI/types/tokenInfo.ts | 8 +- .../app/UI/utils/createCurrentWalletInfo.ts | 46 +- .../app/UI/utils/getNetworkUrl.ts | 2 - .../app/UI/utils/useMultiTokenActivity.ts | 11 +- 27 files changed, 1116 insertions(+), 449 deletions(-) create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx diff --git a/package-lock.json b/package-lock.json index 836d3ef08d..c7be7171e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,6 +6,8 @@ "": { "name": "root", "devDependencies": { + "@typescript-eslint/eslint-plugin": "^8.8.0", + "@typescript-eslint/parser": "^8.8.0", "concurrently": "^7.0.0", "husky": "4.3.8", "lerna": "^4.0.0", @@ -134,12 +136,146 @@ "node": ">=10.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", + "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "peer": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", @@ -1519,6 +1655,20 @@ "node": ">= 6" } }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "peer": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "peer": true + }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -1543,6 +1693,212 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz", + "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/type-utils": "8.8.0", + "@typescript-eslint/utils": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.0.tgz", + "integrity": "sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/typescript-estree": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", + "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz", + "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.8.0", + "@typescript-eslint/utils": "8.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", + "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", + "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", + "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/typescript-estree": "8.8.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", + "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.8.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", @@ -1593,6 +1949,29 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", @@ -1744,6 +2123,13 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -2709,6 +3095,13 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "peer": true + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -3070,6 +3463,214 @@ "node": ">=0.8.0" } }, + "node_modules/eslint": { + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", + "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.11.1", + "@eslint/plugin-kit": "^0.2.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", + "@nodelib/fs.walk": "^1.2.8", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -3156,6 +3757,13 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -3189,6 +3797,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -3250,6 +3871,27 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "peer": true + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3719,6 +4361,19 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -3773,6 +4428,12 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -4506,6 +5167,16 @@ "node": ">=8" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -4684,12 +5355,32 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "peer": true + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -4714,6 +5405,13 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -4772,6 +5470,16 @@ "node": ">=0.6.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -4813,6 +5521,20 @@ "node": ">= 10.18.0" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/libnpmaccess": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-4.0.3.tgz", @@ -5023,6 +5745,13 @@ "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "peer": true + }, "node_modules/lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -5559,6 +6288,12 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -6046,6 +6781,24 @@ "opencollective-postinstall": "index.js" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -6476,6 +7229,16 @@ "node": ">= 0.4" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -7673,6 +8436,19 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -7786,6 +8562,13 @@ "node": ">=0.10" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -7868,6 +8651,18 @@ "node": ">=8" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-loader": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", @@ -7921,6 +8716,19 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -8353,6 +9161,16 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index eb31e1a028..1a20efb397 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "archive:src": "func() { git rev-parse HEAD > COMMIT && git rev-parse --abbrev-ref HEAD > BRANCH && git archive --format zip --add-file COMMIT --add-file BRANCH -o $1 HEAD && rm COMMIT BRANCH; }; func" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^8.8.0", + "@typescript-eslint/parser": "^8.8.0", "concurrently": "^7.0.0", "husky": "4.3.8", "lerna": "^4.0.0", diff --git a/packages/yoroi-extension/.eslintrc.js b/packages/yoroi-extension/.eslintrc.js index 6dfff90a5e..13e52685ac 100644 --- a/packages/yoroi-extension/.eslintrc.js +++ b/packages/yoroi-extension/.eslintrc.js @@ -10,10 +10,7 @@ module.exports = { legacyDecorators: true, }, }, - extends: [ - 'airbnb', - 'prettier', - ], + extends: ['airbnb', 'prettier'], env: { browser: true, mocha: true, @@ -136,6 +133,7 @@ module.exports = { 'no-floating-promise', 'prettier', 'eslint-plugin-simple-import-sort', + '@typescript-eslint', ], globals: { chrome: true, diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index 075696dddd..b4f73be48d 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -576,6 +576,7 @@ export function wrapGovernance(governanceProps: StoresAndActionsProps, children: txDelegationError={delegationTxError} tokenInfo={governanceProps.stores.tokenInfoStore.tokenInfo} triggerBuySellAdaDialog={() => governanceProps.actions.dialogs.open.trigger({ dialog: BuySellDialog })} + getCurrentPrice={governanceProps.stores.coinPriceStore.getCurrentPrice} > {children}; diff --git a/packages/yoroi-extension/app/UI/features/governace/common/helpers.ts b/packages/yoroi-extension/app/UI/features/governace/common/helpers.ts index cad40588e0..9366bc060f 100644 --- a/packages/yoroi-extension/app/UI/features/governace/common/helpers.ts +++ b/packages/yoroi-extension/app/UI/features/governace/common/helpers.ts @@ -1,7 +1,4 @@ import BigNumber from 'bignumber.js'; -import moment from 'moment'; -import { getNetworkById } from '../../../../api/ada/lib/storage/database/prepackaged/networks'; -import { genLookupOrFail } from '../../../../stores/stateless/tokenHelpers'; import { calculateAndFormatValue } from '../../../../utils/unit-of-account'; export const mapStakingKeyStateToGovernanceAction = (state: any) => { @@ -14,65 +11,6 @@ export const mapStakingKeyStateToGovernanceAction = (state: any) => { : { kind: 'delegate', drepID: vote.drepID }; }; -const getStakePoolMeta = (stores: any) => { - const publicDeriver = stores.wallets.selected; - const delegationStore = stores.delegation; - const currentPool = delegationStore.getDelegatedPoolId(publicDeriver); - if (currentPool == null) return null; - const networkInfo = publicDeriver.getParent().getNetworkInfo(); - const poolMeta = delegationStore.getLocalPoolInfo(networkInfo, currentPool); - const poolInfo = delegationStore.getLocalRemotePoolInfo(networkInfo, currentPool) ?? {}; - if (poolMeta == null) { - // server hasn't returned information about the stake pool yet - return null; - } - const name = poolMeta.info?.name ?? 'unknown'; - const delegatedPool = { - id: String(currentPool), - name, - websiteUrl: poolMeta.info?.homepage, - ticker: poolMeta.info?.ticker, - ...poolInfo, - }; - - return { - ...delegatedPool, - ...poolMeta, - }; -}; - -export const createCurrrentWalletInfo = (stores: any) => { - const { wallets } = stores; - const walletCurrentPoolInfo = getStakePoolMeta(stores); - - const selectedWallet /*: WalletState */ = wallets.selectedOrFail; - const walletAdaBalance /*: MultiToken */ = getWalletTotalAdaBalance(stores, selectedWallet); - - const isHardware: boolean = selectedWallet.isHardware; - const walletId: number = selectedWallet.publicDeriverId; - const networkId = selectedWallet.networkId; - const networkInfo /*: $ReadOnly */ = getNetworkById(selectedWallet.networkId); - const { BackendService, BackendServiceZero } = networkInfo.Backend; - - const groupedTx = groupTransactionsByDay(stores.transactions.recent); - return { - currentPool: walletCurrentPoolInfo, - networkId, - walletId, - selectedWallet, - walletAdaBalance: walletAdaBalance.toNumber(), - unitOfAccount: stores.profile.unitOfAccount, - defaultTokenInfo: stores.tokenInfoStore.getDefaultTokenInfoSummary(networkId), - getCurrentPrice: stores.coinPriceStore.getCurrentPrice, - recentTransactions: groupedTx ? groupedTx : [], - submitedTransactions: selectedWallet.submittedTransactions, - isHardwareWallet: isHardware, - backendService: BackendService, - backendServiceZero: BackendServiceZero, - stakingAddress: selectedWallet.stakingAddress, - }; -}; - // extract this and fix all places where it's duplicated export const getFormattedPairingValue = (getCurrentPrice, defaultTokenInfo, unitOfAccount, lovelaces: string): string => { const { currency } = unitOfAccount; @@ -82,36 +20,3 @@ export const getFormattedPairingValue = (getCurrentPrice, defaultTokenInfo, unit const val = price ? calculateAndFormatValue(shiftedAmount, price) : '-'; return `${val} ${currency}`; }; - -const combinedMultiToken = (walletAmount /*: MultiToken */, rewards /*: MultiToken */) /*: MultiToken */ => { - return walletAmount && rewards ? walletAmount.joinAddCopy(rewards) : walletAmount ?? rewards; -}; - -const getWalletTotalAdaBalance = (stores, selectedWallet /*: WalletState */) /*: MultiToken */ => { - const balance = selectedWallet.balance; - const rewardBalance /*: MultiToken */ = stores.delegation.getRewardBalanceOrZero(selectedWallet); - const totalBalance /*: MultiToken */ = combinedMultiToken(balance, rewardBalance); - const defaultEntry = totalBalance?.getDefaultEntry(); - if (defaultEntry == null) return new BigNumber(0); - const getTokenInfo = genLookupOrFail(stores.tokenInfoStore.tokenInfo); - const tokenInfo = getTokenInfo(defaultEntry); - return defaultEntry.amount.shiftedBy(-tokenInfo.Metadata.numberOfDecimals); -}; - -const dateFormat = 'YYYY-MM-DD'; - -const groupTransactionsByDay = transactions => { - const groups: any = []; - for (const transaction of transactions) { - const date: string = moment(transaction.date).format(dateFormat); - // find the group this transaction belongs in - let group = groups.find(g => g.date === date); - // if first transaction in this group, create the group - if (!group) { - group = { date, transactions: [] }; - groups.push(group); - } - group.transactions.push(transaction); - } - return groups.sort((a, b) => b.transactions[0].date.getTime() - a.transactions[0].date.getTime()); -}; diff --git a/packages/yoroi-extension/app/UI/features/governace/module/GovernanceContextProvider.tsx b/packages/yoroi-extension/app/UI/features/governace/module/GovernanceContextProvider.tsx index 0cc6195b70..3677db7fdb 100644 --- a/packages/yoroi-extension/app/UI/features/governace/module/GovernanceContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/governace/module/GovernanceContextProvider.tsx @@ -11,6 +11,7 @@ import { useGovernanceManagerMaker } from '../common/useGovernanceManagerMaker'; import { GovernanceActionType, GovernanceReducer, defaultGovernanceActions, defaultGovernanceState } from './state'; type drepDelegation = { status: string | null; drep: string | null }; +type GetCurrentPrice = (from: string, to: string) => number | Promise; const initialGovernanceProvider = { ...defaultGovernanceState, @@ -44,6 +45,7 @@ type GovernanceProviderProps = { signDelegationTransaction: (params: any) => Promise; tokenInfo: any; triggerBuySellAdaDialog: any; + getCurrentPrice: GetCurrentPrice; }; export const GovernanceContextProvider = ({ @@ -55,6 +57,7 @@ export const GovernanceContextProvider = ({ signDelegationTransaction, tokenInfo, triggerBuySellAdaDialog, + getCurrentPrice, }: GovernanceProviderProps) => { if (!currentWallet?.selectedWallet) throw new Error(`requires a wallet to be selected`); const [state, dispatch] = React.useReducer(GovernanceReducer, { @@ -70,7 +73,6 @@ export const GovernanceContextProvider = ({ backendService, defaultTokenInfo, unitOfAccount, - getCurrentPrice, isHardwareWallet, walletAdaBalance, backendServiceZero, diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx index ad2887c4d4..9d2a580ce9 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PlnTag.tsx @@ -9,7 +9,7 @@ interface Props { style?: React.CSSProperties; } -const IconWrapper = styled(Box)(({ theme, mode }) => ({ +const IconWrapper: any = styled(Box)(({ theme, mode }: any) => ({ height: '16px', '& svg': { '& path': { @@ -42,11 +42,9 @@ const PnlTag = ({ children, withIcon = false, variant = 'neutral' }: Props) => { ); }; -const TagContainer = styled(Box, { +const TagContainer: any = styled(Box, { shouldForwardProp: prop => prop !== 'mode', -})<{ - mode: 'danger' | 'success' | 'neutral'; -}>(({ theme, mode }) => ({ +})(({ theme, mode }: any) => ({ height: '25px', display: 'flex', alignItems: 'center', @@ -57,11 +55,9 @@ const TagContainer = styled(Box, { width: 'auto', })); -const StyledTypography = styled(Typography, { +const StyledTypography: any = styled(Typography, { shouldForwardProp: prop => prop !== 'mode', -})<{ - mode: 'danger' | 'success' | 'neutral'; -}>(({ theme, mode }) => ({ +})(({ theme, mode }: any) => ({ color: getTextColor(theme, mode), fontSize: '12px', })); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index fda5344dcb..954ef79601 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -1,4 +1,5 @@ import { Box, Stack, Typography, useTheme } from '@mui/material'; +import BigNumber from 'bignumber.js'; import React from 'react'; import { SearchInput, Skeleton, Tooltip } from '../../../../components'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; @@ -56,8 +57,8 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: const handleCurrencyChange = () => { changeUnitOfAccountPair({ - from: { name: showADA ? unitOfAccount : 'ADA', value: showADA ? totalTokenPrice : walletBalance.ada }, - to: { name: showADA ? 'ADA' : unitOfAccount, value: showADA ? walletBalance.ada : totalTokenPrice }, + from: { name: showADA ? unitOfAccount ?? 'USD' : 'ADA', value: showADA ? totalTokenPrice ?? '0' : walletBalance.ada }, + to: { name: showADA ? 'ADA' : unitOfAccount ?? 'USD', value: showADA ? walletBalance.ada : totalTokenPrice }, }); }; @@ -109,13 +110,6 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: - {/* {isLoading ? ( - - ) : ( - - {close.toFixed(config.decimals)} {unitOfAccount} - - )} */} {isLoading ? ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx index 8a49d544a8..9de88b8dbe 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx @@ -1,8 +1,7 @@ -import { Box, Stack, Typography, styled, useTheme } from '@mui/material'; +import { Box, Stack, Typography, styled } from '@mui/material'; import React from 'react'; import { WelcomeWallet } from '../../../../components/ilustrations/WelcomeWallet'; import { usePortfolio } from '../../module/PortfolioContextProvider'; -import { useNavigateTo } from '../hooks/useNavigateTo'; import { useStrings } from '../hooks/useStrings'; import NavigationButton from './NavigationButton'; @@ -14,8 +13,6 @@ const Container = styled(Box)(({ theme }: any) => ({ })); const WelcomeBanner = () => { - const theme = useTheme(); - const navigateTo = useNavigateTo(); const strings = useStrings(); const { openBuyDialog } = usePortfolio(); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx index b208e1c38b..e6216ae889 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx @@ -1,5 +1,4 @@ import BigNumber from 'bignumber.js'; -import { useMemo } from 'react'; type Token = { id: string; @@ -16,22 +15,22 @@ type TokenWithPercentage = Token & { }; export const useTokenPercentages = (tokens: any[]): TokenWithPercentage[] => { - const tokenPercentages = useMemo(() => { - if (!tokens || tokens.length === 0) return {}; + // const tokenPercentages = useMemo(() => { + // if (!tokens || tokens.length === 0) return {}; - const totalQuantity = tokens.reduce((acc, token) => { - return acc.plus(token.quantity); - }, new BigNumber(0)); + // const totalQuantity = tokens.reduce((acc, token) => { + // return acc.plus(token.quantity); + // }, new BigNumber(0)); - return tokens.reduce((acc, token) => { - const percentage = totalQuantity.isZero() ? '0.00' : token.quantity.dividedBy(totalQuantity).multipliedBy(100).toFixed(2); + // return tokens.reduce((acc, token) => { + // const percentage = totalQuantity.isZero() ? '0.00' : token.quantity.dividedBy(totalQuantity).multipliedBy(100).toFixed(2); - return { - ...acc, - [token.info.id]: percentage, - }; - }, {} as any); - }, [tokens]); + // return { + // ...acc, + // [token.info.id]: percentage, + // }; + // }, {} as any); + // }, [tokens]); return { // @ts-ignore diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index 0d95c042b0..f7b1a1db03 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -42,7 +42,7 @@ export const PortfolioContextProvider = ({ currentWallet, openDialogWrapper, }: PortfolioProviderProps) => { - const { walletBalance, assetList, selectedWallet, networkId, primaryTokenInfo } = currentWallet; + const { walletBalance, ftAssetList, selectedWallet, networkId, primaryTokenInfo } = currentWallet; if (selectedWallet === undefined) { return <>; } @@ -76,13 +76,13 @@ export const PortfolioContextProvider = ({ ...actions, settingFiatPairUnit, walletBalance, - assetList: assetList || [], + ftAssetList: ftAssetList || [], networkId, primaryTokenInfo, openBuyDialog: () => openDialogWrapper(BuySellDialog), - showWelcomeBanner: assetList.length === 1, + showWelcomeBanner: ftAssetList.length === 1, }), - [state, actions, assetList] + [state, actions, ftAssetList] ); return {children}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index 3faa6c37b5..7f56f05027 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -13,7 +13,7 @@ const defaultPortfolioTokenActivityState: PortfolioTokenActivityState = freeze( { secondaryTokenIds: [], aggregatedBalances: {}, - tokenActivity: { data24h: null }, + tokenActivity: { data24h: {}, data30d: {}, data7d: {} }, activityWindow: Portfolio.Token.ActivityWindow.OneDay, isLoading: false, }, @@ -53,10 +53,10 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { }, }).current; - const { assetList, walletBalance } = usePortfolio(); + const { ftAssetList, walletBalance } = usePortfolio(); React.useEffect(() => { - const listForActivity: any = assetList + const listForActivity: any = ftAssetList .filter(item => item.info?.policyId?.length > 0) .map(item => `${item.info?.policyId}.${item.assetName}`); // @@ -104,12 +104,16 @@ export const usePortfolioTokenActivity = () => type PortfolioTokenActivityState = Readonly<{ secondaryTokenIds: Portfolio.Token.Id[]; - tokenActivity: { data24h: any }; + tokenActivity: { + data24h: Portfolio.Api.TokenActivityResponse; + data7d: Portfolio.Api.TokenActivityResponse; + data30d: Portfolio.Api.TokenActivityResponse; + }; activityWindow: Portfolio.Token.ActivityWindow; isLoading: boolean; }>; -export enum PortfolioTokenActivityActionType { +enum PortfolioTokenActivityActionType { SecondaryTokenIdsChanged = 'SecondaryTokenIdsChanged', TokenActivityChanged = 'TokenActivityChanged', ActivityWindowChanged = 'ActivityWindowChanged', @@ -122,7 +126,11 @@ export type PortfolioTokenActivityAction = } | { type: PortfolioTokenActivityActionType.TokenActivityChanged; - tokenActivity: { data24h: any }; + tokenActivity: { + data24h: Portfolio.Api.TokenActivityResponse; + data7d: Portfolio.Api.TokenActivityResponse; + data30d: Portfolio.Api.TokenActivityResponse; + }; } | { type: PortfolioTokenActivityActionType.ActivityWindowChanged; @@ -150,6 +158,10 @@ export const portfolioTokenActivityReducer = ( export type PortfolioTokenActivityActions = Readonly<{ secondaryTokenIdsChanged: (secondaryTokenIds: Portfolio.Token.Id[]) => void; - tokenActivityChanged: (tokenActivity: { data24: any }) => void; + tokenActivityChanged: (tokenActivity: { + data24h: Portfolio.Api.TokenActivityResponse; + data7d: Portfolio.Api.TokenActivityResponse; + data30d: Portfolio.Api.TokenActivityResponse; + }) => void; activityWindowChanged: (activityWindow: Portfolio.Token.ActivityWindow) => void; }>; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts index da46056f19..894044fdc5 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts @@ -38,7 +38,10 @@ export type PortfolioState = { accountPair: AccountPair | null; walletBalance: WalletBalance | null; networkId: number | null; - assetList: any[]; + ftAssetList: any[]; + showWelcomeBanner: boolean; + primaryTokenInfo: any; + openBuyDialog: () => void; }; // Define default state @@ -51,7 +54,10 @@ export const defaultPortfolioState: PortfolioState = { accountPair: null, walletBalance: null, networkId: null, - assetList: [], + ftAssetList: [], + primaryTokenInfo: null, + showWelcomeBanner: false, + openBuyDialog: () => {}, }; // Define action handlers diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx index 7eed14ed25..a3a180ad52 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx @@ -1,4 +1,4 @@ -import { Button, Stack, Typography, styled } from '@mui/material'; +import { Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import React from 'react'; import { Chip, ChipTypes, Icon, Skeleton } from '../../../../../components'; @@ -9,25 +9,6 @@ import { useStrings } from '../../../common/hooks/useStrings'; import { usePortfolio } from '../../../module/PortfolioContextProvider'; import { usePortfolioTokenActivity } from '../../../module/PortfolioTokenActivityProvider'; -// Styling for the period buttons -const StyledButton = styled(Button)(({ theme, disabled, variant }: { theme: any; disabled: boolean; variant: string }) => ({ - fontWeight: 500, - fontSize: '0.75rem', - lineHeight: '1.125rem', - height: '30px', - padding: '6px !important', - minWidth: '36px', - backgroundColor: - variant === 'contained' ? (disabled ? theme.palette.ds.gray_100 : theme.palette.ds.el_primary_medium) : `transparent`, - - '&.MuiButton-contained': { - color: theme.palette.ds.white_static, - }, - '&.MuiButton-secondary': { - color: disabled ? theme.palette.ds.gray_100 : theme.palette.ds.text_primary_medium, - }, -})); - interface Props { chartData: any; detailInfo: any; @@ -35,8 +16,8 @@ interface Props { tokenInfo: TokenInfoType; } -export const TokenMarketPriceOverview = ({ chartData, detailInfo, tokenInfo, isLoading = false }: Props): JSX.Element => { - const isPrimaryToken: boolean = tokenInfo === undefined; +export const TokenMarketPriceOverview = ({ chartData, detailInfo, tokenInfo }: Props): JSX.Element => { + const isPrimaryToken: boolean = tokenInfo?.id === '-'; const theme: any = useTheme(); const strings = useStrings(); const { unitOfAccount } = usePortfolio(); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx index 8fef75ed93..bd80c39839 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx @@ -2,14 +2,10 @@ import { Box, Button, Stack, styled } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import React, { useState } from 'react'; import { CartesianGrid, Line, LineChart, Tooltip as RechartTooltip, ResponsiveContainer, YAxis } from 'recharts'; -import { useCurrencyPairing } from '../../../../../context/CurrencyContext'; import chartSkeletonPng from '../../../common/assets/images/token-detail-chart-skeleton.png'; import { TOKEN_CHART_INTERVAL } from '../../../common/helpers/constants'; -import { priceChange } from '../../../common/helpers/priceChange'; import useChart from '../../../common/hooks/useChart'; import { useGetPortfolioTokenChart } from '../../../common/hooks/usePortfolioTokenChart'; -import { useStrings } from '../../../common/hooks/useStrings'; -import { usePortfolio } from '../../../module/PortfolioContextProvider'; import { TokenMarketPriceOverview } from './MarketPriceOverview'; // Styling for the period buttons @@ -44,20 +40,11 @@ export const TokenChartInterval = ({ tokenInfo }: Props): JSX.Element => { const chartHeight = isPrimaryToken ? 153 : 257; const theme: any = useTheme(); - const strings = useStrings(); - const { unitOfAccount } = usePortfolio(); // Fetch data based on the selected interval const [timeInterval, setTimeInterval] = useState(TOKEN_CHART_INTERVAL.DAY); const { data, isFetching } = useGetPortfolioTokenChart(timeInterval, tokenInfo); - const { - ptActivity: { close, open }, - // config, - } = useCurrencyPairing(); - - const { changeValue, changePercent } = priceChange(open, close); - const handlePeriodChange = (id: string) => { setTimeInterval(TOKEN_CHART_INTERVAL[id]); }; @@ -93,6 +80,7 @@ export const TokenChartInterval = ({ tokenInfo }: Props): JSX.Element => { chartData={chartData} detailInfo={detailInfo} isLoading={isFetching || !data || chartData === undefined} + tokenInfo={tokenInfo} /> diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx index 07cc0af08a..3592c104fb 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx @@ -1,23 +1,26 @@ import { Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import { atomicBreakdown } from '@yoroi/common'; +import BigNumber from 'bignumber.js'; import React from 'react'; import { useCurrencyPairing } from '../../../../../context/CurrencyContext'; import { useStrings } from '../../../common/hooks/useStrings'; import { usePortfolio } from '../../../module/PortfolioContextProvider'; import { usePortfolioTokenActivity } from '../../../module/PortfolioTokenActivityProvider'; -import { bigNumberToBigInt } from '../../TokensTable/StatsTable'; +import { bigNumberToBigInt } from '../../TokensTable/TableColumnsChip'; interface Props { tokenInfo: TokenInfoType; } const HeaderSection = ({ tokenInfo }: Props): JSX.Element => { + console.log('tokenInfo', tokenInfo); const theme: any = useTheme(); const strings = useStrings(); const { unitOfAccount, walletBalance } = usePortfolio(); const isPrimaryToken: boolean = tokenInfo.id === '-'; - const tokenTotalAmount = isPrimaryToken ? walletBalance?.ada : tokenInfo.totalAmount; + console.log('isPrimaryToken', isPrimaryToken); + const tokenTotalAmount = isPrimaryToken ? walletBalance?.ada : tokenInfo.formatedAmount; if (tokenInfo.quantity === null) { return <>; @@ -33,9 +36,9 @@ const HeaderSection = ({ tokenInfo }: Props): JSX.Element => { } = usePortfolioTokenActivity(); const totaPriceCalc = React.useMemo(() => { - if (!isPrimaryToken) { + if (!isPrimaryToken && data24h) { const tokenPrice = data24h && data24h[tokenInfo.info.id][1]?.price.close; - const tokenQuantityAsBigInt = bigNumberToBigInt(tokenInfo.quantity); + const tokenQuantityAsBigInt = bigNumberToBigInt(new BigNumber(tokenInfo.quantity)); const tokenDecimals = !isPrimaryToken && tokenInfo.info.numberOfDecimals; const totaPrice = atomicBreakdown(tokenQuantityAsBigInt, tokenDecimals) @@ -50,7 +53,7 @@ const HeaderSection = ({ tokenInfo }: Props): JSX.Element => { return ( - {`${tokenInfo.name} ${strings.balance}`} + {`${tokenInfo.info.name} ${strings.balance}`} @@ -66,12 +69,12 @@ const HeaderSection = ({ tokenInfo }: Props): JSX.Element => { padding: `${theme.spacing(1)} 0`, }} > - {tokenInfo.name} + {tokenInfo.info.name} - {isPrimaryToken ? tokenInfo.totalAmountFiat : totaPriceCalc}{' '} + {isPrimaryToken ? tokenInfo.formatedAmount : totaPriceCalc}{' '} {isPrimaryToken && unitOfAccount === 'ADA' ? 'USD' : unitOfAccount} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx index 6038167d43..94a47f532e 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx @@ -22,7 +22,6 @@ const Overview = ({ tokenInfo }: Props): JSX.Element => { // console.log('explorers', explorers); const isPrimary = isPrimaryToken(tokenInfo.info); - console.log('URLL', `${networkUrl}/${tokenInfo?.info.policyId}${tokenInfo?.assetName}`); return ( @@ -34,11 +33,11 @@ const Overview = ({ tokenInfo }: Props): JSX.Element => { borderRadius: `50px`, }} component="img" - src={tokenInfo.tokenLogo || tokenPng} + src={tokenInfo.info.image || tokenPng} > - {tokenInfo?.name} + {tokenInfo?.info.name} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index 24b351f408..62d40dc7fb 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -6,7 +6,6 @@ import { Card } from '../../../../components'; import NavigationButton from '../../common/components/NavigationButton'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useStrings } from '../../common/hooks/useStrings'; -import { usePortfolio } from '../../module/PortfolioContextProvider'; import { TokenChartInterval } from './ChartDetails/TokenChartInterval'; import HeaderSection from './HeaderDetails/Header'; import OverviewPerformance from './OverviewPerformanceDetails/OverviewPerformance'; @@ -24,7 +23,7 @@ interface Props { tokenInfo: TokenInfoType; } -const IconWrapper = styled(Box)(({ theme }) => ({ +const IconWrapper = styled(Box)(({ theme }: any) => ({ '& svg': { '& path': { fill: theme.palette.ds.el_gray_medium, @@ -36,9 +35,7 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); - const { unitOfAccount, walletBalance } = usePortfolio(); const isPrimaryToken: boolean = tokenInfo.id === '-'; - const tokenTotalAmount = isPrimaryToken ? walletBalance?.ada : tokenInfo.totalAmount; return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx index 30fadbb71f..ce32c127f6 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx @@ -1,17 +1,11 @@ -import { Box, Skeleton, Stack, TableCell, TableRow, Typography } from '@mui/material'; +import { TableCell, TableRow } from '@mui/material'; import { useTheme } from '@mui/material/styles'; -import { atomicBreakdown } from '@yoroi/common'; -import BigNumber from 'bignumber.js'; import React, { useMemo, useState } from 'react'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; -import tokenPng from '../../common/assets/images/token.png'; -import PnlTag from '../../common/components/PlnTag'; import Table from '../../common/components/Table'; import { TableRowSkeleton } from '../../common/components/TableRowSkeleton'; import { TOKEN_CHART_INTERVAL } from '../../common/helpers/constants'; -import { formatPriceChange, priceChange } from '../../common/helpers/priceChange'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; -import { useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; import { useStrings } from '../../common/hooks/useStrings'; import useTableSort, { ISortState } from '../../common/hooks/useTableSort'; import { useTokenPercentages } from '../../common/hooks/useTokenPercentages'; @@ -19,13 +13,14 @@ import { TokenType } from '../../common/types/index'; import { IHeadCell } from '../../common/types/table'; import { usePortfolio } from '../../module/PortfolioContextProvider'; import { usePortfolioTokenActivity } from '../../module/PortfolioTokenActivityProvider'; +import { TokenDisplay, TokenPrice, TokenPriceChangeChip, TokenPriceTotal, TokenProcentage } from './TableColumnsChip'; interface Props { data: TokenType[]; isLoading: boolean; } -const StatsTable = ({ data, isLoading }: Props): JSX.Element => { +const StatsTable = ({ data }: Props): JSX.Element => { const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); @@ -150,164 +145,3 @@ const StatsTable = ({ data, isLoading }: Props): JSX.Element => { }; export default StatsTable; - -const TokenDisplay = ({ token }) => { - const theme = useTheme(); - return ( - - - - - {token.name} - - - {token.ticker} - - - - ); -}; - -const TokenPriceChangeChip = ({ secondaryTokenActivity, primaryTokenActivity, isPrimaryToken, timeInterval }) => { - const { data: ptTokenDataInterval, isFetching } = useGetPortfolioTokenChart(timeInterval, { info: { id: '' } }); - - if (secondaryTokenActivity === null || primaryTokenActivity === null || isFetching) { - return ; - } - - const tokenPriceClose = isPrimaryToken - ? primaryTokenActivity.close - : secondaryTokenActivity && secondaryTokenActivity[1].price.close; - - const tokenPriceOpen = isPrimaryToken - ? primaryTokenActivity.open - : secondaryTokenActivity && secondaryTokenActivity[1].price.open; - - const { changePercent, variantPnl } = priceChange(tokenPriceOpen, tokenPriceClose); - - return ( - - - - {formatPriceChange(isPrimaryToken ? ptTokenDataInterval[50]?.changePercent : changePercent)}% - - - - ); -}; - -const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { - const theme: any = useTheme(); - const { accountPair, primaryTokenInfo, walletBalance, showWelcomeBanner } = usePortfolio(); - - // TODO refactor this properly - if (showWelcomeBanner) { - return ( - - - - {0} {token.name} - - {token.name === accountPair?.to.name ? ( - - ) : ( - - {0} {accountPair?.to.name || 'USD'} - - )} - - - ); - } - - if (secondaryToken24Activity === null) { - return ( - - - - - ); - } - - const isPrimary: boolean = token.info.policyId?.length === 0; - - const { - ptActivity: { close: ptPrice }, - } = useCurrencyPairing(); - - const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; - const tokenQuantityAsBigInt = bigNumberToBigInt(token.quantity); - - const showingAda = accountPair?.from.name === 'ADA'; - const currency = accountPair?.from.name; - const decimals = showingAda ? primaryTokenInfo.decimals : token.info.numberOfDecimals; - - if (ptPrice == null) return `... ${currency}`; - - const totaPrice = - ptPrice && - atomicBreakdown(tokenQuantityAsBigInt, decimals) - .bn.times(tokenPrice ?? 1) - .times(showingAda ? 1 : String(ptPrice)) - .toFormat(decimals); - - const totalTokenPrice = isPrimary && showingAda ? accountPair?.to.value : totaPrice; - const totalTicker = isPrimary && showingAda ? accountPair?.to.name : accountPair?.from.name; - - return ( - - - - {isPrimary ? walletBalance?.ada : token.totalAmount} {token.name} - - {token.name === accountPair?.to.name ? ( - - ) : ( - - {totalTokenPrice} {totalTicker || 'USD'} - - )} - - - ); -}; - -const TokenPrice = ({ unitOfAccount, secondaryToken24Activity, ptActivity, isPrimaryToken }) => { - const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryToken24Activity && secondaryToken24Activity[1].price.close; - if (tokenPrice == null) return ; - - return ( - - {formatPriceChange(tokenPrice)} {unitOfAccount} - - ); -}; - -const TokenProcentage = ({ procentage }) => { - const { showWelcomeBanner } = usePortfolio(); - if (procentage === undefined) return ; - - return ( - - {showWelcomeBanner ? 0 : procentage}% - - ); -}; - -export function bigNumberToBigInt(bn: BigNumber): bigint { - // Convert BigNumber to a string representation of a whole number - const wholeNumberString = bn.toFixed(0); // 0 means no decimals - - // Convert the string to BigInt - const bigIntValue = BigInt(wholeNumberString); - - return bigIntValue; -} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx new file mode 100644 index 0000000000..fcb4daa8c5 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx @@ -0,0 +1,184 @@ +import { Box, Skeleton, Stack, Typography } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import { atomicBreakdown } from '@yoroi/common'; +import BigNumber from 'bignumber.js'; +import React from 'react'; +import { useCurrencyPairing } from '../../../../context/CurrencyContext'; +import tokenPng from '../../common/assets/images/token.png'; +import PnlTag from '../../common/components/PlnTag'; +import { formatPriceChange, priceChange } from '../../common/helpers/priceChange'; +import { useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; + +export const TokenDisplay = ({ token }: { token: TokenInfoType }) => { + const theme = useTheme(); + return ( + + + + + {token.info.name} + + + {token.info.name} + + + + ); +}; + +type TokenPriceChangeChipProps = { + secondaryTokenActivity: any; + primaryTokenActivity: any; + isPrimaryToken: any; + timeInterval?: any; +}; + +export const TokenPriceChangeChip = ({ + secondaryTokenActivity, + primaryTokenActivity, + isPrimaryToken, + timeInterval, +}: TokenPriceChangeChipProps) => { + const { data: ptTokenDataInterval, isFetching } = useGetPortfolioTokenChart(timeInterval, { info: { id: '' } }); + + if (secondaryTokenActivity === null || primaryTokenActivity === null || isFetching) { + return ; + } + + const tokenPriceClose = isPrimaryToken + ? primaryTokenActivity.close + : secondaryTokenActivity && secondaryTokenActivity[1].price.close; + + const tokenPriceOpen = isPrimaryToken + ? primaryTokenActivity.open + : secondaryTokenActivity && secondaryTokenActivity[1].price.open; + + const { changePercent, variantPnl } = priceChange(tokenPriceOpen, tokenPriceClose); + + return ( + + + + {formatPriceChange(isPrimaryToken ? ptTokenDataInterval?.[50]?.changePercent ?? 0 : changePercent ?? 0)}% + + + + ); +}; + +export const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { + const theme = useTheme(); + const { accountPair, primaryTokenInfo, walletBalance, showWelcomeBanner } = usePortfolio(); + + // TODO refactor this properly + if (showWelcomeBanner) { + return ( + + + + {0} {token.name} + + {token.name === accountPair?.to.name ? ( + + ) : ( + + {0} {accountPair?.to.name || 'USD'} + + )} + + + ); + } + + if (secondaryToken24Activity === null) { + return ( + + + + + ); + } + + const isPrimary: boolean = token.info.policyId?.length === 0; + + const { + ptActivity: { close: ptPrice }, + } = useCurrencyPairing(); + + const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; + const tokenQuantityAsBigInt = bigNumberToBigInt(token.quantity); + + const showingAda = accountPair?.from.name === 'ADA'; + const currency = accountPair?.from.name; + const decimals = showingAda ? primaryTokenInfo.decimals : token.info.numberOfDecimals; + + if (ptPrice == null) return `... ${currency}`; + + const totaPrice = + ptPrice && + atomicBreakdown(tokenQuantityAsBigInt, decimals) + .bn.times(tokenPrice ?? 1) + .times(showingAda ? 1 : String(ptPrice)) + .toFormat(decimals); + + const totalTokenPrice = isPrimary && showingAda ? accountPair?.to.value : totaPrice; + const totalTicker = isPrimary && showingAda ? accountPair?.to.name : accountPair?.from.name; + + return ( + + + + {isPrimary ? walletBalance?.ada : token.formatedAmount} {token.name} + + {token.name === accountPair?.to.name ? ( + + ) : ( + + {totalTokenPrice} {totalTicker || 'USD'} + + )} + + + ); +}; + +export const TokenPrice = ({ unitOfAccount, secondaryToken24Activity, ptActivity, isPrimaryToken }) => { + const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryToken24Activity && secondaryToken24Activity[1].price.close; + if (tokenPrice == null) return ; + + return ( + + {formatPriceChange(tokenPrice)} {unitOfAccount} + + ); +}; + +export const TokenProcentage = ({ procentage }) => { + const { showWelcomeBanner } = usePortfolio(); + if (procentage === undefined) return ; + + return ( + + {showWelcomeBanner ? 0 : procentage}% + + ); +}; + +export function bigNumberToBigInt(bn: BigNumber): bigint { + // Convert BigNumber to a string representation of a whole number + const wholeNumberString = bn.toFixed(0); // 0 means no decimals + + // Convert the string to BigInt + const bigIntValue = BigInt(wholeNumberString); + + return bigIntValue; +} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx index aeb4f12c44..c99bbfba91 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx @@ -10,11 +10,11 @@ import StatsTable from '../TokensTable/StatsTable'; const PortfolioWallet = (): JSX.Element => { const theme = useTheme(); const strings = useStrings(); - const { walletBalance, assetList, showWelcomeBanner } = usePortfolio(); + const { walletBalance, ftAssetList, showWelcomeBanner } = usePortfolio(); const [keyword, setKeyword] = useState(''); const [isLoading, _] = useState(false); - const [tokenList, setTokenList] = useState(assetList); + const [tokenList, setTokenList] = useState(ftAssetList); useEffect(() => { // FAKE FETCHING DATA TO SEE SKELETON @@ -27,13 +27,13 @@ const PortfolioWallet = (): JSX.Element => { useEffect(() => { if (!keyword || showWelcomeBanner) { - setTokenList(assetList); + setTokenList(ftAssetList); return; } const lowercaseKeyword = keyword.toLowerCase(); - const temp = assetList.filter(item => { + const temp = ftAssetList.filter(item => { return ( item.info.name.toLowerCase().includes(lowercaseKeyword) || item.info.id.toLowerCase().includes(lowercaseKeyword) || diff --git a/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioDetailPage.tsx b/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioDetailPage.tsx index 695f0b7e06..8c9bbb8eb9 100644 --- a/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioDetailPage.tsx +++ b/packages/yoroi-extension/app/UI/pages/portfolio/PortfolioDetailPage.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import { TokenType } from '../../features/portfolio/common/types'; import { usePortfolio } from '../../features/portfolio/module/PortfolioContextProvider'; import TokenDetails from './../../features/portfolio/useCases/TokenDetails/TokenDetails'; import PortfolioLayout from './layout'; @@ -13,12 +12,12 @@ type Props = { const PortfolioDetailPage = ({ match, ...props }: Props) => { const tokenId = match.params.tokenId; - const { assetList } = usePortfolio() + const { ftAssetList } = usePortfolio(); const tokenInfo = React.useMemo(() => { - const token = assetList.find(item => item.id === tokenId); + const token = ftAssetList.find(item => item.id === tokenId); if (token) return token; - return {} as TokenType; + return {}; }, [tokenId]); return ( diff --git a/packages/yoroi-extension/app/UI/types/currrentWallet.ts b/packages/yoroi-extension/app/UI/types/currrentWallet.ts index 09fd305f58..04fc518820 100644 --- a/packages/yoroi-extension/app/UI/types/currrentWallet.ts +++ b/packages/yoroi-extension/app/UI/types/currrentWallet.ts @@ -9,32 +9,22 @@ type DefaultTokenInfo = { decimals: number; }; -type Metadata = { - type: string; - policyId: string; - assetName: string; - ticker: string; - logo: string | null; - longName: string | null; - numberOfDecimals: number; -}; +// type Metadata = { +// type: string; +// policyId: string; +// assetName: string; +// ticker: string; +// logo: string | null; +// longName: string | null; +// numberOfDecimals: number; +// }; -type PrimaryTokenInfo = { - TokenId: number; - NetworkId: number; - IsDefault: boolean; - IsNFT: boolean; - Identifier: string; - Digest: number; - Metadata: Metadata; -}; +type PrimaryTokenInfo = any; // TODO - define the structure of PrimaryTokenInfo export type WalletBalance = { ada: string; }; -type GetCurrentPrice = (from: string, to: string) => number | Promise; // Function type for getCurrentPrice - export type CurrentWalletType = { currentPool: any; networkId: number; @@ -51,6 +41,5 @@ export type CurrentWalletType = { isHardwareWallet: boolean; primaryTokenInfo: PrimaryTokenInfo; walletBalance: WalletBalance; - getCurrentPrice: GetCurrentPrice; // Added the function type here - assetList: any[]; + ftAssetList: any[]; }; diff --git a/packages/yoroi-extension/app/UI/types/tokenInfo.ts b/packages/yoroi-extension/app/UI/types/tokenInfo.ts index 7d98e81af3..352aedc608 100644 --- a/packages/yoroi-extension/app/UI/types/tokenInfo.ts +++ b/packages/yoroi-extension/app/UI/types/tokenInfo.ts @@ -9,16 +9,14 @@ type AssetInfo = { policyId: string; fingerprint: string; metadata: TokenInfoEntry; + image: string; + numberOfDecimals: number; }; type TokenInfoType = { - name: string; assetName: string; - totalAmount: string; amountForSorting: string; - tokenLogo: string; - totalAmountFiat: string | number; // The value could be 'NaN', so we can represent it as either a string or a number. - price: number | null; + formatedAmount: string; quantity: string; id: string; info: AssetInfo; diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index 899f4f744c..a9f033f31d 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -4,7 +4,6 @@ import { getNetworkById } from '../../api/ada/lib/storage/database/prepackaged/n import { maybe } from '../../coreUtils'; import { genLookupOrFail, getTokenIdentifierIfExists, getTokenStrictName } from '../../stores/stateless/tokenHelpers'; import { splitAmount, truncateToken } from '../../utils/formatters.js'; -import { calculateAndFormatValue } from '../../utils/unit-of-account'; import { cardanoAdaBase64Logo } from '../features/portfolio/common/helpers/constants'; import { CurrentWalletType } from '../types/currrentWallet'; @@ -95,33 +94,20 @@ const getAssetWalletAssetList = (stores: any) => { .filter((item: any) => item.info.IsNFT === false) .map((token: any) => { const numberOfDecimals = token.info?.Metadata.numberOfDecimals ?? 0; - const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); - const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); const tokenName = truncateToken(getTokenStrictName(token.info).name ?? '-'); const tokenId = getTokenIdentifierIfExists(token.info) ?? '-'; const tokenLogo = `data:image/png;base64,${ token.info.Metadata.policyId === '' ? cardanoAdaBase64Logo : token.info.Metadata.logo }`; + const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); + const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); - const getFiatCurrentPrice = stores.coinPriceStore.getCurrentPrice; - const { currency } = stores.profile.unitOfAccount; - - const fiatPrice = getFiatCurrentPrice(tokenName, currency === null ? 'USD' : currency); - const coinShiftedAmount = new BigNumber(shiftedAmount); - - const fiatDisplay = calculateAndFormatValue(coinShiftedAmount, fiatPrice); return { - name: tokenName, assetName: token.info.Metadata.assetName, - totalAmount: [beforeDecimal, afterDecimal].join(''), - amountForSorting: shiftedAmount, - tokenLogo: tokenLogo, - totalAmountFiat: fiatDisplay, - price: fiatPrice, - - // TODO new structure here quantity: asQuantity(token.entry.amount), id: tokenId, + formatedAmount: [beforeDecimal, afterDecimal].join(''), + info: { id: token.entry.identifier, name: tokenName, @@ -129,15 +115,8 @@ const getAssetWalletAssetList = (stores: any) => { fingerprint: tokenId, metadata: extractMetadataInfo({ metadata: token.info.Metadata?.assetMintMetadata?.[0] || null }), numberOfDecimals, + image: tokenLogo, }, - // TODO - refactor and add here any formated data/utils for token - // utils: { - // totalAmountFiat: fiatDisplay, - // price: fiatPrice, - // totalAmount: [beforeDecimal, afterDecimal].join(''), - // amountForSorting: shiftedAmount, - // image: tokenLogo, - // }, }; }); }; @@ -161,7 +140,7 @@ const groupTransactionsByDay = transactions => { }; export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undefined => { - const { wallets, delegation, tokenInfoStore, coinPriceStore, profile } = stores; + const { wallets, delegation, tokenInfoStore } = stores; try { const walletCurrentPoolInfo = getStakePoolMeta(stores); @@ -191,17 +170,10 @@ export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undef const shiftedAmount = defaultEntry.amount.shiftedBy(-tokenInfo.Metadata.numberOfDecimals); const [beforeDecimalRewards, afterDecimalRewards] = splitAmount(shiftedAmount, tokenInfo.Metadata.numberOfDecimals); - // Get Fiat price - const ticker = tokenInfo.Metadata.ticker; - const { currency } = profile.unitOfAccount; - const getFiatCurrentPrice = coinPriceStore?.getCurrentPrice; - const fiatPrice = getFiatCurrentPrice(ticker, currency === null ? 'USD' : currency); - - const fiatDisplay = calculateAndFormatValue(Number(shiftedAmount), fiatPrice); const isHardware: boolean = selectedWallet.isHardware; // Asset List - const assetList = getAssetWalletAssetList(stores); + const ftAssetList = getAssetWalletAssetList(stores); const groupedTx = groupTransactionsByDay(stores.transactions.recent); @@ -213,19 +185,17 @@ export const createCurrrentWalletInfo = (stores: any): CurrentWalletType | undef walletAdaBalance: walletAdaBalance.toNumber(), unitOfAccount: stores.profile.unitOfAccount, defaultTokenInfo: stores.tokenInfoStore.getDefaultTokenInfoSummary(networkId), - getCurrentPrice: stores.coinPriceStore.getCurrentPrice, recentTransactions: groupedTx ? groupedTx : [], submitedTransactions: selectedWallet.submittedTransactions, backendService: BackendService, backendServiceZero: BackendServiceZero, isHardwareWallet: isHardware, - // primaryTokenInfo: stores.tokenInfoStore.getDefaultTokenInfoSummary(networkId), primaryTokenInfo: { ...primaryTokenFullInfo, quantity: shiftedAmount }, stakingAddress: selectedWallet.stakingAddress, walletBalance: { ada: `${beforeDecimalRewards}${afterDecimalRewards}`, }, - assetList: assetList, + ftAssetList: ftAssetList, }; } catch (error) { console.warn('ERROR trying to create wallet info', error); diff --git a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts index 983cd3478b..cf0f1fbc5e 100644 --- a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts +++ b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts @@ -1,6 +1,4 @@ export const getNetworkUrl = (networkId: number): any => { - console.log('networkId !== 0', networkId); - return isTestnet(networkId) ? { cardanoScan: 'https://testnet.cardanoscan.io/token', diff --git a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts index 42929ae633..dc8259d210 100644 --- a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts +++ b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts @@ -1,19 +1,16 @@ +import { Portfolio } from '@yoroi/types'; import axios, { AxiosError } from 'axios'; import { useMutation, UseMutationResult } from 'react-query'; -interface TokenActivityResponse { - [key: string]: any; -} - interface ApiError { message: string; statusCode: number; } export const useMultiTokenActivity = ( - interval: '24h' | '1w' | '1m' -): UseMutationResult, string[]> => { - const postTokenActivity = async (tokenIds: string[]): Promise => { + interval: '24h' | '7d' | '30d' +): UseMutationResult, string[]> => { + const postTokenActivity = async (tokenIds: string[]): Promise => { const response = await axios.post(`https://zero.yoroiwallet.com/tokens/activity/multi/${interval}`, tokenIds, { headers: { 'Content-Type': 'application/json', From e9b0e72c203bed44f387731d3e882c217ab4844a Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 3 Oct 2024 16:42:30 +0300 Subject: [PATCH 36/58] fix price calculation --- .../ChartDetails/MarketPriceOverview.tsx | 5 ++-- .../TokenDetails/HeaderDetails/Header.tsx | 5 ++-- .../OverviewPerformanceDetails/Overview.tsx | 16 ++++++------- .../useCases/TokensTable/StatsTable.tsx | 20 +++++----------- .../useCases/TokensTable/TableColumnsChip.tsx | 24 +++++++++++++++---- .../app/UI/utils/createCurrentWalletInfo.ts | 3 ++- .../app/UI/utils/getNetworkUrl.ts | 2 +- .../components/wallet/assets/TokenDetails.js | 2 +- .../wallet/receive/WarningHeader.scss | 2 -- .../app/stores/stateless/sidebarCategories.js | 14 +++++------ 10 files changed, 50 insertions(+), 43 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx index a3a180ad52..3020047ada 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx @@ -8,6 +8,7 @@ import { formatPriceChange, priceChange } from '../../../common/helpers/priceCha import { useStrings } from '../../../common/hooks/useStrings'; import { usePortfolio } from '../../../module/PortfolioContextProvider'; import { usePortfolioTokenActivity } from '../../../module/PortfolioTokenActivityProvider'; +import { isEmpty } from 'lodash'; interface Props { chartData: any; @@ -32,10 +33,10 @@ export const TokenMarketPriceOverview = ({ chartData, detailInfo, tokenInfo }: P const priceChangeProcent = isPrimaryToken ? detailInfo?.changePercent || changePercent - : data24h && data24h[tokenInfo?.info?.id][1].price.change; + : !isEmpty(data24h) && data24h[tokenInfo?.info?.id][1].price.change; const priceChangeValue = isPrimaryToken ? detailInfo?.changeValue || changeValue - : data24h && data24h[tokenInfo?.info?.id][1].price.close; + : !isEmpty(data24h) && data24h[tokenInfo?.info?.id][1].price.close; // console.log('priceChangeProcent', data24h && data24h[tokenInfo?.info?.id][1]?.price); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx index 3592c104fb..beff0b38b0 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx @@ -8,18 +8,17 @@ import { useStrings } from '../../../common/hooks/useStrings'; import { usePortfolio } from '../../../module/PortfolioContextProvider'; import { usePortfolioTokenActivity } from '../../../module/PortfolioTokenActivityProvider'; import { bigNumberToBigInt } from '../../TokensTable/TableColumnsChip'; +import { isEmpty } from 'lodash'; interface Props { tokenInfo: TokenInfoType; } const HeaderSection = ({ tokenInfo }: Props): JSX.Element => { - console.log('tokenInfo', tokenInfo); const theme: any = useTheme(); const strings = useStrings(); const { unitOfAccount, walletBalance } = usePortfolio(); const isPrimaryToken: boolean = tokenInfo.id === '-'; - console.log('isPrimaryToken', isPrimaryToken); const tokenTotalAmount = isPrimaryToken ? walletBalance?.ada : tokenInfo.formatedAmount; if (tokenInfo.quantity === null) { @@ -36,7 +35,7 @@ const HeaderSection = ({ tokenInfo }: Props): JSX.Element => { } = usePortfolioTokenActivity(); const totaPriceCalc = React.useMemo(() => { - if (!isPrimaryToken && data24h) { + if (!isPrimaryToken && !isEmpty(data24h)) { const tokenPrice = data24h && data24h[tokenInfo.info.id][1]?.price.close; const tokenQuantityAsBigInt = bigNumberToBigInt(new BigNumber(tokenInfo.quantity)); const tokenDecimals = !isPrimaryToken && tokenInfo.info.numberOfDecimals; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx index 94a47f532e..5a4d2eb03a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx @@ -14,9 +14,7 @@ interface Props { const Overview = ({ tokenInfo }: Props): JSX.Element => { const theme: any = useTheme(); const strings = useStrings(); - const { networkId } = usePortfolio(); - const networkUrl = networkId !== null ? getNetworkUrl(networkId) : ''; - console.log('networkUrl', networkUrl); + // const explorers = useExplorers('mainnet' as Chain.SupportedNetworks); // console.log('explorers', explorers); @@ -61,7 +59,7 @@ const Overview = ({ tokenInfo }: Props): JSX.Element => { @@ -78,12 +76,14 @@ type TokenOverviewSectionTypes = { }; const TokenOverviewSection = ({ label, value, isExternalLink = false, isNetworkUrl = false }: TokenOverviewSectionTypes) => { - console.log('value', value); - const theme: any = useTheme(); if (!value) { return <>; } + const { networkId } = usePortfolio(); + const networkUrl = networkId !== null ? getNetworkUrl(networkId) : ''; + const theme: any = useTheme(); + return ( @@ -93,7 +93,7 @@ const TokenOverviewSection = ({ label, value, isExternalLink = false, isNetworkU @@ -101,7 +101,7 @@ const TokenOverviewSection = ({ label, value, isExternalLink = false, isNetworkU diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx index ce32c127f6..f589a20e9c 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx @@ -29,6 +29,7 @@ const StatsTable = ({ data }: Props): JSX.Element => { order: 'asc', orderBy: 'portfolioPercents', }); + console.log('ASSET LIST', data); const list = useMemo(() => [...data], [data]); console.log('order', order, orderBy); @@ -93,17 +94,12 @@ const StatsTable = ({ data }: Props): JSX.Element => { - + @@ -111,7 +107,7 @@ const StatsTable = ({ data }: Props): JSX.Element => { { { - + diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx index fcb4daa8c5..1c5b82b073 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx @@ -137,7 +137,7 @@ export const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { - {isPrimary ? walletBalance?.ada : token.formatedAmount} {token.name} + {isPrimary ? walletBalance?.ada : token.formatedAmount} {token.info.name} {token.name === accountPair?.to.name ? ( @@ -151,13 +151,29 @@ export const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { ); }; -export const TokenPrice = ({ unitOfAccount, secondaryToken24Activity, ptActivity, isPrimaryToken }) => { +export const TokenPrice = ({ secondaryToken24Activity, ptActivity, token }) => { + const isPrimaryToken = token?.info.policyId.length === 0; + const { accountPair, primaryTokenInfo } = usePortfolio(); const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryToken24Activity && secondaryToken24Activity[1].price.close; - if (tokenPrice == null) return ; + if (secondaryToken24Activity === null) return ; + + const showingAda = accountPair?.from.name === 'ADA'; + const tokenPriceFiat = new BigNumber(tokenPrice); + + const tokenQuantityAsBigInt = bigNumberToBigInt(token.quantity); + const decimals = showingAda ? primaryTokenInfo.decimals : token.info.numberOfDecimals; + + const totaPrice = + ptActivity.close && + atomicBreakdown(tokenQuantityAsBigInt, decimals) + .bn.times(tokenPriceFiat ?? 1) + .times(showingAda ? 1 : String(ptActivity.close)) + .toFormat(decimals); return ( - {formatPriceChange(tokenPrice)} {unitOfAccount} + {formatPriceChange(accountPair?.from.name === 'ADA' ? tokenPrice : totaPrice / Number(token.shiftedAmount))}{' '} + {accountPair?.from.name} ); }; diff --git a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts index a9f033f31d..f619304c7c 100644 --- a/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts +++ b/packages/yoroi-extension/app/UI/utils/createCurrentWalletInfo.ts @@ -99,6 +99,7 @@ const getAssetWalletAssetList = (stores: any) => { const tokenLogo = `data:image/png;base64,${ token.info.Metadata.policyId === '' ? cardanoAdaBase64Logo : token.info.Metadata.logo }`; + const shiftedAmount = token.entry.amount.shiftedBy(-numberOfDecimals); const [beforeDecimal, afterDecimal] = splitAmount(shiftedAmount, numberOfDecimals); @@ -107,7 +108,7 @@ const getAssetWalletAssetList = (stores: any) => { quantity: asQuantity(token.entry.amount), id: tokenId, formatedAmount: [beforeDecimal, afterDecimal].join(''), - + shiftedAmount, info: { id: token.entry.identifier, name: tokenName, diff --git a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts index cf0f1fbc5e..d20cb5e32e 100644 --- a/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts +++ b/packages/yoroi-extension/app/UI/utils/getNetworkUrl.ts @@ -2,7 +2,7 @@ export const getNetworkUrl = (networkId: number): any => { return isTestnet(networkId) ? { cardanoScan: 'https://testnet.cardanoscan.io/token', - cexplorer: 'https://cexplorer.io/asset', + cexplorer: 'https://testnet.cexplorer.io/asset', } : { cardanoScan: 'https://cardanoscan.io/token', cexplorer: 'https://cexplorer.io/asset' }; }; diff --git a/packages/yoroi-extension/app/components/wallet/assets/TokenDetails.js b/packages/yoroi-extension/app/components/wallet/assets/TokenDetails.js index 22a3a9bc03..aa0be9b645 100644 --- a/packages/yoroi-extension/app/components/wallet/assets/TokenDetails.js +++ b/packages/yoroi-extension/app/components/wallet/assets/TokenDetails.js @@ -74,7 +74,7 @@ export const getNetworkUrl: ($ReadOnly) => string | void = network = function TokenDetails({ tokenInfo, network, intl }: Props & Intl): Node { if (tokenInfo == null) return null; const networkUrl = getNetworkUrl(network); - + console.log("networkUrl",networkUrl) return ( diff --git a/packages/yoroi-extension/app/components/wallet/receive/WarningHeader.scss b/packages/yoroi-extension/app/components/wallet/receive/WarningHeader.scss index f16c626dab..71ec562aec 100644 --- a/packages/yoroi-extension/app/components/wallet/receive/WarningHeader.scss +++ b/packages/yoroi-extension/app/components/wallet/receive/WarningHeader.scss @@ -14,7 +14,6 @@ font-weight: 500; font-size: 16px; line-height: 19px; - // color: var(--yoroi-palette-error-200); padding-top: 24px; margin-bottom: 12px; @@ -24,7 +23,6 @@ font-weight: 400; font-size: 14px; line-height: 22px; - // color: var(--yoroi-palette-gray-900); padding-top: 8px; padding-bottom: 12px; padding-right: 12px; diff --git a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js index cd5be8a762..c36c82daca 100644 --- a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js +++ b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js @@ -165,13 +165,13 @@ export const allCategoriesRevamp: Array = [ label: connectorMessages.connector, isVisible: _request => true, }, - // { - // className: 'swap', - // route: '/swap', - // icon: swapIcon, - // label: globalMessages.sidebarSwap, - // isVisible: _request => true, - // }, + { + className: 'swap', + route: '/swap', + icon: swapIcon, + label: globalMessages.sidebarSwap, + isVisible: _request => true, + }, { className: 'governance', route: '/governance', From c314f419fc349e8818be059e0fdfe82c341c451c Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Mon, 7 Oct 2024 13:37:58 +0300 Subject: [PATCH 37/58] refactor request --- .../common/components/PortfolioHeader.tsx | 45 +++++++----- .../portfolio/common/helpers/isPrimary.ts | 2 +- .../common/hooks/useTokenPercentages.tsx | 46 ------------ .../module/PortfolioTokenActivityProvider.tsx | 50 ++++++------- .../ChartDetails/MarketPriceOverview.tsx | 11 +-- .../OverviewPerformanceDetails/Overview.tsx | 2 +- .../useCases/TokensTable/StatsTable.tsx | 32 +++++---- .../useCases/TokensTable/TableColumnsChip.tsx | 57 ++++++++------- .../useCases/TokensTable/useProcentage.tsx | 71 +++++++++++++++++++ .../app/UI/utils/useMultiTokenActivity.ts | 18 +++-- .../app/api/localStorage/index.js | 8 +++ 11 files changed, 198 insertions(+), 144 deletions(-) delete mode 100644 packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx create mode 100644 packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index 954ef79601..d5695c5ecc 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -1,6 +1,7 @@ import { Box, Stack, Typography, useTheme } from '@mui/material'; import BigNumber from 'bignumber.js'; import React from 'react'; +import LocalStorageApi from '../../../../../api/localStorage/index'; import { SearchInput, Skeleton, Tooltip } from '../../../../components'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import { WalletBalance } from '../../../../types/currrentWallet'; @@ -33,6 +34,7 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: const theme: any = useTheme(); const { unitOfAccount, changeUnitOfAccountPair, accountPair, primaryTokenInfo } = usePortfolio(); const { tokenActivity } = usePortfolioTokenActivity(); + const localStorageApi = new LocalStorageApi(); const { ptActivity: { open, close: ptPrice }, @@ -44,7 +46,6 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: const showADA = accountPair?.from.name === 'ADA'; const totalTokenPrice = React.useMemo(() => { - // const tokenPrice = tokenActivity?.data24h[amount?.info.id]?.price.close; const showingAda = accountPair?.from.name !== 'ADA'; const currency = showingAda ? primaryTokenInfo.ticker : unitOfAccount; @@ -55,7 +56,12 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: return totalAmount; }, [tokenActivity, config.decimals, ptPrice]); - const handleCurrencyChange = () => { + const handleCurrencyChange = async () => { + localStorageApi.setSetPortfolioFiatPair({ + from: { name: showADA ? unitOfAccount ?? 'USD' : 'ADA', value: showADA ? totalTokenPrice ?? '0' : walletBalance.ada }, + to: { name: showADA ? 'ADA' : unitOfAccount ?? 'USD', value: showADA ? walletBalance.ada : totalTokenPrice }, + }); + changeUnitOfAccountPair({ from: { name: showADA ? unitOfAccount ?? 'USD' : 'ADA', value: showADA ? totalTokenPrice ?? '0' : walletBalance.ada }, to: { name: showADA ? 'ADA' : unitOfAccount ?? 'USD', value: showADA ? walletBalance.ada : totalTokenPrice }, @@ -63,21 +69,26 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: }; React.useEffect(() => { - changeUnitOfAccountPair({ - from: { name: 'ADA', value: walletBalance?.ada || '0' }, - to: { name: unitOfAccount || 'USD', value: totalTokenPrice || '0' }, - }); + const setFiatPair = async () => { + const portfolioStoragePair = await localStorageApi.getPortfolioFiatPair(); + const portfolioStoragePairObj = JSON.parse(portfolioStoragePair); + + if (portfolioStoragePairObj) { + changeUnitOfAccountPair({ + from: { name: portfolioStoragePairObj.from.name, value: portfolioStoragePairObj.from.value }, + to: { name: portfolioStoragePairObj.to.name, value: portfolioStoragePairObj.to.value }, + }); + } else { + localStorageApi.setSetPortfolioFiatPair({ + from: { name: 'ADA', value: walletBalance?.ada || '0' }, + to: { name: unitOfAccount || 'USD', value: totalTokenPrice || '0' }, + }); + } + }; + + setFiatPair(); }, [walletBalance, unitOfAccount, totalTokenPrice]); - // const amount = React.useMemo( - // () => - // aggregatePrimaryAmount({ - // primaryTokenInfo, - // tokenActivity: tokenActivity.data24h, - // }), - // [primaryTokenInfo, tokenActivity, ptPrice] - // ); - return ( @@ -91,7 +102,7 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: )} - {accountPair?.from.name} + {accountPair?.from?.name} - /{accountPair?.to.name} + /{accountPair?.to?.name} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts index 2b7cff5755..0df90b2ece 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/helpers/isPrimary.ts @@ -1,6 +1,6 @@ // TODO - silly implementation add more logic export const isPrimaryToken = tokenInfo => { - if (tokenInfo.id?.length === 0) { + if (tokenInfo.id === '-') { return true; } return false; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx deleted file mode 100644 index e6216ae889..0000000000 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useTokenPercentages.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import BigNumber from 'bignumber.js'; - -type Token = { - id: string; - info: { - name: string; - [key: string]: any; - }; - quantity: BigNumber; - [key: string]: any; -}; - -type TokenWithPercentage = Token & { - percentage: number; -}; - -export const useTokenPercentages = (tokens: any[]): TokenWithPercentage[] => { - // const tokenPercentages = useMemo(() => { - // if (!tokens || tokens.length === 0) return {}; - - // const totalQuantity = tokens.reduce((acc, token) => { - // return acc.plus(token.quantity); - // }, new BigNumber(0)); - - // return tokens.reduce((acc, token) => { - // const percentage = totalQuantity.isZero() ? '0.00' : token.quantity.dividedBy(totalQuantity).multipliedBy(100).toFixed(2); - - // return { - // ...acc, - // [token.info.id]: percentage, - // }; - // }, {} as any); - // }, [tokens]); - - return { - // @ts-ignore - '': '82.37', - '533bb94a8850ee3ccbe483106489399112b74c905342cb1792a797a0.494e4459': '1.11', - '9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77.53554e444145': '9.87', - '420000029ad9527271b1b1e3c27ee065c18df70a4a4cfc3093a41a44.41584f': '0.54', - '208a2ca888886921513cb777bb832a8dc685c04de990480151f12150.53484942414441': '0.00', - '29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6.4d494e': '2.53', - 'af2e27f580f7f08e93190a81f72462f153026d06450924726645891b.44524950': '1.96', - 'f43a62fdc3965df486de8a0d32fe800963589c41b38946602a0dc535.41474958': '1.62', - }; -}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index 7f56f05027..7c396ccec5 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -1,7 +1,7 @@ import { invalid } from '@yoroi/common'; import { Portfolio } from '@yoroi/types'; import { freeze, produce } from 'immer'; -import React from 'react'; +import React, { useEffect, useReducer, useRef } from 'react'; import { useQueryClient } from 'react-query'; import { queryInfo } from '../../../utils/query-client'; @@ -30,9 +30,9 @@ type Props = { export const PortfolioTokenActivityProvider = ({ children }: Props) => { const queryClient = useQueryClient(); - const [state, dispatch] = React.useReducer(portfolioTokenActivityReducer, defaultPortfolioTokenActivityState); + const [state, dispatch] = useReducer(portfolioTokenActivityReducer, defaultPortfolioTokenActivityState); - const actions = React.useRef({ + const actions = useRef({ secondaryTokenIdsChanged: secondaryTokenIds => { dispatch({ type: PortfolioTokenActivityActionType.SecondaryTokenIdsChanged, @@ -53,47 +53,39 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { }, }).current; - const { ftAssetList, walletBalance } = usePortfolio(); + const { ftAssetList } = usePortfolio(); - React.useEffect(() => { - const listForActivity: any = ftAssetList + useEffect(() => { + const listForActivity: string[] = ftAssetList .filter(item => item.info?.policyId?.length > 0) - .map(item => `${item.info?.policyId}.${item.assetName}`); // + .map(item => `${item.info?.policyId}.${item.assetName}`); actions.secondaryTokenIdsChanged(listForActivity); + queryClient.invalidateQueries(queryKey); + }, [actions, ftAssetList, queryClient]); - queryClient.invalidateQueries([queryKey]); - }, [actions, queryClient]); - // Use hook for each interval (24h, 1w, 1m) - const { mutate: fetch24h, data: data24h, isLoading: loading24h } = useMultiTokenActivity('24h'); - const { mutate: fetch7d, data: data7d, isLoading: loading7d } = useMultiTokenActivity('7d'); - const { mutate: fetch30d, data: data30d, isLoading: loading30d } = useMultiTokenActivity('30d'); - React.useEffect(() => { - if (state.secondaryTokenIds.length > 0) { - fetch24h(state.secondaryTokenIds); - fetch7d(state.secondaryTokenIds); - fetch30d(state.secondaryTokenIds); - } - }, [state.secondaryTokenIds, fetch24h]); + // Use `useQuery` hooks to fetch and cache the token activity data for each interval + const { data: data24h, isLoading: loading24h } = useMultiTokenActivity(state.secondaryTokenIds, '24h'); + const { data: data7d, isLoading: loading7d } = useMultiTokenActivity(state.secondaryTokenIds, '7d'); + const { data: data30d, isLoading: loading30d } = useMultiTokenActivity(state.secondaryTokenIds, '30d'); - React.useEffect(() => { - if (data24h) { + useEffect(() => { + if (data24h || data7d || data30d) { const combinedData: any = { - data24h: data24h, - data7d: data7d, - data30d: data30d, + data24h: data24h || {}, + data7d: data7d || {}, + data30d: data30d || {}, }; actions.tokenActivityChanged(combinedData); } - }, [data24h, actions, data30d, data7d, loading24h, loading30d, loading7d, walletBalance?.ada]); + }, [data24h, data7d, data30d, actions]); const value = React.useMemo( () => ({ ...state, - isLoading: loading24h, - // || loading1w || loading1m, // Combine loading states from all intervals + isLoading: loading24h || loading7d || loading30d, }), - [loading24h, data7d, data30d, state] + [loading24h, loading7d, loading30d, state] ); return {children}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx index 3020047ada..d509567b57 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx @@ -1,5 +1,6 @@ import { Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; +import { isEmpty } from 'lodash'; import React from 'react'; import { Chip, ChipTypes, Icon, Skeleton } from '../../../../../components'; import { useCurrencyPairing } from '../../../../../context/CurrencyContext'; @@ -8,7 +9,6 @@ import { formatPriceChange, priceChange } from '../../../common/helpers/priceCha import { useStrings } from '../../../common/hooks/useStrings'; import { usePortfolio } from '../../../module/PortfolioContextProvider'; import { usePortfolioTokenActivity } from '../../../module/PortfolioTokenActivityProvider'; -import { isEmpty } from 'lodash'; interface Props { chartData: any; @@ -38,8 +38,6 @@ export const TokenMarketPriceOverview = ({ chartData, detailInfo, tokenInfo }: P ? detailInfo?.changeValue || changeValue : !isEmpty(data24h) && data24h[tokenInfo?.info?.id][1].price.close; - // console.log('priceChangeProcent', data24h && data24h[tokenInfo?.info?.id][1]?.price); - return ( @@ -71,11 +69,16 @@ export const TokenMarketPriceOverview = ({ chartData, detailInfo, tokenInfo }: P const TokenPrice = ({ isPrimaryToken, unitOfAccount, secondaryTokenActivity, ptActivity }) => { const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryTokenActivity && secondaryTokenActivity[1].price.close; + + const sPrice = secondaryTokenActivity && secondaryTokenActivity[1].price.close; + const ptPrice = ptActivity.close; + const ptUnitPrice = sPrice * ptPrice; + if (tokenPrice == null) return ; return ( - {formatPriceChange(tokenPrice)} + {formatPriceChange(isPrimaryToken ? ptPrice : ptUnitPrice, 4)}  {unitOfAccount} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx index 5a4d2eb03a..c35da0c032 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx @@ -19,7 +19,7 @@ const Overview = ({ tokenInfo }: Props): JSX.Element => { // console.log('explorers', explorers); - const isPrimary = isPrimaryToken(tokenInfo.info); + const isPrimary = isPrimaryToken(tokenInfo); return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx index f589a20e9c..658f2f0da1 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx @@ -1,19 +1,21 @@ import { TableCell, TableRow } from '@mui/material'; import { useTheme } from '@mui/material/styles'; +import { isEmpty } from 'lodash'; import React, { useMemo, useState } from 'react'; import { useCurrencyPairing } from '../../../../context/CurrencyContext'; import Table from '../../common/components/Table'; import { TableRowSkeleton } from '../../common/components/TableRowSkeleton'; import { TOKEN_CHART_INTERVAL } from '../../common/helpers/constants'; +import { isPrimaryToken } from '../../common/helpers/isPrimary'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useStrings } from '../../common/hooks/useStrings'; import useTableSort, { ISortState } from '../../common/hooks/useTableSort'; -import { useTokenPercentages } from '../../common/hooks/useTokenPercentages'; import { TokenType } from '../../common/types/index'; import { IHeadCell } from '../../common/types/table'; import { usePortfolio } from '../../module/PortfolioContextProvider'; import { usePortfolioTokenActivity } from '../../module/PortfolioTokenActivityProvider'; import { TokenDisplay, TokenPrice, TokenPriceChangeChip, TokenPriceTotal, TokenProcentage } from './TableColumnsChip'; +import { useProcessedTokenData2 } from './useProcentage'; interface Props { data: TokenType[]; @@ -26,13 +28,12 @@ const StatsTable = ({ data }: Props): JSX.Element => { const strings = useStrings(); const { unitOfAccount } = usePortfolio(); const [{ order, orderBy }, setSortState] = useState({ - order: 'asc', - orderBy: 'portfolioPercents', + order: '', + orderBy: '', }); - console.log('ASSET LIST', data); const list = useMemo(() => [...data], [data]); - console.log('order', order, orderBy); + // console.log('order', order, orderBy); const { tokenActivity: { data24h, data7d, data30d }, @@ -60,22 +61,23 @@ const StatsTable = ({ data }: Props): JSX.Element => { }, ]; - const { getSortedData, handleRequestSort } = useTableSort({ order, orderBy, setSortState, headCells, data }); - // TODO refactor and add calculation based on fiat toatl value - endpoint not working - const procentageData = useTokenPercentages(data); + const assetFormatedList = useProcessedTokenData2({ data: list, ptActivity, data24h }); + console.log('TABE HOOK procentageData2', assetFormatedList); + + const { getSortedData, handleRequestSort } = useTableSort({ order, orderBy, setSortState, headCells, data: assetFormatedList }); return (
} > - {getSortedData(list).map((row: any) => ( + {getSortedData(assetFormatedList).map((row: any) => ( navigateTo.portfolioDetail(row.id)} @@ -101,7 +103,7 @@ const StatsTable = ({ data }: Props): JSX.Element => { @@ -109,7 +111,7 @@ const StatsTable = ({ data }: Props): JSX.Element => { @@ -118,13 +120,13 @@ const StatsTable = ({ data }: Props): JSX.Element => { - + diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx index 1c5b82b073..48d9e35c55 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx @@ -68,7 +68,10 @@ export const TokenPriceChangeChip = ({ - {formatPriceChange(isPrimaryToken ? ptTokenDataInterval?.[50]?.changePercent ?? 0 : changePercent ?? 0)}% + {formatPriceChange( + isPrimaryToken && timeInterval !== undefined ? ptTokenDataInterval?.[50]?.changePercent ?? 0 : changePercent ?? 0 + )} + % @@ -108,7 +111,7 @@ export const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { ); } - const isPrimary: boolean = token.info.policyId?.length === 0; + const isPrimary: boolean = token.id === '-'; const { ptActivity: { close: ptPrice }, @@ -119,19 +122,32 @@ export const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { const showingAda = accountPair?.from.name === 'ADA'; const currency = accountPair?.from.name; - const decimals = showingAda ? primaryTokenInfo.decimals : token.info.numberOfDecimals; + const decimals = isPrimary ? primaryTokenInfo.decimals : token.info.numberOfDecimals; - if (ptPrice == null) return `... ${currency}`; + if (ptPrice === null) return `... ${currency}`; const totaPrice = ptPrice && atomicBreakdown(tokenQuantityAsBigInt, decimals) .bn.times(tokenPrice ?? 1) - .times(showingAda ? 1 : String(ptPrice)) + .times(showingAda ? 1 : new BigNumber(ptPrice)) .toFormat(decimals); - const totalTokenPrice = isPrimary && showingAda ? accountPair?.to.value : totaPrice; + // if (token.info.name === 'SHIBA') { + // console.log('Token CALC DETAILS', { + // ptPrice, + // tokenQuantityAsBigInt, + // tokenPrice, + // name: token.info.name, + // decimals, + // confff: config.decimals, + // showingAda, + // }); + + // console.log('totaPrice', totaPrice); + // } const totalTicker = isPrimary && showingAda ? accountPair?.to.name : accountPair?.from.name; + const totalTokenPrice = isPrimary && showingAda ? '' : `${totaPrice} ${totalTicker || 'USD'}`; return ( @@ -143,7 +159,7 @@ export const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { ) : ( - {totalTokenPrice} {totalTicker || 'USD'} + {totalTokenPrice} )} @@ -152,28 +168,15 @@ export const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { }; export const TokenPrice = ({ secondaryToken24Activity, ptActivity, token }) => { - const isPrimaryToken = token?.info.policyId.length === 0; - const { accountPair, primaryTokenInfo } = usePortfolio(); - const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryToken24Activity && secondaryToken24Activity[1].price.close; - if (secondaryToken24Activity === null) return ; - - const showingAda = accountPair?.from.name === 'ADA'; - const tokenPriceFiat = new BigNumber(tokenPrice); - - const tokenQuantityAsBigInt = bigNumberToBigInt(token.quantity); - const decimals = showingAda ? primaryTokenInfo.decimals : token.info.numberOfDecimals; - - const totaPrice = - ptActivity.close && - atomicBreakdown(tokenQuantityAsBigInt, decimals) - .bn.times(tokenPriceFiat ?? 1) - .times(showingAda ? 1 : String(ptActivity.close)) - .toFormat(decimals); + const { unitOfAccount } = usePortfolio(); + const isPrimaryToken = token.id === '-'; + const tokenPrice = secondaryToken24Activity && secondaryToken24Activity[1].price.close; + const ptPrice = ptActivity.close; + const ptUnitPrice = tokenPrice * ptPrice; return ( - {formatPriceChange(accountPair?.from.name === 'ADA' ? tokenPrice : totaPrice / Number(token.shiftedAmount))}{' '} - {accountPair?.from.name} + {parseFloat(isPrimaryToken ? ptPrice : ptUnitPrice).toFixed(4)} {unitOfAccount} ); }; @@ -184,7 +187,7 @@ export const TokenProcentage = ({ procentage }) => { return ( - {showWelcomeBanner ? 0 : procentage}% + {showWelcomeBanner ? 0 : parseFloat(procentage).toFixed(2)}% ); }; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx new file mode 100644 index 0000000000..507ca910c5 --- /dev/null +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx @@ -0,0 +1,71 @@ +import { atomicBreakdown } from '@yoroi/common'; +import BigNumber from 'bignumber.js'; +import { useMemo } from 'react'; +import { formatValue } from '../../common/components/PortfolioHeader'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; +import { bigNumberToBigInt } from './TableColumnsChip'; + +export const useProcessedTokenData2 = ({ data, ptActivity, data24h }) => { + const { accountPair, primaryTokenInfo } = usePortfolio(); + + // Helper function to calculate total fiat value for each token + const calculateTotalFiatForToken = token => { + const isPrimaryToken = token.id === '-'; + const secondaryToken24Activity = data24h && data24h[token.info.id]; + + const tokenPrice = + isPrimaryToken && secondaryToken24Activity === undefined + ? ptActivity.close + : secondaryToken24Activity && secondaryToken24Activity[1].price.close; + const tokenPriceFiat = tokenPrice ? new BigNumber(tokenPrice) : 1; + const tokenQuantityAsBigInt = bigNumberToBigInt(token.quantity); + const decimals = isPrimaryToken ? primaryTokenInfo.decimals : token.info.numberOfDecimals; + + const totalValue = atomicBreakdown(tokenQuantityAsBigInt, decimals) + .bn.times(tokenPriceFiat) + .times(new BigNumber(ptActivity.close)) + .toNumber(); + + const primaryTokenFiatTotalAmount = formatValue(primaryTokenInfo.quantity.multipliedBy(String(ptActivity.close))); + + const totalTokenPrice = isPrimaryToken ? primaryTokenFiatTotalAmount : totalValue; + const unitPrice = accountPair?.from.name === 'ADA' ? tokenPrice : totalTokenPrice / Number(token.shiftedAmount); + + return { totalValue: totalTokenPrice, unitPrice }; + }; + + // Use useMemo to calculate fiat values, percentages, and sort by percentage + const processedData = useMemo(() => { + // Calculate total fiat values for all tokens + const tokenFiatValues = data.reduce((acc, token) => { + const totalFiat = calculateTotalFiatForToken(token); + + acc[token.info.id] = totalFiat; + return acc; + }, {}); + + // Calculate total portfolio value + const totalPortfolioValue = Object.values(tokenFiatValues).reduce((sum, value) => { + return Number(sum) + Number(value?.totalValue); + }, 0); + + // Calculate percentages for each token and then sort by percentage + const sortedData = data + .map(token => { + const { totalValue, unitPrice } = tokenFiatValues[token.info.id] || 0; + const percentage = totalPortfolioValue > 0 ? (totalValue / totalPortfolioValue) * 100 : 0; + + return { + ...token, + totalValue, + percentage, + unitPrice, + }; + }) + .sort((a, b) => b.percentage - a.percentage); // Sort by percentage in ascending order + + return sortedData; + }, [data, ptActivity, data24h, accountPair, primaryTokenInfo]); + + return processedData; +}; diff --git a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts index dc8259d210..48dd841e09 100644 --- a/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts +++ b/packages/yoroi-extension/app/UI/utils/useMultiTokenActivity.ts @@ -1,6 +1,6 @@ import { Portfolio } from '@yoroi/types'; import axios, { AxiosError } from 'axios'; -import { useMutation, UseMutationResult } from 'react-query'; +import { useQuery, UseQueryResult } from 'react-query'; interface ApiError { message: string; @@ -8,9 +8,10 @@ interface ApiError { } export const useMultiTokenActivity = ( + tokenIds: string[], interval: '24h' | '7d' | '30d' -): UseMutationResult, string[]> => { - const postTokenActivity = async (tokenIds: string[]): Promise => { +): UseQueryResult> => { + const fetchTokenActivity = async (): Promise => { const response = await axios.post(`https://zero.yoroiwallet.com/tokens/activity/multi/${interval}`, tokenIds, { headers: { 'Content-Type': 'application/json', @@ -20,5 +21,14 @@ export const useMultiTokenActivity = ( return response.data; }; - return useMutation(postTokenActivity); + return useQuery>( + ['multiTokenActivity', tokenIds, interval], + fetchTokenActivity, + { + enabled: tokenIds.length > 0, // Fetch only if there are token IDs provided + staleTime: 60000, // Cache remains fresh for 1 minute + cacheTime: 300000, // Cache remains in memory for 5 minutes + refetchOnWindowFocus: false, // Prevents refetching when the window gains focus + } + ); }; diff --git a/packages/yoroi-extension/app/api/localStorage/index.js b/packages/yoroi-extension/app/api/localStorage/index.js index 3b4c645f16..07ec596b59 100644 --- a/packages/yoroi-extension/app/api/localStorage/index.js +++ b/packages/yoroi-extension/app/api/localStorage/index.js @@ -37,6 +37,7 @@ const storageKeys = { CATALYST_ROUND_INFO: networkForLocalStorage + '-CATALYST_ROUND_INFO', FLAGS: networkForLocalStorage + '-FLAGS', USER_THEME: networkForLocalStorage + '-USER-THEME', + PORTFOLIO_FIAT_PAIR: networkForLocalStorage + '-PORTFOLIO_FIAT_PAIR', // ========== CONNECTOR ========== // DAPP_CONNECTOR_WHITELIST: 'connector_whitelist', SELECTED_WALLET: 'SELECTED_WALLET', @@ -105,6 +106,13 @@ export default class LocalStorageApi { setUserThemeMode: string => Promise = theme => setLocalItem(storageKeys.USER_THEME, theme); + + // ========== Portfolio FIAT Pair ========== // + + getPortfolioFiatPair: void => Promise = () => getLocalItem(storageKeys.PORTFOLIO_FIAT_PAIR); + + setSetPortfolioFiatPair: string => Promise = pair => setLocalItem(storageKeys.PORTFOLIO_FIAT_PAIR, pair); + // ========== Theme Migration ========== // getUserRevampMigrationStatus: void => Promise = async () => From 01ed961e19f77cb75ec6a5dd5a9a6633719f5229 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Mon, 7 Oct 2024 14:25:02 +0300 Subject: [PATCH 38/58] refactor --- .../features/portfolio/common/hooks/useChart.tsx | 16 +++++----------- .../ChartDetails/TokenChartInterval.tsx | 2 +- .../useCases/TokensTable/StatsTable.tsx | 11 ++--------- .../useCases/TokensTable/useProcentage.tsx | 2 +- 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx index b75dafc4f3..31f63ec038 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx @@ -6,14 +6,6 @@ import { IChartData } from '../types/chart'; const useChart = (data: IChartData) => { const theme: any = useTheme(); - // const [periodButtonProps, setPeriodButtonProps] = useState([ - // { id: 'start24HoursAgo', label: strings['24H'], active: true }, - // { id: 'start1WeekAgo', label: strings['1W'], active: false }, - // { id: 'start1MonthAgo', label: strings['1M'], active: false }, - // { id: 'start6MonthAgo', label: strings['6M'], active: false }, - // { id: 'start1YearAgo', label: strings['1Y'], active: false }, - // { id: 'ALL', label: strings['ALL'], active: false }, - // ]); const [detailInfo, setDetailInfo] = useState<{ value?: number; label?: string; changeValue?: number; changePercent?: number }>({ label: data[0]?.label, value: data[0]?.value, @@ -33,14 +25,14 @@ const useChart = (data: IChartData) => { return ( - {payload.value.toFixed(1)} + {payload.value.toFixed(2)} ); }; @@ -91,6 +83,7 @@ const useChart = (data: IChartData) => { fill={theme.palette.ds.primary_500} rx={5} ry={5} + pr={7} > { fontSize: '0.75rem', fontWeight: 400, paddingRight: '5px', + paddingLeft: '10px', }} > {detailInfo.label} diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx index bd80c39839..6e35eb1746 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/TokenChartInterval.tsx @@ -116,7 +116,7 @@ export const TokenChartInterval = ({ tokenInfo }: Props): JSX.Element => { activeDot={(props: any) => ( { const theme: any = useTheme(); const navigateTo = useNavigateTo(); const strings = useStrings(); - const { unitOfAccount } = usePortfolio(); const [{ order, orderBy }, setSortState] = useState({ order: '', orderBy: '', }); const list = useMemo(() => [...data], [data]); - // console.log('order', order, orderBy); - const { tokenActivity: { data24h, data7d, data30d }, - // isLoading: isActivityLoading, } = usePortfolioTokenActivity(); const ptActivity = useCurrencyPairing().ptActivity; @@ -61,9 +56,7 @@ const StatsTable = ({ data }: Props): JSX.Element => { }, ]; - // TODO refactor and add calculation based on fiat toatl value - endpoint not working - const assetFormatedList = useProcessedTokenData2({ data: list, ptActivity, data24h }); - console.log('TABE HOOK procentageData2', assetFormatedList); + const assetFormatedList = useProcessedTokenData({ data: list, ptActivity, data24h }); const { getSortedData, handleRequestSort } = useTableSort({ order, orderBy, setSortState, headCells, data: assetFormatedList }); return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx index 507ca910c5..edd62c4dff 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx @@ -5,7 +5,7 @@ import { formatValue } from '../../common/components/PortfolioHeader'; import { usePortfolio } from '../../module/PortfolioContextProvider'; import { bigNumberToBigInt } from './TableColumnsChip'; -export const useProcessedTokenData2 = ({ data, ptActivity, data24h }) => { +export const useProcessedTokenData = ({ data, ptActivity, data24h }) => { const { accountPair, primaryTokenInfo } = usePortfolio(); // Helper function to calculate total fiat value for each token From e9618106156d3e0ba78f7e76ffaac343de1d9ff2 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Mon, 7 Oct 2024 14:38:49 +0300 Subject: [PATCH 39/58] types updates --- .../app/UI/features/portfolio/common/hooks/useChart.tsx | 7 ++++++- .../portfolio/module/PortfolioTokenActivityProvider.tsx | 2 +- .../portfolio/useCases/TokensTable/useProcentage.tsx | 4 ++-- .../app/components/wallet/assets/TokenDetails.js | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx index 31f63ec038..40efd4eda8 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/hooks/useChart.tsx @@ -6,7 +6,12 @@ import { IChartData } from '../types/chart'; const useChart = (data: IChartData) => { const theme: any = useTheme(); - const [detailInfo, setDetailInfo] = useState<{ value?: number; label?: string; changeValue?: number; changePercent?: number }>({ + const [detailInfo, setDetailInfo] = useState<{ + value?: number; + label?: string; + changeValue?: number; + changePercent?: number; + }>({ label: data[0]?.label, value: data[0]?.value, changeValue: data[0]?.changeValue, diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx index 7c396ccec5..aa9537c26c 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioTokenActivityProvider.tsx @@ -56,7 +56,7 @@ export const PortfolioTokenActivityProvider = ({ children }: Props) => { const { ftAssetList } = usePortfolio(); useEffect(() => { - const listForActivity: string[] = ftAssetList + const listForActivity: any[] = ftAssetList .filter(item => item.info?.policyId?.length > 0) .map(item => `${item.info?.policyId}.${item.assetName}`); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx index edd62c4dff..120f7838a6 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx @@ -29,7 +29,7 @@ export const useProcessedTokenData = ({ data, ptActivity, data24h }) => { const primaryTokenFiatTotalAmount = formatValue(primaryTokenInfo.quantity.multipliedBy(String(ptActivity.close))); const totalTokenPrice = isPrimaryToken ? primaryTokenFiatTotalAmount : totalValue; - const unitPrice = accountPair?.from.name === 'ADA' ? tokenPrice : totalTokenPrice / Number(token.shiftedAmount); + const unitPrice = accountPair?.from.name === 'ADA' ? tokenPrice : Number(totalTokenPrice) / Number(token.shiftedAmount); return { totalValue: totalTokenPrice, unitPrice }; }; @@ -45,7 +45,7 @@ export const useProcessedTokenData = ({ data, ptActivity, data24h }) => { }, {}); // Calculate total portfolio value - const totalPortfolioValue = Object.values(tokenFiatValues).reduce((sum, value) => { + const totalPortfolioValue: any = Object.values(tokenFiatValues).reduce((sum, value: any) => { return Number(sum) + Number(value?.totalValue); }, 0); diff --git a/packages/yoroi-extension/app/components/wallet/assets/TokenDetails.js b/packages/yoroi-extension/app/components/wallet/assets/TokenDetails.js index aa0be9b645..22a3a9bc03 100644 --- a/packages/yoroi-extension/app/components/wallet/assets/TokenDetails.js +++ b/packages/yoroi-extension/app/components/wallet/assets/TokenDetails.js @@ -74,7 +74,7 @@ export const getNetworkUrl: ($ReadOnly) => string | void = network = function TokenDetails({ tokenInfo, network, intl }: Props & Intl): Node { if (tokenInfo == null) return null; const networkUrl = getNetworkUrl(network); - console.log("networkUrl",networkUrl) + return ( From 154d86ba8e16b3128db2293b55746b18971dec3c Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Tue, 8 Oct 2024 11:23:29 +0300 Subject: [PATCH 40/58] add extra check when parse --- .../UI/features/portfolio/common/components/PortfolioHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index d5695c5ecc..f1aeb0b5bd 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -71,7 +71,7 @@ const PortfolioHeader = ({ walletBalance, setKeyword, isLoading, tooltipTitle }: React.useEffect(() => { const setFiatPair = async () => { const portfolioStoragePair = await localStorageApi.getPortfolioFiatPair(); - const portfolioStoragePairObj = JSON.parse(portfolioStoragePair); + const portfolioStoragePairObj = portfolioStoragePair && JSON.parse(portfolioStoragePair); if (portfolioStoragePairObj) { changeUnitOfAccountPair({ From f9e890cd9a80245abd28876d537591e6a43ef5d9 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Tue, 8 Oct 2024 12:31:08 +0300 Subject: [PATCH 41/58] fix table loading, reset piar pair on select new wallet --- .../components/ilustrations/WelcomeWallet.tsx | 1540 +++++++++-------- .../common/components/WelcomeBanner.tsx | 2 +- .../useCases/TokensTable/StatsTable.tsx | 4 +- .../useCases/Wallet/PortfolioWallet.tsx | 9 - .../app/api/localStorage/index.js | 13 +- .../app/containers/NavBarContainerRevamp.js | 36 +- 6 files changed, 805 insertions(+), 799 deletions(-) diff --git a/packages/yoroi-extension/app/UI/components/ilustrations/WelcomeWallet.tsx b/packages/yoroi-extension/app/UI/components/ilustrations/WelcomeWallet.tsx index 5a2d77beaf..20dc9f0987 100644 --- a/packages/yoroi-extension/app/UI/components/ilustrations/WelcomeWallet.tsx +++ b/packages/yoroi-extension/app/UI/components/ilustrations/WelcomeWallet.tsx @@ -2,565 +2,573 @@ import React from 'react'; export const WelcomeWallet = () => { return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -572,10 +580,10 @@ export const WelcomeWallet = () => { @@ -590,10 +598,10 @@ export const WelcomeWallet = () => { @@ -605,10 +613,10 @@ export const WelcomeWallet = () => { @@ -623,10 +631,10 @@ export const WelcomeWallet = () => { @@ -638,10 +646,10 @@ export const WelcomeWallet = () => { @@ -656,10 +664,10 @@ export const WelcomeWallet = () => { @@ -671,21 +679,21 @@ export const WelcomeWallet = () => { - - + + @@ -697,18 +705,18 @@ export const WelcomeWallet = () => { { @@ -739,10 +747,10 @@ export const WelcomeWallet = () => { @@ -754,10 +762,10 @@ export const WelcomeWallet = () => { @@ -772,21 +780,21 @@ export const WelcomeWallet = () => { @@ -801,10 +809,10 @@ export const WelcomeWallet = () => { @@ -812,11 +820,11 @@ export const WelcomeWallet = () => { @@ -830,10 +838,10 @@ export const WelcomeWallet = () => { @@ -841,10 +849,10 @@ export const WelcomeWallet = () => { @@ -859,25 +867,25 @@ export const WelcomeWallet = () => { - - - + + + @@ -889,18 +897,18 @@ export const WelcomeWallet = () => { { @@ -933,10 +941,10 @@ export const WelcomeWallet = () => { @@ -948,10 +956,10 @@ export const WelcomeWallet = () => { @@ -966,10 +974,10 @@ export const WelcomeWallet = () => { @@ -981,10 +989,10 @@ export const WelcomeWallet = () => { @@ -999,10 +1007,10 @@ export const WelcomeWallet = () => { @@ -1014,97 +1022,97 @@ export const WelcomeWallet = () => { - - + + - - - + + + - - - - - - - - + + + + + + + + - - - + + + @@ -1115,10 +1123,10 @@ export const WelcomeWallet = () => { @@ -1130,11 +1138,22 @@ export const WelcomeWallet = () => { + + + + @@ -1145,10 +1164,10 @@ export const WelcomeWallet = () => { @@ -1160,21 +1179,21 @@ export const WelcomeWallet = () => { @@ -1186,22 +1205,22 @@ export const WelcomeWallet = () => { @@ -1212,18 +1231,18 @@ export const WelcomeWallet = () => { { @@ -1253,10 +1272,10 @@ export const WelcomeWallet = () => { @@ -1264,7 +1283,7 @@ export const WelcomeWallet = () => { { @@ -1294,18 +1313,18 @@ export const WelcomeWallet = () => { { + + + ); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx index 9de88b8dbe..22f4128b89 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/WelcomeBanner.tsx @@ -34,7 +34,7 @@ const WelcomeBanner = () => { - + diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx index cdd0f6d7a1..25966b418e 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/StatsTable.tsx @@ -12,6 +12,7 @@ import { useStrings } from '../../common/hooks/useStrings'; import useTableSort, { ISortState } from '../../common/hooks/useTableSort'; import { TokenType } from '../../common/types/index'; import { IHeadCell } from '../../common/types/table'; +import { usePortfolio } from '../../module/PortfolioContextProvider'; import { usePortfolioTokenActivity } from '../../module/PortfolioTokenActivityProvider'; import { TokenDisplay, TokenPrice, TokenPriceChangeChip, TokenPriceTotal, TokenProcentage } from './TableColumnsChip'; import { useProcessedTokenData } from './useProcentage'; @@ -23,6 +24,7 @@ interface Props { const StatsTable = ({ data }: Props): JSX.Element => { const theme: any = useTheme(); + const { showWelcomeBanner } = usePortfolio(); const navigateTo = useNavigateTo(); const strings = useStrings(); const [{ order, orderBy }, setSortState] = useState({ @@ -67,7 +69,7 @@ const StatsTable = ({ data }: Props): JSX.Element => { order={order} orderBy={orderBy} handleRequestSort={handleRequestSort} - isLoading={isEmpty(data24h)} + isLoading={isEmpty(data24h) && !showWelcomeBanner} TableRowSkeleton={} > {getSortedData(assetFormatedList).map((row: any) => ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx index c99bbfba91..6b2f21de7a 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx @@ -16,15 +16,6 @@ const PortfolioWallet = (): JSX.Element => { const [isLoading, _] = useState(false); const [tokenList, setTokenList] = useState(ftAssetList); - useEffect(() => { - // FAKE FETCHING DATA TO SEE SKELETON - // setIsLoading(true); - // const timer = setTimeout(() => { - // setIsLoading(false); - // }, 2000); - // return () => clearTimeout(timer); - }, []); - useEffect(() => { if (!keyword || showWelcomeBanner) { setTokenList(ftAssetList); diff --git a/packages/yoroi-extension/app/api/localStorage/index.js b/packages/yoroi-extension/app/api/localStorage/index.js index 07ec596b59..d27fe0854d 100644 --- a/packages/yoroi-extension/app/api/localStorage/index.js +++ b/packages/yoroi-extension/app/api/localStorage/index.js @@ -106,13 +106,14 @@ export default class LocalStorageApi { setUserThemeMode: string => Promise = theme => setLocalItem(storageKeys.USER_THEME, theme); - // ========== Portfolio FIAT Pair ========== // getPortfolioFiatPair: void => Promise = () => getLocalItem(storageKeys.PORTFOLIO_FIAT_PAIR); setSetPortfolioFiatPair: string => Promise = pair => setLocalItem(storageKeys.PORTFOLIO_FIAT_PAIR, pair); + resetPortfolioFiatPair: void => Promise = () => setLocalItem(storageKeys.PORTFOLIO_FIAT_PAIR, ''); + // ========== Theme Migration ========== // getUserRevampMigrationStatus: void => Promise = async () => @@ -469,8 +470,8 @@ export function createStorageFlag(key: string, defaultValue: boolean): StorageFi } export function createFlagStorage(): StorageAPI { - return { - get: async s => (await getLocalItem(s)) ?? null, - set: setLocalItem, - }; -} \ No newline at end of file + return { + get: async s => (await getLocalItem(s)) ?? null, + set: setLocalItem, + }; +} diff --git a/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js b/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js index 1e6e1d3448..b930661e50 100644 --- a/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js +++ b/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js @@ -16,6 +16,7 @@ import WalletListDialog from '../components/topbar/WalletListDialog'; import BuySellAdaButton from '../components/topbar/BuySellAdaButton'; import { ampli } from '../../ampli/index'; import { MultiToken } from '../api/common/lib/MultiToken'; +import LocalStorageApi from '../api/localStorage/index'; type Props = {| ...StoresAndActionsProps, @@ -24,6 +25,8 @@ type Props = {| pageBanner?: Node, |}; +const localStorage = new LocalStorageApi(); + @observer export default class NavBarContainerRevamp extends Component { static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { @@ -38,12 +41,12 @@ export default class NavBarContainerRevamp extends Component { await this.props.actions.profile.updateHideBalance.trigger(); }; - onSelectWallet: (number) => void = newWalletId => { + onSelectWallet: number => Promise = async newWalletId => { const { delegation, app } = this.props.stores; // we are not supporting non-reward wallets anymore, this check will be removed const isRewardWallet = delegation.isRewardWallet(newWalletId); const isStakingPage = app.currentRoute === ROUTES.STAKING; - + await localStorage.resetPortfolioFiatPair(); const route = !isRewardWallet && isStakingPage ? ROUTES.WALLETS.ROOT : app.currentRoute; this.props.actions.router.goToRoute.trigger({ route, publicDeriverId: newWalletId }); }; @@ -59,18 +62,16 @@ export default class NavBarContainerRevamp extends Component { render(): Node { const { stores, pageBanner } = this.props; - const { profile, wallets} = stores; + const { profile, wallets } = stores; const { selected, selectedWalletName } = wallets; const DropdownHead = () => { if (!selected || !selectedWalletName) { return null; } - const { plate }= selected; + const { plate } = selected; - const rewards: MultiToken = this.props.stores.delegation.getRewardBalanceOrZero( - selected - ); + const rewards: MultiToken = this.props.stores.delegation.getRewardBalanceOrZero(selected); return ( { rewards={rewards} walletAmount={selected.balance} getTokenInfo={genLookupOrFail(this.props.stores.tokenInfoStore.tokenInfo)} - defaultToken={this.props.stores.tokenInfoStore.getDefaultTokenInfo( - selected.networkId, - )} + defaultToken={this.props.stores.tokenInfoStore.getDefaultTokenInfo(selected.networkId)} unitOfAccountSetting={profile.unitOfAccount} getCurrentPrice={this.props.stores.coinPriceStore.getCurrentPrice} openWalletInfoDialog={() => { @@ -119,9 +118,7 @@ export default class NavBarContainerRevamp extends Component { const cardanoWallets = []; wallets.forEach(wallet => { - const rewards = this.props.stores.delegation.getRewardBalanceOrZero( - wallet - ); + const rewards = this.props.stores.delegation.getRewardBalanceOrZero(wallet); const walletMap = { walletId: wallet.publicDeriverId, @@ -170,20 +167,13 @@ export default class NavBarContainerRevamp extends Component { const { numberOfDecimals } = getTokenInfo(selected.balance.getDefaultEntry()).Metadata; - const receiveAdaAddress = addressToDisplayString( - selected.receiveAddress.addr.Hash, - getNetworkById(selected.networkId) - ); + const receiveAdaAddress = addressToDisplayString(selected.receiveAddress.addr.Hash, getNetworkById(selected.networkId)); return ( - this.props.actions.router.goToRoute.trigger({ route: ROUTES.EXCHANGE_END }) - } - currentBalanceAda={ - selected.balance.getDefault().shiftedBy(-numberOfDecimals) - } + onExchangeCallback={() => this.props.actions.router.goToRoute.trigger({ route: ROUTES.EXCHANGE_END })} + currentBalanceAda={selected.balance.getDefault().shiftedBy(-numberOfDecimals)} receiveAdaAddress={receiveAdaAddress} /> ); From 315d5dd7d65f0fa5e91e459f01a7e25112aaf393 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Tue, 8 Oct 2024 12:37:28 +0300 Subject: [PATCH 42/58] fix dialog opener --- packages/yoroi-extension/app/Routes.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index b4f73be48d..72eb57b913 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -586,7 +586,6 @@ export function wrapPortfolio(portfolioProps: StoresAndActionsProps, children: N const currentWalletInfo = createCurrrentWalletInfo(portfolioProps.stores); const openDialogWrapper = (dialog): void => { - portfolioProps.actions.router.goToRoute.trigger({ route: ROUTES.MY_WALLETS }); portfolioProps.actions.dialogs.open.trigger({ dialog }); }; From 3dc8d6361cd58aad259dc7dd39c381b074fd7f57 Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Tue, 8 Oct 2024 14:55:02 +0300 Subject: [PATCH 43/58] rename reset to unset --- packages/yoroi-extension/app/api/localStorage/index.js | 3 ++- .../yoroi-extension/app/containers/NavBarContainerRevamp.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/yoroi-extension/app/api/localStorage/index.js b/packages/yoroi-extension/app/api/localStorage/index.js index d27fe0854d..0ee89c2db2 100644 --- a/packages/yoroi-extension/app/api/localStorage/index.js +++ b/packages/yoroi-extension/app/api/localStorage/index.js @@ -112,7 +112,7 @@ export default class LocalStorageApi { setSetPortfolioFiatPair: string => Promise = pair => setLocalItem(storageKeys.PORTFOLIO_FIAT_PAIR, pair); - resetPortfolioFiatPair: void => Promise = () => setLocalItem(storageKeys.PORTFOLIO_FIAT_PAIR, ''); + unsetPortfolioFiatPair: void => Promise = () => removeLocalItem(storageKeys.PORTFOLIO_FIAT_PAIR); // ========== Theme Migration ========== // @@ -357,6 +357,7 @@ export default class LocalStorageApi { await this.unsetToggleSidebar(); await this.unsetAcceptedTosVersion(); await this.unsetIsAnalyticsAllowed(); + await this.unsetPortfolioFiatPair(); } getItem: string => Promise = key => getLocalItem(key); diff --git a/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js b/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js index b930661e50..119f8d6860 100644 --- a/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js +++ b/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js @@ -46,7 +46,7 @@ export default class NavBarContainerRevamp extends Component { // we are not supporting non-reward wallets anymore, this check will be removed const isRewardWallet = delegation.isRewardWallet(newWalletId); const isStakingPage = app.currentRoute === ROUTES.STAKING; - await localStorage.resetPortfolioFiatPair(); + await localStorage.unsetPortfolioFiatPair(); const route = !isRewardWallet && isStakingPage ? ROUTES.WALLETS.ROOT : app.currentRoute; this.props.actions.router.goToRoute.trigger({ route, publicDeriverId: newWalletId }); }; From 8c6bb13d4d811ca6e9565e4fec518ee3d525056e Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 10 Oct 2024 14:39:50 +0300 Subject: [PATCH 44/58] post-merge fixes --- package-lock.json | 550 ------- .../app/stores/stateless/sidebarCategories.js | 1 + packages/yoroi-extension/package-lock.json | 1296 +++++++++-------- packages/yoroi-extension/package.json | 6 +- 4 files changed, 730 insertions(+), 1123 deletions(-) diff --git a/package-lock.json b/package-lock.json index c7be7171e9..146d983e00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -160,122 +160,12 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", - "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", - "dev": true, - "peer": true, - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", @@ -1655,20 +1545,6 @@ "node": ">= 6" } }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "peer": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "peer": true - }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -1949,29 +1825,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", @@ -2123,13 +1976,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "peer": true - }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -3095,13 +2941,6 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "peer": true - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -3463,86 +3302,6 @@ "node": ">=0.8.0" } }, - "node_modules/eslint": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", - "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.11.1", - "@eslint/plugin-kit": "^0.2.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", - "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", - "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -3555,122 +3314,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/espree": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", - "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", - "dev": true, - "peer": true, - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "peer": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -3757,13 +3400,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "peer": true - }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -3797,19 +3433,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "peer": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -3871,27 +3494,6 @@ "flat": "cli.js" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "peer": true - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -4361,19 +3963,6 @@ "node": ">= 6" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -5167,16 +4756,6 @@ "node": ">=8" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -5355,32 +4934,12 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "peer": true - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -5405,13 +4964,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "peer": true - }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -5470,16 +5022,6 @@ "node": ">=0.6.0" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "peer": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -5521,20 +5063,6 @@ "node": ">= 10.18.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/libnpmaccess": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-4.0.3.tgz", @@ -5745,13 +5273,6 @@ "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true - }, "node_modules/lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -6781,24 +6302,6 @@ "opencollective-postinstall": "index.js" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "peer": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -7229,16 +6732,6 @@ "node": ">= 0.4" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -8436,19 +7929,6 @@ "node": ">=8" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -8562,13 +8042,6 @@ "node": ">=0.10" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "peer": true - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -8716,19 +8189,6 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -9161,16 +8621,6 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js index c36c82daca..25afe459ff 100644 --- a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js +++ b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js @@ -16,6 +16,7 @@ import { ReactComponent as goBackIcon } from '../../assets/images/top-bar/back-a import environment from '../../environment'; import globalMessages, { connectorMessages } from '../../i18n/global-messages'; import { ROUTES } from '../../routes-config'; +import type { WalletState } from '../../../chrome/extension/background/types'; export type SidebarCategory = {| +className: string, diff --git a/packages/yoroi-extension/package-lock.json b/packages/yoroi-extension/package-lock.json index 073b3e2740..a8860232fb 100644 --- a/packages/yoroi-extension/package-lock.json +++ b/packages/yoroi-extension/package-lock.json @@ -31,10 +31,12 @@ "@svgr/webpack": "5.5.0", "@vespaiach/axios-fetch-adapter": "^0.3.1", "@yoroi/exchange": "2.0.1", + "@yoroi/explorers": "^1.0.2", + "@yoroi/portfolio": "1.0.3", "@yoroi/resolver": "2.0.2", "@yoroi/staking": "^1.5.1", "@yoroi/swap": "1.5.2", - "@yoroi/types": "1.5.4", + "@yoroi/types": "1.5.8", "assert": "2.1.0", "async-await-queue": "2.1.4", "axios": "0.21.1", @@ -118,7 +120,9 @@ "@types/chrome": "^0.0.268", "@types/react-intl": "^3.0.0", "@types/react-router-dom": "^5.3.3", - "@yoroi/common": "1.5.0", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", + "@yoroi/common": "1.5.4", "autoprefixer": "10.2.4", "babel-eslint": "11.0.0-beta.2", "babel-jest": "26.6.3", @@ -137,11 +141,11 @@ "copy-webpack-plugin": "6.0.0", "crx": "5.0.1", "css-loader": "5.0.2", - "eslint": "7.20.0", + "eslint": "8.57.1", "eslint-config-airbnb": "18.2.1", "eslint-config-prettier": "7.2.0", - "eslint-plugin-flowtype": "5.2.1", - "eslint-plugin-import": "2.22.1", + "eslint-plugin-flowtype": "8.0.3", + "eslint-plugin-import": "2.31.0", "eslint-plugin-jsx-a11y": "6.4.1", "eslint-plugin-no-floating-promise": "1.0.2", "eslint-plugin-prettier": "3.3.1", @@ -2761,34 +2765,78 @@ "node": ">= 6" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", - "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" @@ -2797,13 +2845,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { @@ -2863,6 +2935,41 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -4590,15 +4697,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@oclif/config/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/@oclif/config/node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", @@ -4739,15 +4837,6 @@ "node": ">=8" } }, - "node_modules/@oclif/help/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/@oclif/help/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5154,15 +5243,6 @@ "node": ">=8" } }, - "node_modules/@oclif/plugin-help/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/@oclif/plugin-help/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5701,6 +5781,12 @@ "react-native": "^0.0.0-0 || >=0.60 <1.0" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "node_modules/@scure/base": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", @@ -6973,6 +7059,230 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz", + "integrity": "sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/type-utils": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz", + "integrity": "sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.1.tgz", + "integrity": "sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz", + "integrity": "sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.1.tgz", + "integrity": "sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.1.tgz", + "integrity": "sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz", + "integrity": "sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.1.tgz", + "integrity": "sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vespaiach/axios-fetch-adapter": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@vespaiach/axios-fetch-adapter/-/axios-fetch-adapter-0.3.1.tgz", @@ -7202,6 +7512,23 @@ "blake2b": "2.1.3" } }, + "node_modules/@yoroi/api/node_modules/@yoroi/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.0.tgz", + "integrity": "sha512-MSKqDSGQ8Iv18f2KCxkIl+I+nPHLww/2Y1jBiHvgaSEQ6MoN6rZsV+CIoPorSAhcc/mIiWX7gl3sdfU7trsiUQ==", + "dependencies": { + "axios": "^1.5.0", + "zod": "^3.22.1" + }, + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", + "react": ">= 16.8.0 <= 19.0.0", + "react-query": "^3.39.3" + } + }, "node_modules/@yoroi/api/node_modules/axios": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", @@ -7248,43 +7575,23 @@ "integrity": "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==" }, "node_modules/@yoroi/common": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.0.tgz", - "integrity": "sha512-MSKqDSGQ8Iv18f2KCxkIl+I+nPHLww/2Y1jBiHvgaSEQ6MoN6rZsV+CIoPorSAhcc/mIiWX7gl3sdfU7trsiUQ==", - "dependencies": { - "axios": "^1.5.0", - "zod": "^3.22.1" - }, + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.4.tgz", + "integrity": "sha512-Bh5MXDSX8UHenJIP8w6OJj+WWGRcTUjtY/dTiwPhXyvQpvUMg5wmU7iWNhKscpE4OaxCwPb9v4CzKnuTtR034Q==", + "dev": true, "engines": { "node": ">= 16.19.0" }, - "peerDependencies": { - "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", - "react": ">= 16.8.0 <= 19.0.0", - "react-query": "^3.39.3" - } - }, - "node_modules/@yoroi/common/node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@yoroi/common/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", + "axios": "^1.5.0", + "bignumber.js": "^9.0.1", + "immer": "^10.0.3", + "react": ">= 16.8.0 <= 19.0.0", + "react-native-mmkv": "^2.11.0", + "react-query": "^3.39.3", + "rxjs": "^7.8.1", + "zod": "^3.22.1" } }, "node_modules/@yoroi/exchange": { @@ -7329,6 +7636,52 @@ "zod": "^3.22.1" } }, + "node_modules/@yoroi/exchange/node_modules/@yoroi/types": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-1.5.4.tgz", + "integrity": "sha512-Hk3YHG6glQcStNjkwgDI+pWfLNfFGk+N3Iz8Iv/t+8mVFU4tZy4ZQYwtx5IIRVTwrl62maGlH9/84rwXp2u3Yw==", + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "axios": "^1.5.0" + } + }, + "node_modules/@yoroi/explorers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@yoroi/explorers/-/explorers-1.0.2.tgz", + "integrity": "sha512-mVDbmBwINKPqFF+omupesdgzRb8z+h4iqwRvg1X/MzqiKsvBtYOmJQ6TTO7gol/aYLkAFv68na6Np53Azsg4gg==", + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@yoroi/common": "1.5.4", + "immer": "^10.0.3", + "react": ">= 16.8.0 <= 19.0.0", + "react-native-mmkv": "^2.11.0", + "react-query": "^3.39.3" + } + }, + "node_modules/@yoroi/portfolio": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yoroi/portfolio/-/portfolio-1.0.3.tgz", + "integrity": "sha512-7BIncMPBMmvkrlQMECKrf03LSIIw9ok+4em+pvSsFIkvxn4HBiVw/qd7RhchiPeb9KMQvff5r9gF27gpZhyQ1A==", + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "^1.19.3", + "@yoroi/api": "1.5.2", + "@yoroi/common": "1.5.4", + "bignumber.js": "^9.0.1", + "immer": "^10.0.3", + "react": ">= 16.8.0 <= 19.0.0", + "react-native-mmkv": "^2.11.0", + "react-query": "^3.39.3", + "rxjs": "^7.8.1", + "zod": "^3.22.2" + } + }, "node_modules/@yoroi/resolver": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@yoroi/resolver/-/resolver-2.0.2.tgz", @@ -7348,6 +7701,23 @@ "react-query": "^3.39.3" } }, + "node_modules/@yoroi/resolver/node_modules/@yoroi/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@yoroi/common/-/common-1.5.0.tgz", + "integrity": "sha512-MSKqDSGQ8Iv18f2KCxkIl+I+nPHLww/2Y1jBiHvgaSEQ6MoN6rZsV+CIoPorSAhcc/mIiWX7gl3sdfU7trsiUQ==", + "dependencies": { + "axios": "^1.5.0", + "zod": "^3.22.1" + }, + "engines": { + "node": ">= 16.19.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", + "react": ">= 16.8.0 <= 19.0.0", + "react-query": "^3.39.3" + } + }, "node_modules/@yoroi/resolver/node_modules/axios": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", @@ -7537,14 +7907,17 @@ "integrity": "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==" }, "node_modules/@yoroi/types": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-1.5.4.tgz", - "integrity": "sha512-Hk3YHG6glQcStNjkwgDI+pWfLNfFGk+N3Iz8Iv/t+8mVFU4tZy4ZQYwtx5IIRVTwrl62maGlH9/84rwXp2u3Yw==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-1.5.8.tgz", + "integrity": "sha512-CswirOenBUFSMOm7CQvJM0yvW1EitpBGJ1EykPELo+jXqW+YDoBLYYCkigrhd9ytzILoqkLeVuuuqbJNockULw==", "engines": { "node": ">= 16.19.0" }, "peerDependencies": { - "axios": "^1.5.0" + "@emurgo/yoroi-lib": "^1.2.1", + "axios": "^1.5.0", + "bignumber.js": "^9.0.1", + "rxjs": "^7.8.1" } }, "node_modules/abab": { @@ -8060,6 +8433,26 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -8206,15 +8599,6 @@ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -10849,15 +11233,6 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, - "node_modules/contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -10994,15 +11369,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/copy-webpack-plugin/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/copy-webpack-plugin/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -12063,15 +12429,6 @@ "uniq": "^1.0.1" } }, - "node_modules/deglob/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -12852,54 +13209,56 @@ } }, "node_modules/eslint": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz", - "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.3.0", - "ajv": "^6.10.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -12977,9 +13336,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -13003,81 +13362,85 @@ } }, "node_modules/eslint-plugin-flowtype": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.1.tgz", - "integrity": "sha512-uXZbEzC7iGmJLoOQ4aQVLrmNGqz5il4lTblB9wmq8R53GnCkv4/Y4K0WiJ6v07rpHHI1kOm6NTp8V//P5xTqBA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", "dev": true, "dependencies": { - "lodash": "^4.17.15", + "lodash": "^4.17.21", "string-natural-compare": "^3.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" }, "peerDependencies": { - "eslint": "^7.1.0" + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" } }, "node_modules/eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "dependencies": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.4.1", @@ -13205,21 +13568,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", @@ -13229,15 +13577,6 @@ "node": ">=4" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -13253,6 +13592,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13288,34 +13633,61 @@ "dev": true }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" @@ -13333,6 +13705,18 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13346,26 +13730,56 @@ } }, "node_modules/eslint/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -14729,14 +15143,8 @@ "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functions-have-names": { "version": "1.2.3", @@ -14975,15 +15383,6 @@ "node": ">=8" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/globule": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", @@ -15088,6 +15487,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/graphql": { "version": "15.8.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", @@ -15829,9 +16234,9 @@ ] }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -16397,11 +16802,14 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16639,6 +17047,15 @@ "node": ">=8" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -19211,51 +19628,6 @@ "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", "dev": true }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -19332,6 +19704,12 @@ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lodash.omit": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", @@ -19344,12 +19722,6 @@ "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", "dev": true }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -21632,6 +22004,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -22861,15 +23247,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -23531,139 +23908,6 @@ "react-dom": ">=16.6.0" } }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", - "dev": true, - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -23822,18 +24066,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -25307,56 +25539,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -26264,44 +26446,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -26824,6 +26968,18 @@ "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-expect": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-expect/-/ts-expect-1.3.0.tgz", diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index c097840b8c..dcc04f39e0 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -101,11 +101,11 @@ "copy-webpack-plugin": "6.0.0", "crx": "5.0.1", "css-loader": "5.0.2", - "eslint": "7.20.0", + "eslint": "8.57.1", "eslint-config-airbnb": "18.2.1", "eslint-config-prettier": "7.2.0", - "eslint-plugin-flowtype": "5.2.1", - "eslint-plugin-import": "2.22.1", + "eslint-plugin-flowtype": "8.0.3", + "eslint-plugin-import": "2.31.0", "eslint-plugin-jsx-a11y": "6.4.1", "eslint-plugin-no-floating-promise": "1.0.2", "eslint-plugin-prettier": "3.3.1", From 835ee08e0bf908ef53d38bddef75ea53d6ca8cde Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Thu, 10 Oct 2024 15:17:35 +0200 Subject: [PATCH 45/58] update cards styles --- .../wallet/add-wallet-revamp/AddWalletCard.js | 24 ++++++++++++------- .../add-wallet-revamp/AddWalletCard.scss | 2 -- .../add-wallet-revamp/AddWalletPageHeader.js | 18 +++++++++++--- .../wallet/create-wallet/SelectNetworkStep.js | 17 +++++++------ .../create-wallet/SelectNetworkStep.scss | 2 -- 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletCard.js b/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletCard.js index 67ae23982d..0304edddac 100644 --- a/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletCard.js +++ b/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletCard.js @@ -1,8 +1,12 @@ // @flow import type { Node } from 'react'; -import { Box, Typography } from '@mui/material'; +import { Box, Typography, styled } from '@mui/material'; import styles from './AddWalletCard.scss'; +const GradientBox = styled(Box)(({ theme }: any) => ({ + backgroundImage: theme.palette.ds.bg_gradient_1, +})); + type Props = {| label: string, imageSrc: string, @@ -13,13 +17,15 @@ type Props = {| export default function AddWalletCard(props: Props): Node { const { label, imageSrc, onClick, id } = props; return ( - {label} - - - {label} - - + + + ); } diff --git a/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletCard.scss b/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletCard.scss index 1004fff377..fd080788c3 100644 --- a/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletCard.scss +++ b/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletCard.scss @@ -1,5 +1,4 @@ .component { - background: linear-gradient(180deg, #e4e8f7 0%, #c6f7f7 100%); border-radius: 8px; padding: 16px; width: 312px; @@ -19,7 +18,6 @@ right: 0px; bottom: 0px; left: 0px; - background: linear-gradient(180deg, #93f5e1 0%, #c6f7ed 100%); border-radius: 8px; z-index: -1; transition: opacity 300ms linear; diff --git a/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletPageHeader.js b/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletPageHeader.js index 6af747a496..6ff576b606 100644 --- a/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletPageHeader.js +++ b/packages/yoroi-extension/app/components/wallet/add-wallet-revamp/AddWalletPageHeader.js @@ -6,10 +6,18 @@ import YoroiLogo from '../../../assets/images/yoroi-logo-shape-blue.inline.svg'; import { defineMessages, intlShape } from 'react-intl'; import { observer } from 'mobx-react'; import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; -import { Typography, Box, Button } from '@mui/material'; +import { Typography, Box, Button, styled } from '@mui/material'; import globalMessages from '../../../i18n/global-messages'; import { ReactComponent as BackIcon } from '../../../assets/images/assets-page/backarrow.inline.svg'; +const IconWrapper = styled(Box)(({ theme }) => ({ + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, +})); + const messages: * = defineMessages({ backButtonLabel: { id: 'wallet.add.page.revamp.backButtonLabel', @@ -36,8 +44,12 @@ export default class AddWalletPageHeader extends Component { {hasAnyWallets && (