From 84be14ec52b69e5f3897f18f78e676fb1b9f29e6 Mon Sep 17 00:00:00 2001 From: Marcin Ciarka Date: Fri, 3 Nov 2023 22:17:56 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8D=BF=20[Portfolio]=20New=20portfolio=20?= =?UTF-8?q?view=20(#3052)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🍿 [Portfolio] Route component (#3030) * New portfolio empty page * new portfolio link * 🍿 [Portfolio] Wallet endpoint (#3038) * Added api/portfolio/wallet endpoint, some types, logging on the new empty portfolio page * add debank env * remove switch * 🍿 [Portfolio] Positions mock (#3043) * mock skeleton * new reply types * the rest of the mock and types * 🍿 [Portfolio] First batch of components - header + overview (#3056) * PortfolioHeader and PortfolioLayout * PortfolioOverview, PortfolioOverviewItem and Tag component + i18n type fixes * fancy supplied number * type fixes + rwd simple view * 🍿 [Portfolio] Second batch of components (#3059) * separated change helpers (#3063) * Added lambdas and infra provisioning (#3048) * Added lambdas and infra provisioning * Added infra integration helpers Added new infra env variables Added infra documentation * Updated lambda build flow * Fixed local dev bug in getProductBorrowNavItems.ts * fixed undefined issue * improved validation * cleanup * format fix * updated ts config * fix lint * tsc check * test * cleanup * test * moved server side call to fe * added cors headers * Refactored to use shared validators Added new lambdas for positions and assers * install lambdas deps on post * fix * fix review comments * Pw/integrate-lambdas (#3068) * improved error handling * added backend client integrated views with backend integrated lambda with fe types * added mock to lambda * 🍿 [Portfolio] Position components (#3064) * Portfolio wallet tab (#3069) * summary * PortfolioWalletSummary * top assets * real data + skeleton * top assets data connection * assets list * assets list * parse products * list with products * guards * resolve wallet changes --------- Co-authored-by: codesandbox-bot * 🍿 [Portfolio] Build fixes (#3071) * fixes and updates to lambdas (#3072) * fixes and updates to lambdas * fixed comments --------- Co-authored-by: Marcin Ciarka * Fixed types naming * Fixed lambda logic Updated overview * Fixed portfolio overview --------- Co-authored-by: Piotr Konowrocki Co-authored-by: Piotr Witek <739075+piotrwitek@users.noreply.github.com> Co-authored-by: codesandbox-bot --- .env.template | 6 +- .eslintrc.json | 6 +- .gitignore | 2 + .prettierignore | 2 + blockchain/contracts/arbitrum.ts | 8 +- blockchain/contracts/base.ts | 8 +- blockchain/contracts/goerli.ts | 8 +- blockchain/contracts/mainnet.ts | 10 +- blockchain/contracts/optimism.ts | 8 +- blockchain/networks/debank-network-names.ts | 26 + components/AnimatedWrapper.tsx | 2 +- components/Announcement.tsx | 2 +- components/AutomationIcon.tsx | 62 + components/BenefitCard.tsx | 2 +- components/Checkbox.tsx | 2 +- components/ChevronUpDown.tsx | 2 +- components/DetailsSectionContentCard.tsx | 2 +- components/DetailsSectionFooterItem.tsx | 2 +- components/DetailsSectionNotification.tsx | 2 +- components/DrawerMenu.tsx | 2 +- components/Footer.tsx | 4 +- components/GasCost.tsx | 2 +- components/GenericMultiselect.tsx | 7 +- components/GenericSelect.tsx | 7 +- components/HeadTags.tsx | 2 +- components/HomepageTabLayout.tsx | 2 +- components/ImagesSlider.tsx | 2 +- components/InfoCard.tsx | 2 +- components/LanguageSelect.tsx | 2 +- components/ListWithIcon.tsx | 2 +- components/Modal.tsx | 4 +- components/Notice.tsx | 2 +- components/PromoCard.tsx | 2 +- components/ReferralModal.tsx | 2 +- components/Skeleton.tsx | 3 +- components/SuccessfullJoinModal.tsx | 2 +- components/Tag.tsx | 23 + components/TextWithCheckmark.tsx | 2 +- components/TokensGroup.tsx | 36 +- components/TopBanners.tsx | 2 +- components/assetsTable/AssetsTable.tsx | 2 +- .../AssetsTableDataCellAsset.tsx | 12 +- .../AssetsTableDataCellRiskProtectionIcon.tsx | 2 +- components/history/PositionHistoryItem.tsx | 2 +- components/infoSection/Item.tsx | 2 +- components/layouts/PortfolioLayout.tsx | 23 + components/layouts/WithAnnouncementLayout.tsx | 2 +- components/navigation/Navigation.tsx | 2 +- .../NavigationMenuDropdownContentListItem.tsx | 2 +- .../navigation/NavigationMobileMenu.tsx | 2 +- .../NavigationNetworkSwitcherButton.tsx | 2 +- .../NavigationNetworkSwitcherL2BeatButton.tsx | 2 +- .../NavigationNetworkSwitcherModal.tsx | 2 +- .../navigation/content/MyPositionsOrb.tsx | 3 +- .../NotificationsCenterHeader.tsx | 2 +- .../NotificationsEmailSetupSuccess.tsx | 2 +- components/portfolio/PortfolioHeader.tsx | 33 + components/portfolio/PortfolioOverview.tsx | 127 + .../portfolio/PortfolioOverviewItem.tsx | 33 + .../portfolio/PortfolioOverviewSkeleton.tsx | 69 + .../helpers/getPortfolioAccentColor.ts | 5 + .../helpers/getPortfolioChangeColor.ts | 6 + .../helpers/getPortfolioChangeSign.ts | 3 + .../helpers/getPortfolioTokenProducts.ts | 35 + components/portfolio/helpers/index.ts | 3 + .../PortfolioPositionAutomationIcons.tsx | 27 + .../positions/PortfolioPositionBlock.tsx | 106 + .../PortfolioPositionBlockDetail.tsx | 65 + .../PortfolioPositionBlockSkeleton.tsx | 76 + .../PortfolioPositionsProductSelect.tsx | 44 + .../PortfolioPositionsSortingSelect.tsx | 47 + .../positions/PortfolioPositionsView.tsx | 186 + components/portfolio/positions/types.ts | 11 + .../wallet/PortfolioWalletAssets.tsx | 115 + .../wallet/PortfolioWalletSummary.tsx | 68 + .../wallet/PortfolioWalletTopAssets.tsx | 68 + .../portfolio/wallet/PortfolioWalletView.tsx | 68 + .../productCards/ProductCardsWrapper.tsx | 2 +- components/sidebar/SidebarSection.tsx | 2 +- components/sidebar/SidebarSectionStatus.tsx | 2 +- components/vault/MultipleRangeSlider.tsx | 2 +- components/vault/OptimizationControl.tsx | 2 +- components/vault/ProtectionControl.tsx | 2 +- components/vault/TxStatusCard.tsx | 2 +- components/vault/VaultActionInput.tsx | 2 +- components/vault/VaultDetails.tsx | 2 +- components/vault/VaultHeader.tsx | 2 +- components/vault/VaultHeading.tsx | 2 +- .../vault/sidebar/SidebarResetButton.tsx | 2 +- components/vault/sidebar/SidebarSliders.tsx | 2 +- .../vault/sidebar/SidebarVaultProxyStage.tsx | 2 +- .../sidebar/SidebarVaultStopLossStage.tsx | 2 +- .../OrderInformationTooltipAction.tsx | 2 +- .../sidebars/SidebarManageAaveVault.tsx | 2 +- .../open/sidebars/SidebarOpenAaveVault.tsx | 2 +- features/ajna/common/layout.tsx | 2 +- .../components/ContentFooterItemsBorrow.tsx | 2 +- .../sidebars/AjnaBorrowFormContentSwitch.tsx | 2 +- .../AjnaBorrowFormContentTransition.tsx | 2 +- .../common/components/AjnaAdjustSlider.tsx | 2 +- .../components/AjnaDupePositionModal.tsx | 3 +- .../contentCards/ContentCardNetBorrowCost.tsx | 2 +- .../common/controls/AjnaProductController.tsx | 2 +- .../common/sidebars/AjnaFormContentRisk.tsx | 2 +- .../sidebars/AjnaFormContentTransaction.tsx | 2 +- .../AjnaMultiplyFormContentSwitch.tsx | 2 +- .../AjnaMultiplyFormContentTransition.tsx | 2 +- .../SidebarAutomationFeatureCreationStage.tsx | 2 +- .../manage/containers/ManageVaultDetails.tsx | 2 +- .../SidebarOpenBorrowVaultOpenStage.tsx | 2 +- .../discover/common/DiscoverNavigation.tsx | 2 +- features/dsr/containers/DsrEditing.tsx | 2 +- features/dsr/helpers/dsrHistory.ts | 2 +- features/dsr/sidebar/DsrSidebarCreation.tsx | 2 +- .../GuniManageMultiplyVaultEditing.tsx | 2 +- .../sidebars/SidebarManageGuniVault.tsx | 2 +- .../SidebarManageGuniVaultManageStage.tsx | 2 +- .../SidebarOpenGuniVaultOpenStage.tsx | 2 +- features/follow/common/ShareButton.tsx | 2 +- features/follow/view/FollowButton.tsx | 2 +- features/homepage/HomepageView.tsx | 2 +- features/homepage/common/Hero.tsx | 2 +- features/homepage/common/HomepageHeadline.tsx | 2 +- .../containers/ManageMultiplyVaultEditing.tsx | 2 +- .../sidebars/SidebarManageMultiplyVault.tsx | 2 +- .../SidebarManageMultiplyVaultManageStage.tsx | 2 +- ...ebarManageMultiplyVaultTransitionStage.tsx | 2 +- .../SidebarOpenMultiplyVaultOpenStage.tsx | 2 +- .../controls/AjnaNavigationController.tsx | 3 +- .../controls/NavigationController.tsx | 5 +- .../helpers/getProductBorrowNavItems.ts | 7 +- features/newsletter/NewsletterView.tsx | 2 +- features/notices/VaultsNoticesView.tsx | 11 +- .../components/sidebars/OmniAdjustSlider.tsx | 2 +- .../sidebars/OmniFormContentTransaction.tsx | 2 +- .../borrow/OmniBorrowFormContentSwitch.tsx | 2 +- .../OmniBorrowFormContentTransition.tsx | 2 +- .../OmniMultiplyFormContentSwitch.tsx | 2 +- .../OmniMultiplyFormContentTransition.tsx | 2 +- .../controllers/OmniProductController.tsx | 2 +- .../OmniValidationMessagesController.tsx | 2 +- .../helpers/getOmniFlowStateConfig.ts | 2 +- features/omni-kit/hooks/useOmniTransition.ts | 2 +- features/omni-kit/protocols/ajna/constants.ts | 2 +- .../ajna/metadata/AjnaOmniEarnFormOrder.tsx | 2 +- .../ajna/metadata/AjnaOmniFormContentRisk.tsx | 2 +- .../protocols/morpho-blue/constants.ts | 2 +- .../omni-kit/server/getOmniServerSideProps.ts | 2 +- .../poolCreator/hooks/usePoolCreatorData.tsx | 2 +- .../components/PoolFinderAddressInput.tsx | 2 +- .../components/PoolFinderReplacer.tsx | 2 +- ...inderNaturalLanguageSelectorController.tsx | 2 +- features/productHub/views/ProductHubView.tsx | 2 +- features/referralOverview/FeesView.tsx | 2 +- features/referralOverview/ReferralLanding.tsx | 2 +- features/referralOverview/ReferralLayout.tsx | 2 +- features/referralOverview/ReferralsView.tsx | 2 +- .../dpmAccount/CreateDPMAccountView.tsx | 2 +- features/stateMachines/proxy/ProxyView.tsx | 2 +- features/termsOfService/TermsOfService.tsx | 4 +- features/termsOfService/termsAcceptance.ts | 2 +- features/userSettings/UserSettingsView.tsx | 4 +- features/vaultHistory/VaultHistoryEntry.tsx | 2 +- features/vaultsOverview/Filters.tsx | 4 +- ...AssetsAndPositionsOverviewLoadingState.tsx | 2 +- .../containers/AssetsAndPositionsOverview.tsx | 4 +- .../containers/ConnectWalletPrompt.tsx | 2 +- .../product-hub/helpers/get-token-group.ts | 3 +- helpers/clients/portfolio-client.ts | 40 + helpers/form.tsx | 2 +- helpers/get-portfolio-link.ts | 10 + infra/.gitignore | 11 + infra/__tests__/main-test.ts | 89 + infra/cdktf.json | 11 + infra/help | 51 + infra/jest.config.js | 187 + infra/main.ts | 135 + infra/package-lock.json | 4475 +++++++++++++++++ infra/package.json | 38 + infra/readme.md | 29 + infra/setup.js | 2 + infra/tsconfig.json | 35 + lambdas/README.md | 7 + lambdas/package-lock.json | 523 ++ lambdas/package.json | 21 + lambdas/src/common/constants.ts | 1 + lambdas/src/common/debank.ts | 55 + lambdas/src/common/domain.ts | 21 + lambdas/src/common/errors.ts | 7 + lambdas/src/common/guards.ts | 7 + lambdas/src/common/helpers.ts | 6 + lambdas/src/common/responses.ts | 48 + lambdas/src/common/types.ts | 3 + lambdas/src/common/validators.ts | 21 + lambdas/src/portfolio-assets/index.ts | 66 + lambdas/src/portfolio-assets/types.ts | 15 + lambdas/src/portfolio-overview/index.ts | 113 + lambdas/src/portfolio-overview/types.ts | 9 + lambdas/src/portfolio-positions/index.ts | 24 + lambdas/src/portfolio-positions/mock.ts | 324 ++ lambdas/src/portfolio-positions/types.ts | 77 + lambdas/tsconfig.json | 67 + lambdas/yarn.lock | 13 + package.json | 23 +- .../aave/[version]/[...strategy].tsx | 2 +- .../aave/[version]/[vault].tsx | 4 +- .../spark/[version]/[...strategy].tsx | 2 +- .../spark/[version]/[vault].tsx | 4 +- pages/_app.tsx | 6 +- pages/about.tsx | 2 +- pages/api/rpcGateway.tsx | 2 +- pages/brand.tsx | 2 +- pages/earn/dsr/index.tsx | 2 +- pages/owner/[address]/index.tsx | 3 +- pages/portfolio/[address].tsx | 100 + pages/security.tsx | 2 +- public/locales/en/portfolio.json | 71 + server/helpers/get-aws-infra-header.ts | 18 + server/helpers/get-aws-infra-url.ts | 7 + server/helpers/index.ts | 2 + .../adding-stop-loss-animation-static.tsx | 2 +- .../open-vault-animation-static.tsx | 2 +- theme/icons/auto_buy.tsx | 14 + theme/icons/auto_sell.tsx | 14 + theme/icons/index.ts | 458 +- .../icons/portfolio_product_dropdown_icon.tsx | 13 + theme/icons/portfolio_sort_dropdown_icon.tsx | 21 + theme/icons/stop_loss.tsx | 14 + theme/icons/take_profit.tsx | 14 + theme/index.tsx | 70 + ts_modules/i18next.d.ts | 8 +- tsconfig.json | 14 +- tsconfig.test.json | 2 +- yarn.lock | 1066 ++-- 234 files changed, 9106 insertions(+), 1144 deletions(-) create mode 100644 blockchain/networks/debank-network-names.ts create mode 100644 components/AutomationIcon.tsx create mode 100644 components/Tag.tsx create mode 100644 components/layouts/PortfolioLayout.tsx create mode 100644 components/portfolio/PortfolioHeader.tsx create mode 100644 components/portfolio/PortfolioOverview.tsx create mode 100644 components/portfolio/PortfolioOverviewItem.tsx create mode 100644 components/portfolio/PortfolioOverviewSkeleton.tsx create mode 100644 components/portfolio/helpers/getPortfolioAccentColor.ts create mode 100644 components/portfolio/helpers/getPortfolioChangeColor.ts create mode 100644 components/portfolio/helpers/getPortfolioChangeSign.ts create mode 100644 components/portfolio/helpers/getPortfolioTokenProducts.ts create mode 100644 components/portfolio/helpers/index.ts create mode 100644 components/portfolio/positions/PortfolioPositionAutomationIcons.tsx create mode 100644 components/portfolio/positions/PortfolioPositionBlock.tsx create mode 100644 components/portfolio/positions/PortfolioPositionBlockDetail.tsx create mode 100644 components/portfolio/positions/PortfolioPositionBlockSkeleton.tsx create mode 100644 components/portfolio/positions/PortfolioPositionsProductSelect.tsx create mode 100644 components/portfolio/positions/PortfolioPositionsSortingSelect.tsx create mode 100644 components/portfolio/positions/PortfolioPositionsView.tsx create mode 100644 components/portfolio/positions/types.ts create mode 100644 components/portfolio/wallet/PortfolioWalletAssets.tsx create mode 100644 components/portfolio/wallet/PortfolioWalletSummary.tsx create mode 100644 components/portfolio/wallet/PortfolioWalletTopAssets.tsx create mode 100644 components/portfolio/wallet/PortfolioWalletView.tsx create mode 100644 helpers/clients/portfolio-client.ts create mode 100644 helpers/get-portfolio-link.ts create mode 100644 infra/.gitignore create mode 100644 infra/__tests__/main-test.ts create mode 100644 infra/cdktf.json create mode 100644 infra/help create mode 100644 infra/jest.config.js create mode 100644 infra/main.ts create mode 100644 infra/package-lock.json create mode 100644 infra/package.json create mode 100644 infra/readme.md create mode 100644 infra/setup.js create mode 100644 infra/tsconfig.json create mode 100644 lambdas/README.md create mode 100644 lambdas/package-lock.json create mode 100644 lambdas/package.json create mode 100644 lambdas/src/common/constants.ts create mode 100644 lambdas/src/common/debank.ts create mode 100644 lambdas/src/common/domain.ts create mode 100644 lambdas/src/common/errors.ts create mode 100644 lambdas/src/common/guards.ts create mode 100644 lambdas/src/common/helpers.ts create mode 100644 lambdas/src/common/responses.ts create mode 100644 lambdas/src/common/types.ts create mode 100644 lambdas/src/common/validators.ts create mode 100644 lambdas/src/portfolio-assets/index.ts create mode 100644 lambdas/src/portfolio-assets/types.ts create mode 100644 lambdas/src/portfolio-overview/index.ts create mode 100644 lambdas/src/portfolio-overview/types.ts create mode 100644 lambdas/src/portfolio-positions/index.ts create mode 100644 lambdas/src/portfolio-positions/mock.ts create mode 100644 lambdas/src/portfolio-positions/types.ts create mode 100644 lambdas/tsconfig.json create mode 100644 lambdas/yarn.lock create mode 100644 pages/portfolio/[address].tsx create mode 100644 public/locales/en/portfolio.json create mode 100644 server/helpers/get-aws-infra-header.ts create mode 100644 server/helpers/get-aws-infra-url.ts create mode 100644 server/helpers/index.ts create mode 100644 theme/icons/auto_buy.tsx create mode 100644 theme/icons/auto_sell.tsx create mode 100644 theme/icons/portfolio_product_dropdown_icon.tsx create mode 100644 theme/icons/portfolio_sort_dropdown_icon.tsx create mode 100644 theme/icons/stop_loss.tsx create mode 100644 theme/icons/take_profit.tsx diff --git a/.env.template b/.env.template index 6b7f522819..634ce5e620 100644 --- a/.env.template +++ b/.env.template @@ -12,6 +12,10 @@ INFURA_PROJECT_ID_BACKEND="de82b2d602264e4fbc0929dec0c45baa" OPTIMISM_MAINNET_RPC_URL="" ARBITRUM_MAINNET_RPC_URL="" +# AWS INFRA +AWS_API_GATEWAY_URL="" +AWS_API_GATEWAY_KEY="" + # APIs ETHERSCAN_API_KEY="34JVYM6RPM3J1SK8QXQFRNSHD9XG4UHXVU" ONE_INCH_API_URL="https://api-oasis.1inch.io" @@ -62,4 +66,4 @@ NOTIFICATIONS_HOST="" NOTIFICATIONS_HOST_GOERLI="" RPC_GATEWAY= -GROOVE_WIDGET_ID= \ No newline at end of file +GROOVE_WIDGET_ID= diff --git a/.eslintrc.json b/.eslintrc.json index 5fd154ea84..12ddcc3b62 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,5 +1,5 @@ { - "ignorePatterns": ["node_modules", "types", "coverage"], + "ignorePatterns": ["node_modules", "types", "coverage", "infra", "lambdas"], "env": { "es6": true }, @@ -24,7 +24,7 @@ "react/jsx-uses-react": "error", "react/jsx-uses-vars": "error", "import/no-duplicates": "error", - "simple-import-sort/sort": [ + "simple-import-sort/imports": [ "error", { "groups": [ @@ -47,6 +47,8 @@ "@typescript-eslint/no-useless-constructor": "error", "@typescript-eslint/no-non-null-assertion": "warn", "@typescript-eslint/no-shadow": ["warn", { "builtinGlobals": true, "hoist": "all" }], + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["error"], "@typescript-eslint/consistent-type-imports": [ "error", { diff --git a/.gitignore b/.gitignore index 9b9201f98f..c09abf4b20 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,8 @@ yalc.lock .log .DS_Store .sentryclirc +*.zip +artifacts public/precache.*.*.js public/sw.js diff --git a/.prettierignore b/.prettierignore index 07aa5ec467..3076fa3a92 100644 --- a/.prettierignore +++ b/.prettierignore @@ -11,3 +11,5 @@ coverage .run .swc .vercel +jest.config.js +setup.js diff --git a/blockchain/contracts/arbitrum.ts b/blockchain/contracts/arbitrum.ts index 3857eb902f..c3ea824604 100644 --- a/blockchain/contracts/arbitrum.ts +++ b/blockchain/contracts/arbitrum.ts @@ -2,17 +2,17 @@ import { ADDRESSES } from '@oasisdex/addresses' import * as aaveV2PriceOracle from 'blockchain/abi/aave-v2-price-oracle.json' import * as aaveV2ProtocolDataProvider from 'blockchain/abi/aave-v2-protocol-data-provider.json' import * as aaveV3Oracle from 'blockchain/abi/aave-v3-oracle.json' -import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as aaveV3Pool from 'blockchain/abi/aave-v3-pool.json' +import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as accountFactory from 'blockchain/abi/account-factory.json' import * as accountGuard from 'blockchain/abi/account-guard.json' import * as ajnaERC20PoolFactory from 'blockchain/abi/ajna-erc20-pool-factory.json' -import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaPool from 'blockchain/abi/ajna-pool.json' +import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaProxyActions from 'blockchain/abi/ajna-proxy-actions.json' +import * as automationBot from 'blockchain/abi/automation-bot.json' import * as automationBotAggregator from 'blockchain/abi/automation-bot-aggregator.json' import * as automationBotV2 from 'blockchain/abi/automation-bot-v2.json' -import * as automationBot from 'blockchain/abi/automation-bot.json' import * as balancerVault from 'blockchain/abi/balancer-vault.json' import * as cdpRegistry from 'blockchain/abi/cdp-registry.json' import * as chainLinkPriceOracle from 'blockchain/abi/chainlink-price-oracle.json' @@ -22,10 +22,10 @@ import * as dssCdpManager from 'blockchain/abi/dss-cdp-manager.json' import * as dssCharter from 'blockchain/abi/dss-charter.json' import * as dssCropper from 'blockchain/abi/dss-cropper.json' import * as guniProxyActions from 'blockchain/abi/dss-guni-proxy-actions.json' +import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as dssProxyActionsCharter from 'blockchain/abi/dss-proxy-actions-charter.json' import * as dssProxyActionsCropjoin from 'blockchain/abi/dss-proxy-actions-cropjoin.json' import * as dssProxyActionsDsr from 'blockchain/abi/dss-proxy-actions-dsr.json' -import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as exchange from 'blockchain/abi/exchange.json' import * as getCdps from 'blockchain/abi/get-cdps.json' import * as lidoCrvLiquidityFarmingReward from 'blockchain/abi/lido-crv-liquidity-farming-reward.json' diff --git a/blockchain/contracts/base.ts b/blockchain/contracts/base.ts index af474282e3..3dfd991c28 100644 --- a/blockchain/contracts/base.ts +++ b/blockchain/contracts/base.ts @@ -2,17 +2,17 @@ import { ADDRESSES } from '@oasisdex/addresses' import * as aaveV2PriceOracle from 'blockchain/abi/aave-v2-price-oracle.json' import * as aaveV2ProtocolDataProvider from 'blockchain/abi/aave-v2-protocol-data-provider.json' import * as aaveV3Oracle from 'blockchain/abi/aave-v3-oracle.json' -import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as aaveV3Pool from 'blockchain/abi/aave-v3-pool.json' +import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as accountFactory from 'blockchain/abi/account-factory.json' import * as accountGuard from 'blockchain/abi/account-guard.json' import * as ajnaERC20PoolFactory from 'blockchain/abi/ajna-erc20-pool-factory.json' -import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaPool from 'blockchain/abi/ajna-pool.json' +import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaProxyActions from 'blockchain/abi/ajna-proxy-actions.json' +import * as automationBot from 'blockchain/abi/automation-bot.json' import * as automationBotAggregator from 'blockchain/abi/automation-bot-aggregator.json' import * as automationBotV2 from 'blockchain/abi/automation-bot-v2.json' -import * as automationBot from 'blockchain/abi/automation-bot.json' import * as balancerVault from 'blockchain/abi/balancer-vault.json' import * as cdpRegistry from 'blockchain/abi/cdp-registry.json' import * as dsProxyFactory from 'blockchain/abi/ds-proxy-factory.json' @@ -21,10 +21,10 @@ import * as dssCdpManager from 'blockchain/abi/dss-cdp-manager.json' import * as dssCharter from 'blockchain/abi/dss-charter.json' import * as dssCropper from 'blockchain/abi/dss-cropper.json' import * as guniProxyActions from 'blockchain/abi/dss-guni-proxy-actions.json' +import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as dssProxyActionsCharter from 'blockchain/abi/dss-proxy-actions-charter.json' import * as dssProxyActionsCropjoin from 'blockchain/abi/dss-proxy-actions-cropjoin.json' import * as dssProxyActionsDsr from 'blockchain/abi/dss-proxy-actions-dsr.json' -import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as exchange from 'blockchain/abi/exchange.json' import * as getCdps from 'blockchain/abi/get-cdps.json' import * as lidoCrvLiquidityFarmingReward from 'blockchain/abi/lido-crv-liquidity-farming-reward.json' diff --git a/blockchain/contracts/goerli.ts b/blockchain/contracts/goerli.ts index 8bd34f3a92..a02c734276 100644 --- a/blockchain/contracts/goerli.ts +++ b/blockchain/contracts/goerli.ts @@ -3,17 +3,17 @@ import * as aaveV2LendingPool from 'blockchain/abi/aave-v2-lending-pool.json' import * as aaveV2PriceOracle from 'blockchain/abi/aave-v2-price-oracle.json' import * as aaveV2ProtocolDataProvider from 'blockchain/abi/aave-v2-protocol-data-provider.json' import * as aaveV3Oracle from 'blockchain/abi/aave-v3-oracle.json' -import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as aaveV3Pool from 'blockchain/abi/aave-v3-pool.json' +import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as accountFactory from 'blockchain/abi/account-factory.json' import * as accountGuard from 'blockchain/abi/account-guard.json' import * as ajnaERC20PoolFactory from 'blockchain/abi/ajna-erc20-pool-factory.json' -import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaPool from 'blockchain/abi/ajna-pool.json' +import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaProxyActions from 'blockchain/abi/ajna-proxy-actions.json' +import * as automationBot from 'blockchain/abi/automation-bot.json' import * as automationBotAggregator from 'blockchain/abi/automation-bot-aggregator.json' import * as automationBotV2 from 'blockchain/abi/automation-bot-v2.json' -import * as automationBot from 'blockchain/abi/automation-bot.json' import * as balancerVault from 'blockchain/abi/balancer-vault.json' import * as cdpRegistry from 'blockchain/abi/cdp-registry.json' import * as chainLinkPriceOracle from 'blockchain/abi/chainlink-price-oracle.json' @@ -23,10 +23,10 @@ import * as dssCdpManager from 'blockchain/abi/dss-cdp-manager.json' import * as dssCharter from 'blockchain/abi/dss-charter.json' import * as dssCropper from 'blockchain/abi/dss-cropper.json' import * as guniProxyActions from 'blockchain/abi/dss-guni-proxy-actions.json' +import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as dssProxyActionsCharter from 'blockchain/abi/dss-proxy-actions-charter.json' import * as dssProxyActionsCropjoin from 'blockchain/abi/dss-proxy-actions-cropjoin.json' import * as dssProxyActionsDsr from 'blockchain/abi/dss-proxy-actions-dsr.json' -import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as exchange from 'blockchain/abi/exchange.json' import * as getCdps from 'blockchain/abi/get-cdps.json' import * as lidoCrvLiquidityFarmingReward from 'blockchain/abi/lido-crv-liquidity-farming-reward.json' diff --git a/blockchain/contracts/mainnet.ts b/blockchain/contracts/mainnet.ts index f550072a16..da78ef0c53 100644 --- a/blockchain/contracts/mainnet.ts +++ b/blockchain/contracts/mainnet.ts @@ -3,17 +3,17 @@ import * as aaveV2LendingPool from 'blockchain/abi/aave-v2-lending-pool.json' import * as aaveV2PriceOracle from 'blockchain/abi/aave-v2-price-oracle.json' import * as aaveV2ProtocolDataProvider from 'blockchain/abi/aave-v2-protocol-data-provider.json' import * as aaveV3Oracle from 'blockchain/abi/aave-v3-oracle.json' -import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as aaveV3Pool from 'blockchain/abi/aave-v3-pool.json' +import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as accountFactory from 'blockchain/abi/account-factory.json' import * as accountGuard from 'blockchain/abi/account-guard.json' import * as ajnaERC20PoolFactory from 'blockchain/abi/ajna-erc20-pool-factory.json' -import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaPool from 'blockchain/abi/ajna-pool.json' +import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaProxyActions from 'blockchain/abi/ajna-proxy-actions.json' +import * as automationBot from 'blockchain/abi/automation-bot.json' import * as automationBotAggregator from 'blockchain/abi/automation-bot-aggregator.json' import * as automationBotV2 from 'blockchain/abi/automation-bot-v2.json' -import * as automationBot from 'blockchain/abi/automation-bot.json' import * as balancerVault from 'blockchain/abi/balancer-vault.json' import * as cdpRegistry from 'blockchain/abi/cdp-registry.json' import * as chainLinkPriceOracle from 'blockchain/abi/chainlink-price-oracle.json' @@ -23,10 +23,10 @@ import * as dssCdpManager from 'blockchain/abi/dss-cdp-manager.json' import * as dssCharter from 'blockchain/abi/dss-charter.json' import * as dssCropper from 'blockchain/abi/dss-cropper.json' import * as guniProxyActions from 'blockchain/abi/dss-guni-proxy-actions.json' +import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as dssProxyActionsCharter from 'blockchain/abi/dss-proxy-actions-charter.json' import * as dssProxyActionsCropjoin from 'blockchain/abi/dss-proxy-actions-cropjoin.json' import * as dssProxyActionsDsr from 'blockchain/abi/dss-proxy-actions-dsr.json' -import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as exchange from 'blockchain/abi/exchange.json' import * as getCdps from 'blockchain/abi/get-cdps.json' import * as lidoCrvLiquidityFarmingReward from 'blockchain/abi/lido-crv-liquidity-farming-reward.json' @@ -42,8 +42,8 @@ import * as dssMultiplyProxyActions from 'blockchain/abi/multiply-proxy-actions. import * as operationExecutor from 'blockchain/abi/operation-executor.json' import * as otcSupport from 'blockchain/abi/otc-support-methods.json' import * as sparkV3Oracle from 'blockchain/abi/spark-v3-oracle.json' -import * as sparkV3PoolDataProvider from 'blockchain/abi/spark-v3-pool-data-provider.json' import * as sparkV3Pool from 'blockchain/abi/spark-v3-pool.json' +import * as sparkV3PoolDataProvider from 'blockchain/abi/spark-v3-pool-data-provider.json' import * as vat from 'blockchain/abi/vat.json' import { getCollateralJoinContracts, diff --git a/blockchain/contracts/optimism.ts b/blockchain/contracts/optimism.ts index 704e595ed7..5639600407 100644 --- a/blockchain/contracts/optimism.ts +++ b/blockchain/contracts/optimism.ts @@ -2,17 +2,17 @@ import { ADDRESSES } from '@oasisdex/addresses' import * as aaveV2PriceOracle from 'blockchain/abi/aave-v2-price-oracle.json' import * as aaveV2ProtocolDataProvider from 'blockchain/abi/aave-v2-protocol-data-provider.json' import * as aaveV3Oracle from 'blockchain/abi/aave-v3-oracle.json' -import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as aaveV3Pool from 'blockchain/abi/aave-v3-pool.json' +import * as aaveV3PoolDataProvider from 'blockchain/abi/aave-v3-pool-data-provider.json' import * as accountFactory from 'blockchain/abi/account-factory.json' import * as accountGuard from 'blockchain/abi/account-guard.json' import * as ajnaERC20PoolFactory from 'blockchain/abi/ajna-erc20-pool-factory.json' -import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaPool from 'blockchain/abi/ajna-pool.json' +import * as ajnaPoolInfo from 'blockchain/abi/ajna-pool-info.json' import * as ajnaProxyActions from 'blockchain/abi/ajna-proxy-actions.json' +import * as automationBot from 'blockchain/abi/automation-bot.json' import * as automationBotAggregator from 'blockchain/abi/automation-bot-aggregator.json' import * as automationBotV2 from 'blockchain/abi/automation-bot-v2.json' -import * as automationBot from 'blockchain/abi/automation-bot.json' import * as balancerVault from 'blockchain/abi/balancer-vault.json' import * as cdpRegistry from 'blockchain/abi/cdp-registry.json' import * as chainLinkPriceOracle from 'blockchain/abi/chainlink-price-oracle.json' @@ -22,10 +22,10 @@ import * as dssCdpManager from 'blockchain/abi/dss-cdp-manager.json' import * as dssCharter from 'blockchain/abi/dss-charter.json' import * as dssCropper from 'blockchain/abi/dss-cropper.json' import * as guniProxyActions from 'blockchain/abi/dss-guni-proxy-actions.json' +import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as dssProxyActionsCharter from 'blockchain/abi/dss-proxy-actions-charter.json' import * as dssProxyActionsCropjoin from 'blockchain/abi/dss-proxy-actions-cropjoin.json' import * as dssProxyActionsDsr from 'blockchain/abi/dss-proxy-actions-dsr.json' -import * as dssProxyActions from 'blockchain/abi/dss-proxy-actions.json' import * as exchange from 'blockchain/abi/exchange.json' import * as gasPriceOracle from 'blockchain/abi/gas-price-oracle.json' import * as getCdps from 'blockchain/abi/get-cdps.json' diff --git a/blockchain/networks/debank-network-names.ts b/blockchain/networks/debank-network-names.ts new file mode 100644 index 0000000000..c49386d522 --- /dev/null +++ b/blockchain/networks/debank-network-names.ts @@ -0,0 +1,26 @@ +import { NetworkNames } from './network-names' + +// based on https://docs.cloud.debank.com/en/readme/api-pro-reference/chain#returns-1 +export enum DebankNetworkNames { + ethereumMainnet = 'eth', + arbitrumMainnet = 'arb', + polygonMainnet = 'matic', + optimismMainnet = 'op', + baseMainnet = 'base', +} + +export const DebankNetworkNameToOurs = { + [DebankNetworkNames.ethereumMainnet]: NetworkNames.ethereumMainnet, + [DebankNetworkNames.arbitrumMainnet]: NetworkNames.arbitrumMainnet, + [DebankNetworkNames.polygonMainnet]: NetworkNames.polygonMainnet, + [DebankNetworkNames.optimismMainnet]: NetworkNames.optimismMainnet, + [DebankNetworkNames.baseMainnet]: NetworkNames.baseMainnet, +} + +export const OursNameToDebankNetworkName = { + [NetworkNames.ethereumMainnet]: DebankNetworkNames.ethereumMainnet, + [NetworkNames.arbitrumMainnet]: DebankNetworkNames.arbitrumMainnet, + [NetworkNames.polygonMainnet]: DebankNetworkNames.polygonMainnet, + [NetworkNames.optimismMainnet]: DebankNetworkNames.optimismMainnet, + [NetworkNames.baseMainnet]: DebankNetworkNames.baseMainnet, +} diff --git a/components/AnimatedWrapper.tsx b/components/AnimatedWrapper.tsx index 3d92605589..29115a8d39 100644 --- a/components/AnimatedWrapper.tsx +++ b/components/AnimatedWrapper.tsx @@ -1,8 +1,8 @@ import type { PropsWithChildren } from 'react' import React from 'react' +import { slideInAnimation } from 'theme/animations' import type { ThemeUIStyleObject } from 'theme-ui' import { Box } from 'theme-ui' -import { slideInAnimation } from 'theme/animations' export function AnimatedWrapper({ children, sx }: PropsWithChildren<{ sx?: ThemeUIStyleObject }>) { return ( diff --git a/components/Announcement.tsx b/components/Announcement.tsx index 4390bdc465..e807d7f478 100644 --- a/components/Announcement.tsx +++ b/components/Announcement.tsx @@ -1,6 +1,6 @@ import React, { useLayoutEffect, useState } from 'react' -import { Box, Flex, Text } from 'theme-ui' import { announcement } from 'theme/icons' +import { Box, Flex, Text } from 'theme-ui' import { Icon } from './Icon' import { AppLink } from './Links' diff --git a/components/AutomationIcon.tsx b/components/AutomationIcon.tsx new file mode 100644 index 0000000000..0c7484a9e2 --- /dev/null +++ b/components/AutomationIcon.tsx @@ -0,0 +1,62 @@ +import { Icon } from 'components/Icon' +import { StatefulTooltip } from 'components/Tooltip' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { auto_buy, auto_sell, stop_loss, take_profit } from 'theme/icons' +import { Text } from 'theme-ui' + +import type { PortfolioPosition } from 'lambdas/src/portfolio-positions/types' + +const automationIconMap: Record = { + autoBuy: auto_buy, + autoSell: auto_sell, + takeProfit: take_profit, + stopLoss: stop_loss, +} + +export const AutomationIcon = ({ + enabled, + type, +}: { + enabled: boolean + type: keyof PortfolioPosition['automations'] +}) => { + const { t: tPortfolio } = useTranslation('portfolio') + return ( + {tPortfolio(`automation-details.${type}`)}} + tooltipSx={{ + mt: '-98px', // just above the icon + height: '58px', + borderRadius: 'medium', + }} + containerSx={{ + width: '34px', + height: '34px', + backgroundColor: enabled ? 'success100' : 'secondary60', + ':hover': { + backgroundColor: enabled ? 'success10' : 'secondary60', + '& path': { + color: enabled ? 'success100' : 'primary60', + }, + }, + cursor: 'pointer', + borderRadius: 'round', + mr: 2, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }} + > + + + ) +} diff --git a/components/BenefitCard.tsx b/components/BenefitCard.tsx index a2b8b188a1..17b5c089d9 100644 --- a/components/BenefitCard.tsx +++ b/components/BenefitCard.tsx @@ -2,8 +2,8 @@ import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useTranslation } from 'next-i18next' import type { PropsWithChildren } from 'react' import React from 'react' -import { Box, Card, Flex, Grid, Image, Text } from 'theme-ui' import { slideInAnimation } from 'theme/animations' +import { Box, Card, Flex, Grid, Image, Text } from 'theme-ui' export function BenefitCardsWrapper({ children }: PropsWithChildren<{}>) { return ( diff --git a/components/Checkbox.tsx b/components/Checkbox.tsx index 9a49aa2d6f..dac125de0c 100644 --- a/components/Checkbox.tsx +++ b/components/Checkbox.tsx @@ -1,7 +1,7 @@ import type { FC, MouseEventHandler } from 'react' import React from 'react' -import { Flex } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Flex } from 'theme-ui' import { Icon } from './Icon' diff --git a/components/ChevronUpDown.tsx b/components/ChevronUpDown.tsx index 295af32e9f..0bc81d0c38 100644 --- a/components/ChevronUpDown.tsx +++ b/components/ChevronUpDown.tsx @@ -1,6 +1,6 @@ import React from 'react' -import type { ThemeUIStyleObject } from 'theme-ui' import { chevron_down, chevron_up } from 'theme/icons' +import type { ThemeUIStyleObject } from 'theme-ui' import { Icon } from './Icon' import type { IconProps } from './Icon.types' diff --git a/components/DetailsSectionContentCard.tsx b/components/DetailsSectionContentCard.tsx index 4ec5c5aa8b..7df14d5c9b 100644 --- a/components/DetailsSectionContentCard.tsx +++ b/components/DetailsSectionContentCard.tsx @@ -5,9 +5,9 @@ import { useModal } from 'helpers/modalHook' import type { TranslateStringType } from 'helpers/translateStringType' import type { PropsWithChildren, ReactNode } from 'react' import React, { useState } from 'react' +import { question_o } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Flex, Grid, Text } from 'theme-ui' -import { question_o } from 'theme/icons' import { Icon } from './Icon' import { AppLink } from './Links' diff --git a/components/DetailsSectionFooterItem.tsx b/components/DetailsSectionFooterItem.tsx index 9b0b63677e..b3833ba99e 100644 --- a/components/DetailsSectionFooterItem.tsx +++ b/components/DetailsSectionFooterItem.tsx @@ -4,9 +4,9 @@ import { useModal } from 'helpers/modalHook' import type { TranslateStringType } from 'helpers/translateStringType' import type { ReactNode } from 'react' import React, { useState } from 'react' +import { question_o } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Flex, Grid, Text } from 'theme-ui' -import { question_o } from 'theme/icons' import type { DetailsSectionContentCardChangePillProps } from './DetailsSectionContentCard' import { DetailsSectionContentCardChangePill } from './DetailsSectionContentCard' diff --git a/components/DetailsSectionNotification.tsx b/components/DetailsSectionNotification.tsx index 08d22695f3..ed008c70e1 100644 --- a/components/DetailsSectionNotification.tsx +++ b/components/DetailsSectionNotification.tsx @@ -3,8 +3,8 @@ import { kebabCase } from 'lodash' import { useTranslation } from 'next-i18next' import type { ReactNode } from 'react' import React, { Fragment, useEffect, useState } from 'react' -import { Box, Button, Flex, Text } from 'theme-ui' import { close } from 'theme/icons' +import { Box, Button, Flex, Text } from 'theme-ui' import { Icon } from './Icon' import type { IconProps } from './Icon.types' diff --git a/components/DrawerMenu.tsx b/components/DrawerMenu.tsx index f5330804dc..bf7ddf1e3f 100644 --- a/components/DrawerMenu.tsx +++ b/components/DrawerMenu.tsx @@ -1,8 +1,8 @@ import type { PropsWithChildren } from 'react' import React from 'react' +import { mobile_menu_close } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box } from 'theme-ui' -import { mobile_menu_close } from 'theme/icons' import { Icon } from './Icon' diff --git a/components/Footer.tsx b/components/Footer.tsx index ba4d945f9a..9400e4c8b1 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -4,11 +4,11 @@ import dayjs from 'dayjs' import { NewsletterSection } from 'features/newsletter/NewsletterView' import { EXTERNAL_LINKS, INTERNAL_LINKS } from 'helpers/applicationLinks' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' -import { useTranslation } from 'next-i18next' import getConfig from 'next/config' +import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Card, Container, Flex, Grid, Image, Link, Text } from 'theme-ui' import { discord, github, twitter } from 'theme/icons' +import { Box, Card, Container, Flex, Grid, Image, Link, Text } from 'theme-ui' import { ChevronUpDown } from './ChevronUpDown' import { Icon } from './Icon' diff --git a/components/GasCost.tsx b/components/GasCost.tsx index 0ccf626f32..93e9968591 100644 --- a/components/GasCost.tsx +++ b/components/GasCost.tsx @@ -4,8 +4,8 @@ import type { HasGasEstimation } from 'helpers/types/HasGasEstimation.types' import { GasEstimationStatus } from 'helpers/types/HasGasEstimation.types' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Flex, Text } from 'theme-ui' import { dai, question_o } from 'theme/icons' +import { Box, Flex, Text } from 'theme-ui' import type { TranslationType } from 'ts_modules/i18next' import { Icon } from './Icon' diff --git a/components/GenericMultiselect.tsx b/components/GenericMultiselect.tsx index 46771035c3..fa33d59b21 100644 --- a/components/GenericMultiselect.tsx +++ b/components/GenericMultiselect.tsx @@ -7,8 +7,9 @@ import { useToggle } from 'helpers/useToggle' import { useTranslation } from 'next-i18next' import type { ReactNode } from 'react' import React, { useEffect, useRef, useState } from 'react' -import { Box, Flex, Image, Text } from 'theme-ui' import { checkmark, clear_selection } from 'theme/icons' +import type { ThemeUIStyleObject } from 'theme-ui' +import { Box, Flex, Image, Text } from 'theme-ui' import type { FeaturesEnum } from 'types/config' import { Icon } from './Icon' @@ -29,6 +30,7 @@ export interface GenericMultiselectProps { label: string options: GenericMultiselectOption[] onChange: (value: string[]) => void + sx?: ThemeUIStyleObject } function GenericMultiselectIcon({ @@ -156,6 +158,7 @@ export function GenericMultiselect({ label, options, onChange, + sx, }: GenericMultiselectProps) { const { t } = useTranslation() @@ -209,7 +212,7 @@ export function GenericMultiselect({ } return ( - + void options: GenericSelectOption[] - placeholder?: string + placeholder?: string | ReactNode wrapperSx?: ThemeUIStyleObject } @@ -55,7 +56,7 @@ export function GenericSelect({ options, placeholder, wrapperSx, -}: GenericSelectProps) { +}: Readonly) { const isMobile = useOnMobile() && isTouchDevice const componentRef = useOutsideElementClickHandler(() => setIsOpen(false)) const [isOpen, toggleIsOpen, setIsOpen] = useToggle(false) diff --git a/components/HeadTags.tsx b/components/HeadTags.tsx index 340147faec..11144b868d 100644 --- a/components/HeadTags.tsx +++ b/components/HeadTags.tsx @@ -1,8 +1,8 @@ import { INTERNAL_LINKS } from 'helpers/applicationLinks' import { getRandomString } from 'helpers/getRandomString' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' -import { useTranslation } from 'next-i18next' import Head from 'next/head' +import { useTranslation } from 'next-i18next' import React from 'react' interface SEOTagsType { diff --git a/components/HomepageTabLayout.tsx b/components/HomepageTabLayout.tsx index 0c386d111d..6a818e1920 100644 --- a/components/HomepageTabLayout.tsx +++ b/components/HomepageTabLayout.tsx @@ -1,6 +1,6 @@ import React from 'react' -import { Flex, Text } from 'theme-ui' import { fadeInAnimation } from 'theme/animations' +import { Flex, Text } from 'theme-ui' export function HomepageTabLayout(props: { paraText?: JSX.Element; cards: JSX.Element }) { return ( diff --git a/components/ImagesSlider.tsx b/components/ImagesSlider.tsx index 8a50f487ed..7e6b90d7bd 100644 --- a/components/ImagesSlider.tsx +++ b/components/ImagesSlider.tsx @@ -1,8 +1,8 @@ import { random } from 'lodash' import React, { useEffect, useState } from 'react' +import { fadeInAnimationMobile } from 'theme/animations' import type { ThemeUIStyleObject } from 'theme-ui' import { Container, Grid, Image } from 'theme-ui' -import { fadeInAnimationMobile } from 'theme/animations' export type ImagesSliderProps = { items: { diff --git a/components/InfoCard.tsx b/components/InfoCard.tsx index 143c3df9a1..6203acc5b9 100644 --- a/components/InfoCard.tsx +++ b/components/InfoCard.tsx @@ -1,9 +1,9 @@ import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import type { PropsWithChildren } from 'react' import React from 'react' +import { arrow_right } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Card, Heading, Text } from 'theme-ui' -import { arrow_right } from 'theme/icons' import { Icon } from './Icon' import { AppLink } from './Links' diff --git a/components/LanguageSelect.tsx b/components/LanguageSelect.tsx index 5e6748e097..c35945c998 100644 --- a/components/LanguageSelect.tsx +++ b/components/LanguageSelect.tsx @@ -1,6 +1,6 @@ import type { InitOptions } from 'i18next' -import { useTranslation } from 'next-i18next' import { useRouter } from 'next/router' +import { useTranslation } from 'next-i18next' import React, { useMemo } from 'react' import type { Props as SelectProps } from 'react-select' import ReactSelect from 'react-select' diff --git a/components/ListWithIcon.tsx b/components/ListWithIcon.tsx index df7430ce1b..fd41b47b1c 100644 --- a/components/ListWithIcon.tsx +++ b/components/ListWithIcon.tsx @@ -1,9 +1,9 @@ import { Trans } from 'next-i18next' import type { ReactNode } from 'react' import React from 'react' +import { checkbox } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Grid, Text } from 'theme-ui' -import { checkbox } from 'theme/icons' import { Icon } from './Icon' import type { IconProps } from './Icon.types' diff --git a/components/Modal.tsx b/components/Modal.tsx index ccd3d35d31..4cff2e52bc 100644 --- a/components/Modal.tsx +++ b/components/Modal.tsx @@ -8,6 +8,8 @@ import type { PropsWithChildren, ReactNode } from 'react' import React, { useCallback, useEffect, useState } from 'react' import { createPortal } from 'react-dom' import { TRANSITIONS } from 'theme' +import { close_squared } from 'theme/icons' +import { useOnMobile } from 'theme/useBreakpointIndex' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, @@ -21,8 +23,6 @@ import { IconButton, Text, } from 'theme-ui' -import { close_squared } from 'theme/icons' -import { useOnMobile } from 'theme/useBreakpointIndex' import { Icon } from './Icon' import { AppLink } from './Links' diff --git a/components/Notice.tsx b/components/Notice.tsx index 8a765c6fde..de9f868ad4 100644 --- a/components/Notice.tsx +++ b/components/Notice.tsx @@ -1,8 +1,8 @@ import type { PropsWithChildren } from 'react' import React from 'react' +import { close_squared } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, IconButton } from 'theme-ui' -import { close_squared } from 'theme/icons' import { Icon } from './Icon' diff --git a/components/PromoCard.tsx b/components/PromoCard.tsx index 7267214273..b3c760f481 100644 --- a/components/PromoCard.tsx +++ b/components/PromoCard.tsx @@ -5,9 +5,9 @@ import { TokensGroup } from 'components/TokensGroup' import { Translatable } from 'components/Translatable' import type { FC } from 'react' import React from 'react' +import { arrow_decrease, arrow_increase } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Flex, Heading, Image, Text } from 'theme-ui' -import { arrow_decrease, arrow_increase } from 'theme/icons' import { Icon } from './Icon' import type { PromoCardProps, PromoCardVariant, PromoCardWrapperProps } from './PromoCard.types' diff --git a/components/ReferralModal.tsx b/components/ReferralModal.tsx index a6cb5d2260..e5439fa465 100644 --- a/components/ReferralModal.tsx +++ b/components/ReferralModal.tsx @@ -2,8 +2,8 @@ import { EXTERNAL_LINKS } from 'helpers/applicationLinks' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useTranslation } from 'next-i18next' import React from 'react' -import { Button, Flex, Grid, Heading, Image, Text } from 'theme-ui' import { arrow_right, checkmark } from 'theme/icons' +import { Button, Flex, Grid, Heading, Image, Text } from 'theme-ui' import { Icon } from './Icon' import { AppLink } from './Links' diff --git a/components/Skeleton.tsx b/components/Skeleton.tsx index 52d16da1e1..f272298b16 100644 --- a/components/Skeleton.tsx +++ b/components/Skeleton.tsx @@ -2,7 +2,7 @@ import React from 'react' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Grid } from 'theme-ui' -type SkeletonColorTheme = 'default' | 'dark' | 'positive' | 'negative' +type SkeletonColorTheme = 'default' | 'dark' | 'positive' | 'negative' | 'fancy' type SkeletonColorThemes = { [key in SkeletonColorTheme]: [string, string] @@ -13,6 +13,7 @@ const skeletonColorTheme: SkeletonColorThemes = { default: ['#e6e9eb', '#f8f7f9'], negative: ['#ffeee9', '#fff9f7'], positive: ['#e7fcfa', '#f7fefd'], + fancy: ['#ccf1fc', '#fcece3'], // based on the two main summer colors: #007DA3 + #E7A77F } interface SkeletonProps { diff --git a/components/SuccessfullJoinModal.tsx b/components/SuccessfullJoinModal.tsx index e26eb9f8bb..17e43530d8 100644 --- a/components/SuccessfullJoinModal.tsx +++ b/components/SuccessfullJoinModal.tsx @@ -3,8 +3,8 @@ import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useRedirect } from 'helpers/useRedirect' import { useTranslation } from 'next-i18next' import React from 'react' -import { Button, Flex, Grid, Heading, Image, Text } from 'theme-ui' import { arrow_right } from 'theme/icons' +import { Button, Flex, Grid, Heading, Image, Text } from 'theme-ui' import { Icon } from './Icon' import { AppLink } from './Links' diff --git a/components/Tag.tsx b/components/Tag.tsx new file mode 100644 index 0000000000..40dbf57fa4 --- /dev/null +++ b/components/Tag.tsx @@ -0,0 +1,23 @@ +import type { PropsWithChildren } from 'react' +import React from 'react' +import type { ThemeUIStyleObject } from 'theme-ui' +import { Box } from 'theme-ui' + +export const Tag = ({ + children, + variant = 'tagPrimary', + sx, +}: PropsWithChildren<{ + variant?: + | 'tagPrimary' + | 'tagSecondary' + | 'tagWarning' + | 'tagCritical' + | 'tagSuccess' + | 'tagInteractive' + sx?: ThemeUIStyleObject +}>) => ( + + {children} + +) diff --git a/components/TextWithCheckmark.tsx b/components/TextWithCheckmark.tsx index 3df3c7b3c7..5e52e29024 100644 --- a/components/TextWithCheckmark.tsx +++ b/components/TextWithCheckmark.tsx @@ -1,7 +1,7 @@ import type { PropsWithChildren } from 'react' import React from 'react' -import { Flex, Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Flex, Text } from 'theme-ui' import { Icon } from './Icon' diff --git a/components/TokensGroup.tsx b/components/TokensGroup.tsx index c04acd7a27..8178123ef2 100644 --- a/components/TokensGroup.tsx +++ b/components/TokensGroup.tsx @@ -1,25 +1,37 @@ +import { type NetworkNames, networksByName } from 'blockchain/networks' import { getToken } from 'blockchain/tokensMetadata' import { tokensBySymbol } from 'blockchain/tokensMetadata.constants' import { GenericTokenIcon } from 'components/GenericTokenIcon' +import { Icon } from 'components/Icon' import React from 'react' import type { ThemeUIStyleObject } from 'theme-ui' -import { Flex } from 'theme-ui' - -import { Icon } from './Icon' +import { Flex, Image } from 'theme-ui' interface TokensGroupProps { forceSize?: number + network?: NetworkNames sx?: ThemeUIStyleObject tokens: string[] } -export function TokensGroup({ forceSize, sx, tokens }: TokensGroupProps) { +export function TokensGroup({ forceSize, network, sx, tokens }: TokensGroupProps) { const defaultSingleSize = 44 const defaultMultipleSize = 30 + const networkSize = forceSize ?? (tokens.length > 1 ? defaultSingleSize : defaultMultipleSize) return ( - + {tokens.map((token, i) => ( ))} + {network && ( + {networksByName[network].label} + )} ) } diff --git a/components/TopBanners.tsx b/components/TopBanners.tsx index 9df17ce1e8..407d2bf436 100644 --- a/components/TopBanners.tsx +++ b/components/TopBanners.tsx @@ -6,9 +6,9 @@ import type { ConfiguredAppParameters } from 'helpers/config/types' import { useLocalStorage } from 'helpers/useLocalStorage' import React from 'react' import { useCookie, useWindowSize } from 'react-use' -import { Box, Text } from 'theme-ui' import { rollDownTopBannerAnimation } from 'theme/animations' import { close, loudspeaker } from 'theme/icons' +import { Box, Text } from 'theme-ui' import { Icon } from './Icon' import { AppLink } from './Links' diff --git a/components/assetsTable/AssetsTable.tsx b/components/assetsTable/AssetsTable.tsx index b7a03f0c22..8be9dffeb6 100644 --- a/components/assetsTable/AssetsTable.tsx +++ b/components/assetsTable/AssetsTable.tsx @@ -15,8 +15,8 @@ import { getRandomString } from 'helpers/getRandomString' import { kebabCase } from 'lodash' import { useTranslation } from 'next-i18next' import React, { Fragment, useEffect, useMemo, useRef, useState } from 'react' -import { Box, Flex } from 'theme-ui' import { question_o } from 'theme/icons' +import { Box, Flex } from 'theme-ui' interface AssetsTableHeaderCellProps { first: boolean diff --git a/components/assetsTable/cellComponents/AssetsTableDataCellAsset.tsx b/components/assetsTable/cellComponents/AssetsTableDataCellAsset.tsx index f06f8cbffa..c1866ee704 100644 --- a/components/assetsTable/cellComponents/AssetsTableDataCellAsset.tsx +++ b/components/assetsTable/cellComponents/AssetsTableDataCellAsset.tsx @@ -1,5 +1,6 @@ import { TokensGroup } from 'components/TokensGroup' import { allDefined } from 'helpers/allDefined' +import type { ReactNode } from 'react' import React from 'react' import { useTranslation } from 'react-i18next' import { Flex, Text } from 'theme-ui' @@ -8,6 +9,7 @@ interface AssetsTableDataCellAssetProps { asset: string icons?: string[] positionId?: string + description?: ReactNode prefix?: string suffix?: string } @@ -16,6 +18,7 @@ export function AssetsTableDataCellAsset({ asset, icons = [], positionId, + description, prefix, suffix, }: AssetsTableDataCellAssetProps) { @@ -39,10 +42,15 @@ export function AssetsTableDataCellAsset({ )} - {positionId && ( + {(positionId || description) && ( - {t('position')} {!positionId.toString().includes('...') && '#'} + {positionId && ( + <> + {t('position')} {!positionId.toString().includes('...') && '#'} + + )} {positionId} + {description} )} diff --git a/components/assetsTable/cellComponents/AssetsTableDataCellRiskProtectionIcon.tsx b/components/assetsTable/cellComponents/AssetsTableDataCellRiskProtectionIcon.tsx index 111bf1cbb5..1226620970 100644 --- a/components/assetsTable/cellComponents/AssetsTableDataCellRiskProtectionIcon.tsx +++ b/components/assetsTable/cellComponents/AssetsTableDataCellRiskProtectionIcon.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import React from 'react' import { useTranslation } from 'react-i18next' -import { Button, Flex } from 'theme-ui' import { stop_loss_active } from 'theme/icons' +import { Button, Flex } from 'theme-ui' interface AssetsTableDataRiskProtectionIconProps { isOwner?: boolean diff --git a/components/history/PositionHistoryItem.tsx b/components/history/PositionHistoryItem.tsx index 20960f6c40..77753445b7 100644 --- a/components/history/PositionHistoryItem.tsx +++ b/components/history/PositionHistoryItem.tsx @@ -13,8 +13,8 @@ import { getHistoryEventLabel } from 'features/positionHistory/getHistoryEventLa import { useTranslation } from 'next-i18next' import type { FC } from 'react' import React, { useState } from 'react' -import { Box, Flex, Text } from 'theme-ui' import { chevron_down, chevron_up } from 'theme/icons' +import { Box, Flex, Text } from 'theme-ui' interface PositionHistoryItemProps { collateralToken: string diff --git a/components/infoSection/Item.tsx b/components/infoSection/Item.tsx index f4680f9d61..558b7e90bd 100644 --- a/components/infoSection/Item.tsx +++ b/components/infoSection/Item.tsx @@ -6,8 +6,8 @@ import { StatefulTooltip } from 'components/Tooltip' import type { TranslateStringType } from 'helpers/translateStringType' import type { ReactNode } from 'react' import React, { useState } from 'react' -import { Box, Flex, Grid, Text } from 'theme-ui' import { arrow_right_light, question_o } from 'theme/icons' +import { Box, Flex, Grid, Text } from 'theme-ui' export type SecondaryVariantType = 'positive' | 'negative' | 'neutral' diff --git a/components/layouts/PortfolioLayout.tsx b/components/layouts/PortfolioLayout.tsx new file mode 100644 index 0000000000..3c65198f90 --- /dev/null +++ b/components/layouts/PortfolioLayout.tsx @@ -0,0 +1,23 @@ +import { Footer } from 'components/Footer' +import { WithAnnouncementLayout } from 'components/layouts/WithAnnouncementLayout' +import { ModalTrezorMetamaskEIP1559 } from 'components/Modal' +import { NavigationController } from 'features/navigation/controls/NavigationController' +import type { PropsWithChildren } from 'react' +import React from 'react' +import { BackgroundLight } from 'theme/BackgroundLight' + +export function PortfolioLayout({ children }: PropsWithChildren<{}>) { + return ( + } + header={} + bg={} + variant="portfolio" + > + {children} + + + ) +} diff --git a/components/layouts/WithAnnouncementLayout.tsx b/components/layouts/WithAnnouncementLayout.tsx index f85c917fa3..7f4c06673d 100644 --- a/components/layouts/WithAnnouncementLayout.tsx +++ b/components/layouts/WithAnnouncementLayout.tsx @@ -1,8 +1,8 @@ import { Announcement } from 'components/Announcement' import { EXTERNAL_LINKS } from 'helpers/applicationLinks' import React from 'react' -import { Container, Flex } from 'theme-ui' import { Background } from 'theme/Background' +import { Container, Flex } from 'theme-ui' import type { BasicLayoutProps } from './BasicLayout' diff --git a/components/navigation/Navigation.tsx b/components/navigation/Navigation.tsx index 9d69daa63e..5699091166 100644 --- a/components/navigation/Navigation.tsx +++ b/components/navigation/Navigation.tsx @@ -7,8 +7,8 @@ import { INTERNAL_LINKS } from 'helpers/applicationLinks' import { useOutsideElementClickHandler } from 'helpers/useOutsideElementClickHandler' import { useToggle } from 'helpers/useToggle' import React from 'react' -import { Box, Container, ThemeUIProvider } from 'theme-ui' import { menu } from 'theme/icons' +import { Box, Container, ThemeUIProvider } from 'theme-ui' import { useMediaQuery } from 'usehooks-ts' import { navigationBreakpoints, navigationBreakpointsWithPixels } from './Navigation.constants' diff --git a/components/navigation/NavigationMenuDropdownContentListItem.tsx b/components/navigation/NavigationMenuDropdownContentListItem.tsx index 4b65df0f83..2ef600aa88 100644 --- a/components/navigation/NavigationMenuDropdownContentListItem.tsx +++ b/components/navigation/NavigationMenuDropdownContentListItem.tsx @@ -1,9 +1,9 @@ import { Icon } from 'components/Icon' import { NavigationMenuDropdownContentIcon } from 'components/navigation/NavigationMenuDropdownContentIcon' import React from 'react' +import { star } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Flex, Heading, Text } from 'theme-ui' -import { star } from 'theme/icons' import type { NavigationMenuPanelList } from './Navigation.types' diff --git a/components/navigation/NavigationMobileMenu.tsx b/components/navigation/NavigationMobileMenu.tsx index 141479f054..f7533687dd 100644 --- a/components/navigation/NavigationMobileMenu.tsx +++ b/components/navigation/NavigationMobileMenu.tsx @@ -5,8 +5,8 @@ import { NavigationMobileMenuPanel } from 'components/navigation/NavigationMobil import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useTranslation } from 'next-i18next' import React, { useState } from 'react' -import { Flex, Image } from 'theme-ui' import { arrow_left, close as closeIcon } from 'theme/icons' +import { Flex, Image } from 'theme-ui' import type { NavigationMenuPanelLinkType, NavigationMenuPanelType } from './Navigation.types' diff --git a/components/navigation/NavigationNetworkSwitcherButton.tsx b/components/navigation/NavigationNetworkSwitcherButton.tsx index 279919eae6..961afe2f25 100644 --- a/components/navigation/NavigationNetworkSwitcherButton.tsx +++ b/components/navigation/NavigationNetworkSwitcherButton.tsx @@ -5,8 +5,8 @@ import { SWAP_WIDGET_CHANGE_SUBJECT } from 'features/swapWidget/SwapWidgetChange import { useObservable } from 'helpers/observableHook' import { uiChanges } from 'helpers/uiChanges' import React, { useCallback } from 'react' -import { Box, Button, Image, Link } from 'theme-ui' import { arrow_right_light, tick } from 'theme/icons' +import { Box, Button, Image, Link } from 'theme-ui' export const NetworkButton = ({ network, diff --git a/components/navigation/NavigationNetworkSwitcherL2BeatButton.tsx b/components/navigation/NavigationNetworkSwitcherL2BeatButton.tsx index b48639f195..952febcb46 100644 --- a/components/navigation/NavigationNetworkSwitcherL2BeatButton.tsx +++ b/components/navigation/NavigationNetworkSwitcherL2BeatButton.tsx @@ -2,8 +2,8 @@ import { Icon } from 'components/Icon' import { useTranslation } from 'next-i18next' import l2beatLogo from 'public/static/img/l2beat-logo.svg' import React, { useState } from 'react' -import { Box, Image, Link } from 'theme-ui' import { arrow_right_light } from 'theme/icons' +import { Box, Image, Link } from 'theme-ui' export const L2BeatSection = () => { const [hover, setHover] = useState(false) diff --git a/components/navigation/NavigationNetworkSwitcherModal.tsx b/components/navigation/NavigationNetworkSwitcherModal.tsx index cf505874f0..a2e9054719 100644 --- a/components/navigation/NavigationNetworkSwitcherModal.tsx +++ b/components/navigation/NavigationNetworkSwitcherModal.tsx @@ -8,8 +8,8 @@ import { Icon } from 'components/Icon' import { Modal } from 'components/Modal' import type { ModalProps } from 'helpers/modalHook' import React from 'react' -import { Box, Button, Flex, IconButton, Image, Input, Text } from 'theme-ui' import { close_squared } from 'theme/icons' +import { Box, Button, Flex, IconButton, Image, Input, Text } from 'theme-ui' export function NavigationNetworkSwitcherModal({ close: _close }: ModalProps<{}>) { const [forkSettings, setForkSettings] = useCustomForkParameter() diff --git a/components/navigation/content/MyPositionsOrb.tsx b/components/navigation/content/MyPositionsOrb.tsx index 490267a6a8..b8b790738a 100644 --- a/components/navigation/content/MyPositionsOrb.tsx +++ b/components/navigation/content/MyPositionsOrb.tsx @@ -1,4 +1,5 @@ import { NavigationOrb } from 'components/navigation/NavigationMenuOrb' +import { getPortfolioLink } from 'helpers/get-portfolio-link' import { useAccount } from 'helpers/useAccount' import React from 'react' import { home } from 'theme/icons' @@ -10,7 +11,7 @@ export function MyPositionsOrb() { ) diff --git a/components/notifications/NotificationsCenterHeader.tsx b/components/notifications/NotificationsCenterHeader.tsx index 7dff3749b0..30ef9c8a3c 100644 --- a/components/notifications/NotificationsCenterHeader.tsx +++ b/components/notifications/NotificationsCenterHeader.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import { useTranslation } from 'next-i18next' import React from 'react' -import { Button, Flex, Text } from 'theme-ui' import { arrow_left, settings } from 'theme/icons' +import { Button, Flex, Text } from 'theme-ui' interface NotificationsCenterHeaderProps { onButtonClick: () => void diff --git a/components/notifications/NotificationsEmailSetupSuccess.tsx b/components/notifications/NotificationsEmailSetupSuccess.tsx index 39affab756..1840da1d63 100644 --- a/components/notifications/NotificationsEmailSetupSuccess.tsx +++ b/components/notifications/NotificationsEmailSetupSuccess.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import { useTranslation } from 'next-i18next' import React from 'react' -import { Flex, Text } from 'theme-ui' import { tick } from 'theme/icons' +import { Flex, Text } from 'theme-ui' export function NotificationsSetupSuccess() { const { t } = useTranslation() diff --git a/components/portfolio/PortfolioHeader.tsx b/components/portfolio/PortfolioHeader.tsx new file mode 100644 index 0000000000..f4bedb606b --- /dev/null +++ b/components/portfolio/PortfolioHeader.tsx @@ -0,0 +1,33 @@ +import Avatar from 'boring-avatars' +import { formatAddress } from 'helpers/formatters/format' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { Button, Flex, Text } from 'theme-ui' + +export const PortfolioHeader = ({ address }: { address: string }) => { + const { t: tPortfolio } = useTranslation('portfolio') + return ( + + + + + {formatAddress(address, 6)} + + + + + + + ) +} diff --git a/components/portfolio/PortfolioOverview.tsx b/components/portfolio/PortfolioOverview.tsx new file mode 100644 index 0000000000..419cdfb02d --- /dev/null +++ b/components/portfolio/PortfolioOverview.tsx @@ -0,0 +1,127 @@ +import BigNumber from 'bignumber.js' +import { AppLink } from 'components/Links' +import { getPortfolioChangeColor, getPortfolioChangeSign } from 'components/portfolio/helpers' +import { PortfolioOverviewItem } from 'components/portfolio/PortfolioOverviewItem' +import { Tag } from 'components/Tag' +import { WithArrow } from 'components/WithArrow' +import { formatAmount } from 'helpers/formatters/format' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { Flex, Heading, Text } from 'theme-ui' + +import type { PortfolioOverviewResponse } from 'lambdas/src/portfolio-overview/types' + +export const PortfolioOverview = ({ + address, + overviewData, +}: { + address: string + overviewData?: PortfolioOverviewResponse | void +}) => { + const { t: tPortfolio } = useTranslation('portfolio') + + if (!overviewData) { + return <>'Loading' + } + + return ( + + + + ${formatAmount(new BigNumber(overviewData.walletBalanceUsdValue), 'USD')} + + } + subValue={ + + {tPortfolio('view-assets')} + + } + firstInColumn + /> + + + + ${formatAmount(new BigNumber(overviewData.totalUsdValue), 'USD')} + + } + subValue={ + + {getPortfolioChangeSign(overviewData.totalPercentageChange)} + {tPortfolio('past-week', { percentage: overviewData.totalPercentageChange })} + + } + /> + + ${formatAmount(new BigNumber(overviewData.suppliedUsdValue), 'USD')} + + } + subValue={ + + {getPortfolioChangeSign(overviewData.suppliedPercentageChange)} + {tPortfolio('past-week', { percentage: overviewData.suppliedPercentageChange })} + + } + /> + + ${formatAmount(new BigNumber(overviewData.borrowedUsdValue), 'USD')} + + } + subValue={ + + {getPortfolioChangeSign(overviewData.borrowedPercentageChange)} + {tPortfolio('past-week', { percentage: overviewData.borrowedPercentageChange })} + + } + /> + + {tPortfolio('coming-soon')} + + } + /> + + + ) +} diff --git a/components/portfolio/PortfolioOverviewItem.tsx b/components/portfolio/PortfolioOverviewItem.tsx new file mode 100644 index 0000000000..192c7af508 --- /dev/null +++ b/components/portfolio/PortfolioOverviewItem.tsx @@ -0,0 +1,33 @@ +import type { TranslateStringType } from 'helpers/translateStringType' +import type { ReactNode } from 'react' +import React from 'react' +import { Flex, Text } from 'theme-ui' + +export const PortfolioOverviewItem = ({ + header, + value, + subValue, + firstInColumn, +}: { + header: TranslateStringType + value: ReactNode + subValue?: ReactNode + firstInColumn?: boolean +}) => { + return ( + + + {header} + + {value} + {subValue} + + ) +} diff --git a/components/portfolio/PortfolioOverviewSkeleton.tsx b/components/portfolio/PortfolioOverviewSkeleton.tsx new file mode 100644 index 0000000000..f67397f584 --- /dev/null +++ b/components/portfolio/PortfolioOverviewSkeleton.tsx @@ -0,0 +1,69 @@ +import { AppLink } from 'components/Links' +import { Skeleton } from 'components/Skeleton' +import { Tag } from 'components/Tag' +import { WithArrow } from 'components/WithArrow' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { Flex } from 'theme-ui' + +import { PortfolioOverviewItem } from './PortfolioOverviewItem' + +export const PortfolioOverviewSkeleton = () => { + const { t: tPortfolio } = useTranslation('portfolio') + return ( + + + } + subValue={ + + {tPortfolio('view-assets')} + + } + firstInColumn + /> + + + + } + subValue={} + /> + } + subValue={} + /> + + {tPortfolio('coming-soon')} + + } + /> + + + ) +} diff --git a/components/portfolio/helpers/getPortfolioAccentColor.ts b/components/portfolio/helpers/getPortfolioAccentColor.ts new file mode 100644 index 0000000000..717cb4c915 --- /dev/null +++ b/components/portfolio/helpers/getPortfolioAccentColor.ts @@ -0,0 +1,5 @@ +import type { PositionDetail } from 'lambdas/src/portfolio-positions/types' + +export function getPortfolioAccentColor(accent: PositionDetail['accent']): string { + return accent === 'positive' ? 'success100' : 'error100' +} diff --git a/components/portfolio/helpers/getPortfolioChangeColor.ts b/components/portfolio/helpers/getPortfolioChangeColor.ts new file mode 100644 index 0000000000..5d94c2cd2f --- /dev/null +++ b/components/portfolio/helpers/getPortfolioChangeColor.ts @@ -0,0 +1,6 @@ +export function getPortfolioChangeColor(change?: number): string { + if (change === undefined) { + return 'neutral80' + } + return change > 0 ? 'success100' : change < 0 ? 'critical100' : 'neutral80' +} diff --git a/components/portfolio/helpers/getPortfolioChangeSign.ts b/components/portfolio/helpers/getPortfolioChangeSign.ts new file mode 100644 index 0000000000..1ffba69b69 --- /dev/null +++ b/components/portfolio/helpers/getPortfolioChangeSign.ts @@ -0,0 +1,3 @@ +export function getPortfolioChangeSign(change: number): string { + return change > 0 ? '+' : '' +} diff --git a/components/portfolio/helpers/getPortfolioTokenProducts.ts b/components/portfolio/helpers/getPortfolioTokenProducts.ts new file mode 100644 index 0000000000..122b572ff8 --- /dev/null +++ b/components/portfolio/helpers/getPortfolioTokenProducts.ts @@ -0,0 +1,35 @@ +import type { NetworkNames } from 'blockchain/networks' +import { ProductType } from 'features/aave/types' +import type { ProductHubItem } from 'features/productHub/types' +import { uniq, upperFirst } from 'lodash' + +interface GetPortfolioTokenProductsParams { + network: NetworkNames + table: ProductHubItem[] + token: string +} + +const sortingOrder = [ProductType.Earn, ProductType.Borrow, ProductType.Multiply] + +export function getPortfolioTokenProducts({ + network, + table, + token, +}: GetPortfolioTokenProductsParams) { + const resolvedToken = token === 'WETH' ? 'ETH' : token + + return uniq( + table.reduce( + (result, { network: productNetwork, primaryToken, product, secondaryToken }) => [ + ...result, + ...([primaryToken, secondaryToken].includes(resolvedToken.toUpperCase()) && + network === productNetwork + ? [...product] + : []), + ], + [], + ), + ) + .map((product) => upperFirst(product) as ProductType) + .sort((a, b) => sortingOrder.indexOf(a) - sortingOrder.indexOf(b)) +} diff --git a/components/portfolio/helpers/index.ts b/components/portfolio/helpers/index.ts new file mode 100644 index 0000000000..0aa26b20fc --- /dev/null +++ b/components/portfolio/helpers/index.ts @@ -0,0 +1,3 @@ +export * from './getPortfolioChangeColor' +export * from './getPortfolioChangeSign' +export * from './getPortfolioTokenProducts' diff --git a/components/portfolio/positions/PortfolioPositionAutomationIcons.tsx b/components/portfolio/positions/PortfolioPositionAutomationIcons.tsx new file mode 100644 index 0000000000..f00fd5d7a0 --- /dev/null +++ b/components/portfolio/positions/PortfolioPositionAutomationIcons.tsx @@ -0,0 +1,27 @@ +import { AutomationIcon } from 'components/AutomationIcon' +import React from 'react' + +import type { PortfolioPosition } from 'lambdas/src/portfolio-positions/types' + +export const PortfolioPositionAutomationIcons = ({ + automations = {}, +}: { + automations: PortfolioPosition['automations'] +}) => { + return ( + <> + {automations.stopLoss && ( + + )} + {automations.autoBuy && ( + + )} + {automations.autoSell && ( + + )} + {automations.takeProfit && ( + + )} + + ) +} diff --git a/components/portfolio/positions/PortfolioPositionBlock.tsx b/components/portfolio/positions/PortfolioPositionBlock.tsx new file mode 100644 index 0000000000..2a233aa6a0 --- /dev/null +++ b/components/portfolio/positions/PortfolioPositionBlock.tsx @@ -0,0 +1,106 @@ +import { AssetsTableDataCellAsset } from 'components/assetsTable/cellComponents/AssetsTableDataCellAsset' +import { AppLink } from 'components/Links' +import { PortfolioPositionAutomationIcons } from 'components/portfolio/positions/PortfolioPositionAutomationIcons' +import { PortfolioPositionBlockDetail } from 'components/portfolio/positions/PortfolioPositionBlockDetail' +import { ProtocolLabel } from 'components/ProtocolLabel' +import { WithArrow } from 'components/WithArrow' +import dayjs from 'dayjs' +import { ProductType } from 'features/aave/types' +import { LendingProtocolLabel } from 'lendingProtocols' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { Box, Flex, Text } from 'theme-ui' + +import type { PortfolioPosition } from 'lambdas/src/portfolio-positions/types' + +export const PortfolioPositionBlock = ({ position }: { position: PortfolioPosition }) => { + const { t: tPortfolio } = useTranslation('portfolio') + return ( + + + + {position.availableToMigrate ? tPortfolio('migrate') : position.type} + + + + + + + + {position.details.map((detail) => ( + + ))} + + {!position.availableToMigrate && ( + + {position.type && [ProductType.Borrow, ProductType.Multiply].includes(position.type) && ( + + + {tPortfolio('automations')} + + + + + + )} + {position.type && [ProductType.Earn].includes(position.type) && ( + + + {tPortfolio('days-of-earning', { + days: dayjs().diff(dayjs.unix(position.openDate), 'day'), + })} + + + )} + + + {tPortfolio('view-position')} + + + + )} + + ) +} diff --git a/components/portfolio/positions/PortfolioPositionBlockDetail.tsx b/components/portfolio/positions/PortfolioPositionBlockDetail.tsx new file mode 100644 index 0000000000..44d9c98c46 --- /dev/null +++ b/components/portfolio/positions/PortfolioPositionBlockDetail.tsx @@ -0,0 +1,65 @@ +import { Icon } from 'components/Icon' +import { getPortfolioAccentColor } from 'components/portfolio/helpers/getPortfolioAccentColor' +import { StatefulTooltip } from 'components/Tooltip' +import type { TranslateStringType } from 'helpers/translateStringType' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { question_o } from 'theme/icons' +import { Box, Flex, Text } from 'theme-ui' + +import type { DetailsType, PositionDetail } from 'lambdas/src/portfolio-positions/types' + +export const PortfolioPositionBlockDetail = ({ detail }: { detail: PositionDetail }) => { + const { t: tPortfolio } = useTranslation('portfolio') + const detailsTooltipsMap: Partial> = { + netValue: tPortfolio('details-tooltips.netValue'), + netValueEarnActivePassive: tPortfolio('details-tooltips.netValueEarnActivePassive'), + liquidationPrice: tPortfolio('details-tooltips.liquidationPrice'), + ltv: tPortfolio('details-tooltips.ltv'), + multiple: tPortfolio('details-tooltips.multiple'), + borrowRate: tPortfolio('details-tooltips.borrowRate'), + lendingRange: tPortfolio('details-tooltips.lendingRange'), + apy: tPortfolio('details-tooltips.apy'), + '90dApy': tPortfolio('details-tooltips.90dApy'), + suppliedTokenBalance: tPortfolio('details-tooltips.suppliedTokenBalance'), + borrowedTokenBalance: tPortfolio('details-tooltips.borrowedTokenBalance'), + } + return ( + + + + {tPortfolio(`position-details.${detail.type}`)} + {detailsTooltipsMap[detail.type] && ( + + + + )} + + + + {detail.value} + + {detail.subvalue && ( + + {detail.subvalue} + + )} + + ) +} diff --git a/components/portfolio/positions/PortfolioPositionBlockSkeleton.tsx b/components/portfolio/positions/PortfolioPositionBlockSkeleton.tsx new file mode 100644 index 0000000000..ed36e27dfc --- /dev/null +++ b/components/portfolio/positions/PortfolioPositionBlockSkeleton.tsx @@ -0,0 +1,76 @@ +import { Skeleton } from 'components/Skeleton' +import React from 'react' +import { Box, Flex } from 'theme-ui' + +export const PortfolioPositionBlockSkeleton = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) diff --git a/components/portfolio/positions/PortfolioPositionsProductSelect.tsx b/components/portfolio/positions/PortfolioPositionsProductSelect.tsx new file mode 100644 index 0000000000..62de45ab6a --- /dev/null +++ b/components/portfolio/positions/PortfolioPositionsProductSelect.tsx @@ -0,0 +1,44 @@ +import { GenericMultiselect } from 'components/GenericMultiselect' +import { type GenericSelectOption } from 'components/GenericSelect' +import { PortfolioProductType } from 'components/portfolio/positions/types' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { portfolio_product_dropdown_icon } from 'theme/icons' +import { Box } from 'theme-ui' + +export const PortfolioPositionsProductSelect = ({ + onChange, +}: { + onChange: (value: string[]) => void +}) => { + const { t: tPortfolio } = useTranslation('portfolio') + + const productOptionsList: GenericSelectOption[] = [ + { + label: tPortfolio('borrow'), + value: PortfolioProductType.borrow, + }, + { + label: tPortfolio('multiply'), + value: PortfolioProductType.multiply, + }, + { + label: tPortfolio('earn'), + value: PortfolioProductType.earn, + }, + { + label: tPortfolio('migrate'), + value: PortfolioProductType.migrate, + }, + ] + return ( + + + + ) +} diff --git a/components/portfolio/positions/PortfolioPositionsSortingSelect.tsx b/components/portfolio/positions/PortfolioPositionsSortingSelect.tsx new file mode 100644 index 0000000000..0c46d96765 --- /dev/null +++ b/components/portfolio/positions/PortfolioPositionsSortingSelect.tsx @@ -0,0 +1,47 @@ +import { GenericSelect, type GenericSelectOption } from 'components/GenericSelect' +import { Icon } from 'components/Icon' +import { PortfolioSortingType } from 'components/portfolio/positions/types' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { arrow_down, arrow_up_thin, portfolio_sort_dropdown_icon } from 'theme/icons' +import { Box, Text } from 'theme-ui' + +export const PortfolioPositionsSortingSelect = ({ + onChange, +}: { + onChange: (value: GenericSelectOption) => void +}) => { + const { t: tPortfolio } = useTranslation('portfolio') + + const sortingOptionsList: GenericSelectOption[] = [ + { + label: tPortfolio('net-value'), + value: PortfolioSortingType.netValueDescending, + icon: arrow_down, + }, + { + label: tPortfolio('net-value'), + value: PortfolioSortingType.netValueAscending, + icon: arrow_up_thin, + }, + ] + return ( + + + Sort by + + } + options={sortingOptionsList} + onChange={onChange} + /> + ) +} diff --git a/components/portfolio/positions/PortfolioPositionsView.tsx b/components/portfolio/positions/PortfolioPositionsView.tsx new file mode 100644 index 0000000000..056c969f98 --- /dev/null +++ b/components/portfolio/positions/PortfolioPositionsView.tsx @@ -0,0 +1,186 @@ +import type { GenericSelectOption } from 'components/GenericSelect' +import { Icon } from 'components/Icon' +import { PortfolioPositionBlock } from 'components/portfolio/positions/PortfolioPositionBlock' +import { PortfolioPositionBlockSkeleton } from 'components/portfolio/positions/PortfolioPositionBlockSkeleton' +import { PortfolioPositionsProductSelect } from 'components/portfolio/positions/PortfolioPositionsProductSelect' +import { PortfolioPositionsSortingSelect } from 'components/portfolio/positions/PortfolioPositionsSortingSelect' +import { PortfolioProductType, PortfolioSortingType } from 'components/portfolio/positions/types' +import { Toggle } from 'components/Toggle' +import { StatefulTooltip } from 'components/Tooltip' +import React, { useEffect, useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { question_o } from 'theme/icons' +import { Box, Flex, Grid, Text } from 'theme-ui' + +import type { PortfolioPositionsResponse } from 'lambdas/src/portfolio-positions/types' + +type PortfolioPositionsViewFiltersType = { + showEmptyPositions: boolean + product?: PortfolioProductType[] + sorting?: PortfolioSortingType +} + +export const PortfolioPositionsView = ({ + address, + fetchData, +}: { + address: string + fetchData: (address: string) => Promise +}) => { + const { t: tPortfolio } = useTranslation('portfolio') + // fetch data + const [portfolioPositionsData, setPortfolioPositionsData] = useState() + useEffect(() => { + void fetchData(address).then((data) => { + setPortfolioPositionsData(data) + }) + }, [address, fetchData]) + + const [filterState, setFilterState] = useState({ + showEmptyPositions: false, + }) + + const updatePortfolioPositionsFilters = + (changeType: keyof PortfolioPositionsViewFiltersType) => + (value: GenericSelectOption | boolean | string[]) => { + setFilterState((prevState) => ({ + ...prevState, + // value is either a GenericSelectOption (with value.value), an array (of products) or a boolean (show empty) + [changeType]: Array.isArray(value) || typeof value === 'boolean' ? value : value.value, + })) + } + + const filteredAndSortedPositions = useMemo(() => { + if (!portfolioPositionsData?.positions) return [] + // empty positions first + const filteredEmptyPositions = portfolioPositionsData.positions.filter( + ({ tokens }) => filterState['showEmptyPositions'] || tokens.supply.amountUSD > 0, + ) + // filter by product + const noneSelected = [0, undefined].includes(filterState['product']?.length) // none selected = "All products" + const allSelected = + filterState['product']?.length === Object.values(PortfolioProductType).length // all selected manually + const includeMigrated = filterState['product']?.includes(PortfolioProductType.migrate) // include migrated positions + const filteredProductPositions = filteredEmptyPositions.filter((position) => { + if (noneSelected || allSelected) { + return true + } + return ( + filterState['product']?.includes( + // filter by product type + position.type?.toLocaleLowerCase() as PortfolioProductType, + ) || + (includeMigrated && position.availableToMigrate) // special case for migration positions + ) + }) + + const sortedPositions = filteredProductPositions + .sort((a, b) => { + if (filterState['sorting'] === PortfolioSortingType.netValueAscending) { + return a.tokens.supply.amountUSD - b.tokens.supply.amountUSD + } + return b.tokens.supply.amountUSD - a.tokens.supply.amountUSD + }) + .sort((a, b) => { + // move migration positions to the bottom + if (a.availableToMigrate) return 1 + if (b.availableToMigrate) return -1 + return 0 + }) + + return sortedPositions + }, [filterState, portfolioPositionsData]) + + return ( + + + + + + + + + + {tPortfolio('show-empty-positions.label')} + + {tPortfolio('show-empty-positions.tooltip')} + } + containerSx={{ mr: 2, ml: '-10px' }} + tooltipSx={{ + ml: '-75px', + width: '300px', + borderRadius: 'medium', + }} + > + + + + + + + {filteredAndSortedPositions + ? filteredAndSortedPositions.map((position) => ( + + )) + : Array.from({ length: 3 }).map((_, index) => ( + + ))} + + + + Summer.fi Activity + + News & Updates + + + + ) +} diff --git a/components/portfolio/positions/types.ts b/components/portfolio/positions/types.ts new file mode 100644 index 0000000000..b07ff72376 --- /dev/null +++ b/components/portfolio/positions/types.ts @@ -0,0 +1,11 @@ +export enum PortfolioProductType { + borrow = 'borrow', + multiply = 'multiply', + earn = 'earn', + migrate = 'migrate', +} + +export enum PortfolioSortingType { + netValueAscending = 'net-value-ascending', + netValueDescending = 'net-value-descending', +} diff --git a/components/portfolio/wallet/PortfolioWalletAssets.tsx b/components/portfolio/wallet/PortfolioWalletAssets.tsx new file mode 100644 index 0000000000..f56f3d285e --- /dev/null +++ b/components/portfolio/wallet/PortfolioWalletAssets.tsx @@ -0,0 +1,115 @@ +import BigNumber from 'bignumber.js' +import { networksByName } from 'blockchain/networks' +import { AssetsTableDataCellAsset } from 'components/assetsTable/cellComponents/AssetsTableDataCellAsset' +import { usePreloadAppDataContext } from 'components/context/PreloadAppDataContextProvider' +import { AppLink } from 'components/Links' +import { getPortfolioChangeColor, getPortfolioTokenProducts } from 'components/portfolio/helpers' +import { getTokenGroup } from 'handlers/product-hub/helpers' +import { formatCryptoBalance } from 'helpers/formatters/format' +import { upperFirst } from 'lodash' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { Box, Button, Flex, Text } from 'theme-ui' + +import type { PortfolioAsset } from 'lambdas/src/portfolio-assets/types' + +interface PortfolioWalletAssetsProps { + assets?: PortfolioAsset[] +} + +export const PortfolioWalletAssets = ({ assets = [] }: PortfolioWalletAssetsProps) => { + const { t: tPortfolio } = useTranslation('portfolio') + + const { + productHub: { table }, + } = usePreloadAppDataContext() + + return ( + + + + {tPortfolio('token')} + + + {tPortfolio('price-24')} + + + {tPortfolio('balance')} + + + + {assets.map(({ balance, balanceUSD, network, price24hChange, priceUSD, symbol }) => { + const products = getPortfolioTokenProducts({ network, table, token: symbol }) + + return ( + + + + + {upperFirst(network)} + + } + /> + + + + ${formatCryptoBalance(new BigNumber(priceUSD))} + + + {price24hChange?.toFixed(2) ?? '-'}% + + + + + {formatCryptoBalance(new BigNumber(balance))} {symbol} + + + ${formatCryptoBalance(new BigNumber(balanceUSD))} + + + + {products.length > 0 && ( + + {products.map((product) => ( + + + + + + ))} + + )} + + ) + })} + + + ) +} diff --git a/components/portfolio/wallet/PortfolioWalletSummary.tsx b/components/portfolio/wallet/PortfolioWalletSummary.tsx new file mode 100644 index 0000000000..918e01bf18 --- /dev/null +++ b/components/portfolio/wallet/PortfolioWalletSummary.tsx @@ -0,0 +1,68 @@ +import BigNumber from 'bignumber.js' +import { getPortfolioChangeColor, getPortfolioChangeSign } from 'components/portfolio/helpers' +import { PortfolioWalletTopAssets } from 'components/portfolio/wallet/PortfolioWalletTopAssets' +import { Skeleton } from 'components/Skeleton' +import { formatAmount } from 'helpers/formatters/format' +import React, { useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { Box, Text } from 'theme-ui' + +import type { PortfolioAsset } from 'lambdas/src/portfolio-assets/types' + +interface PortfolioWalletSummaryProps { + assets?: PortfolioAsset[] +} + +export const PortfolioWalletSummary = ({ assets }: PortfolioWalletSummaryProps) => { + const { t: tPortfolio } = useTranslation('portfolio') + + const topAssets = useMemo(() => (assets ? assets.slice(0, 3) : undefined), [assets]) + const totalAssets = useMemo( + () => (assets ? assets.reduce((acc, token) => acc + token.balanceUSD, 0) : undefined), + [assets], + ) + const totalAssetsChange = useMemo( + () => + assets + ? assets.length + ? assets + .filter((token) => token.price24hChange != null) + .reduce((acc, token) => acc + (token.price24hChange ?? 0), 0) / assets.length + : 0 + : undefined, + [assets], + ) + + return ( + + + {tPortfolio('total-assets')} + + {totalAssets !== undefined ? ( + + ${formatAmount(new BigNumber(totalAssets), 'USD')} + + ) : ( + + )} + {totalAssetsChange !== undefined ? ( + + {getPortfolioChangeSign(totalAssetsChange)} + {tPortfolio('past-week', { percentage: totalAssetsChange.toFixed(2) })} + + ) : ( + + )} + + {tPortfolio(topAssets === undefined || topAssets?.length > 0 ? 'top-assets' : 'no-assets', { + amount: (topAssets?.length ?? 0) > 1 ? topAssets?.length : '', + })} + + + + ) +} diff --git a/components/portfolio/wallet/PortfolioWalletTopAssets.tsx b/components/portfolio/wallet/PortfolioWalletTopAssets.tsx new file mode 100644 index 0000000000..f89454c036 --- /dev/null +++ b/components/portfolio/wallet/PortfolioWalletTopAssets.tsx @@ -0,0 +1,68 @@ +import BigNumber from 'bignumber.js' +import { Skeleton } from 'components/Skeleton' +import { TokensGroup } from 'components/TokensGroup' +import { formatFiatBalance } from 'helpers/formatters/format' +import React from 'react' +import { Flex, Grid, Text } from 'theme-ui' + +import type { PortfolioAsset } from 'lambdas/src/portfolio-assets/types' + +interface PortfolioWalletTopAssetsProps { + assets?: PortfolioAsset[] +} + +export const PortfolioWalletTopAssets = ({ assets }: PortfolioWalletTopAssetsProps) => { + return ( + <> + {assets ? ( + + {assets.map(({ balanceUSD, network, symbol }) => ( + + + + + {symbol} + + + ${formatFiatBalance(new BigNumber(balanceUSD))} + + + + ))} + + ) : ( + + + + + + )} + + ) +} diff --git a/components/portfolio/wallet/PortfolioWalletView.tsx b/components/portfolio/wallet/PortfolioWalletView.tsx new file mode 100644 index 0000000000..2a7c5f148a --- /dev/null +++ b/components/portfolio/wallet/PortfolioWalletView.tsx @@ -0,0 +1,68 @@ +import type { NetworkNames } from 'blockchain/networks' +import { GenericMultiselect } from 'components/GenericMultiselect' +import { PortfolioWalletAssets } from 'components/portfolio/wallet/PortfolioWalletAssets' +import { PortfolioWalletSummary } from 'components/portfolio/wallet/PortfolioWalletSummary' +import { productHubNetworkFilter } from 'features/productHub/meta' +import React, { useEffect, useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { Box, Flex, Grid, Heading } from 'theme-ui' + +import type { PortfolioAssetsResponse } from 'lambdas/src/portfolio-assets/types' + +export const PortfolioWalletView = ({ + address, + fetchData, +}: { + address: string + fetchData: (address: string) => Promise +}) => { + const { t: tPortfolio } = useTranslation('portfolio') + const [portfolioWalletData, setPortfolioWalletData] = useState() + + useEffect(() => { + void fetchData(address).then((data) => { + setPortfolioWalletData(data) + }) + }, [address, fetchData]) + + const [selectedNetwork, setSelectedNetwork] = useState([]) + const filteredAssets = useMemo( + () => + portfolioWalletData?.assets + ? portfolioWalletData.assets.filter( + ({ network }) => selectedNetwork.includes(network) || selectedNetwork.length === 0, + ) + : undefined, + [portfolioWalletData?.assets, selectedNetwork], + ) + + return ( + + + + + {tPortfolio('summary')} + + { + setSelectedNetwork(value as NetworkNames[]) + }} + /> + + + {(filteredAssets?.length ?? 0) > 0 && ( + <> + + {tPortfolio('assets')} + + + + )} + + + + ) +} diff --git a/components/productCards/ProductCardsWrapper.tsx b/components/productCards/ProductCardsWrapper.tsx index 7bad441af9..4f146f9df6 100644 --- a/components/productCards/ProductCardsWrapper.tsx +++ b/components/productCards/ProductCardsWrapper.tsx @@ -2,9 +2,9 @@ import { AppSpinner } from 'helpers/AppSpinner' import type { ReactNode } from 'react' import React from 'react' import { theme } from 'theme' +import { fadeInAnimationDelay, slideInAnimation } from 'theme/animations' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Flex, Grid } from 'theme-ui' -import { fadeInAnimationDelay, slideInAnimation } from 'theme/animations' interface ProductCardWrapperProps { children: Array diff --git a/components/sidebar/SidebarSection.tsx b/components/sidebar/SidebarSection.tsx index c1e1c034b2..cd8aa0c672 100644 --- a/components/sidebar/SidebarSection.tsx +++ b/components/sidebar/SidebarSection.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import { MobileSidePanel } from 'components/Modal' import React, { useState } from 'react' -import { Card } from 'theme-ui' import { edit } from 'theme/icons' +import { Card } from 'theme-ui' import type { SidebarSectionContentProps } from './SidebarSectionContent' import { SidebarSectionContent } from './SidebarSectionContent' diff --git a/components/sidebar/SidebarSectionStatus.tsx b/components/sidebar/SidebarSectionStatus.tsx index 0dbd44c8c5..404ceecaad 100644 --- a/components/sidebar/SidebarSectionStatus.tsx +++ b/components/sidebar/SidebarSectionStatus.tsx @@ -4,8 +4,8 @@ import type { TranslateStringType } from 'helpers/translateStringType' import { useTranslation } from 'next-i18next' import type { ReactNode } from 'react' import React from 'react' -import { Box, Card, Flex, Link, Spinner, Text } from 'theme-ui' import { checkmark, clock } from 'theme/icons' +import { Box, Card, Flex, Link, Spinner, Text } from 'theme-ui' type SidebarSectionStatusTypes = 'progress' | 'success' | 'waiting' diff --git a/components/vault/MultipleRangeSlider.tsx b/components/vault/MultipleRangeSlider.tsx index f4bd4ad563..f1ae21bf0a 100644 --- a/components/vault/MultipleRangeSlider.tsx +++ b/components/vault/MultipleRangeSlider.tsx @@ -2,9 +2,9 @@ import { throttle } from 'lodash' import type { ChangeEvent, MouseEvent, ReactNode, RefObject } from 'react' import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import type { OasisTheme } from 'theme' -import { Box, Flex, Grid, Slider, Text } from 'theme-ui' import { useBreakpointIndex } from 'theme/useBreakpointIndex' import { useTheme } from 'theme/useThemeUI' +import { Box, Flex, Grid, Slider, Text } from 'theme-ui' function getSliderBoxBoundaries(boxRef: RefObject) { const box = boxRef.current?.getBoundingClientRect() diff --git a/components/vault/OptimizationControl.tsx b/components/vault/OptimizationControl.tsx index 83da227dc7..86df9a02a3 100644 --- a/components/vault/OptimizationControl.tsx +++ b/components/vault/OptimizationControl.tsx @@ -19,8 +19,8 @@ import { useObservable } from 'helpers/observableHook' import { useUIChanges } from 'helpers/uiChangesHook' import { useTranslation } from 'next-i18next' import React from 'react' -import { Container } from 'theme-ui' import { warning } from 'theme/icons' +import { Container } from 'theme-ui' import { DefaultVaultLayout } from './DefaultVaultLayout' diff --git a/components/vault/ProtectionControl.tsx b/components/vault/ProtectionControl.tsx index 828f229a84..f0cc70331a 100644 --- a/components/vault/ProtectionControl.tsx +++ b/components/vault/ProtectionControl.tsx @@ -15,8 +15,8 @@ import { useObservable } from 'helpers/observableHook' import { useUIChanges } from 'helpers/uiChangesHook' import { useTranslation } from 'next-i18next' import React from 'react' -import { Container } from 'theme-ui' import { warning } from 'theme/icons' +import { Container } from 'theme-ui' import { DefaultVaultLayout } from './DefaultVaultLayout' diff --git a/components/vault/TxStatusCard.tsx b/components/vault/TxStatusCard.tsx index b16a2c3212..5714ded2ac 100644 --- a/components/vault/TxStatusCard.tsx +++ b/components/vault/TxStatusCard.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import { useTranslation } from 'next-i18next' import React from 'react' -import { Card, Flex, Grid, Link, Spinner, Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Card, Flex, Grid, Link, Spinner, Text } from 'theme-ui' export interface TxStatusCardProgressProps { text: string diff --git a/components/vault/VaultActionInput.tsx b/components/vault/VaultActionInput.tsx index 7ac9dcf5e2..498da88449 100644 --- a/components/vault/VaultActionInput.tsx +++ b/components/vault/VaultActionInput.tsx @@ -9,8 +9,8 @@ import { one, zero } from 'helpers/zero' import type { ChangeEvent } from 'react' import React, { useState } from 'react' import { createNumberMask } from 'text-mask-addons' -import { Box, Grid, Text } from 'theme-ui' import { exchange, minus, plus } from 'theme/icons' +import { Box, Grid, Text } from 'theme-ui' export type VaultAction = | 'Borrow' diff --git a/components/vault/VaultDetails.tsx b/components/vault/VaultDetails.tsx index 9f2616c2b4..70f57ed332 100644 --- a/components/vault/VaultDetails.tsx +++ b/components/vault/VaultDetails.tsx @@ -6,9 +6,9 @@ import type { CommonVaultState } from 'helpers/types/CommonVaultState.types' import { zero } from 'helpers/zero' import type { PropsWithChildren, ReactNode } from 'react' import React from 'react' +import { question_o } from 'theme/icons' import type { SxProp } from 'theme-ui' import { Box, Card, Flex, Grid, Heading, Text } from 'theme-ui' -import { question_o } from 'theme/icons' export type CollRatioColor = 'primary100' | 'critical100' | 'warning100' | 'success100' diff --git a/components/vault/VaultHeader.tsx b/components/vault/VaultHeader.tsx index def3b268ac..2cd3a71277 100644 --- a/components/vault/VaultHeader.tsx +++ b/components/vault/VaultHeader.tsx @@ -7,8 +7,8 @@ import { isTouchDevice } from 'helpers/isTouchDevice' import { useTranslation } from 'next-i18next' import type { ReactNode } from 'react' import React from 'react' -import type { ThemeUIStyleObject } from 'theme-ui' import { tooltip } from 'theme/icons' +import type { ThemeUIStyleObject } from 'theme-ui' import { VaultHeaderContainer } from './VaultHeaderContainer' diff --git a/components/vault/VaultHeading.tsx b/components/vault/VaultHeading.tsx index eafa3714cd..968fa00d98 100644 --- a/components/vault/VaultHeading.tsx +++ b/components/vault/VaultHeading.tsx @@ -3,8 +3,8 @@ import { BigNumber } from 'bignumber.js' import { useAccountContext } from 'components/context/AccountContextProvider' import { useProductContext } from 'components/context/ProductContextProvider' import { useObservable } from 'helpers/observableHook' -import { useTranslation } from 'next-i18next' import { useRouter } from 'next/router' +import { useTranslation } from 'next-i18next' import React from 'react' interface VaultHeadingManageProps { diff --git a/components/vault/sidebar/SidebarResetButton.tsx b/components/vault/sidebar/SidebarResetButton.tsx index 605b58dcee..2d73e3adc4 100644 --- a/components/vault/sidebar/SidebarResetButton.tsx +++ b/components/vault/sidebar/SidebarResetButton.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Button } from 'theme-ui' import { refresh } from 'theme/icons' +import { Box, Button } from 'theme-ui' interface SidebarResetButtonProps { clear: () => void diff --git a/components/vault/sidebar/SidebarSliders.tsx b/components/vault/sidebar/SidebarSliders.tsx index 3e4c482da2..2f10b930c2 100644 --- a/components/vault/sidebar/SidebarSliders.tsx +++ b/components/vault/sidebar/SidebarSliders.tsx @@ -10,8 +10,8 @@ import { zero } from 'helpers/zero' import { useTranslation } from 'next-i18next' import type { ChangeEvent } from 'react' import React from 'react' -import { Box, Flex, Grid, Slider, Text, useThemeUI } from 'theme-ui' import { arrow_right } from 'theme/icons' +import { Box, Flex, Grid, Slider, Text, useThemeUI } from 'theme-ui' type VaultState = OpenMultiplyVaultState | ManageMultiplyVaultState diff --git a/components/vault/sidebar/SidebarVaultProxyStage.tsx b/components/vault/sidebar/SidebarVaultProxyStage.tsx index 4bdee1be0f..07e5490bfb 100644 --- a/components/vault/sidebar/SidebarVaultProxyStage.tsx +++ b/components/vault/sidebar/SidebarVaultProxyStage.tsx @@ -12,8 +12,8 @@ import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import type { HasGasEstimation } from 'helpers/types/HasGasEstimation.types' import { Trans, useTranslation } from 'next-i18next' import React from 'react' -import { Image, Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Image, Text } from 'theme-ui' interface SidebarOpenVaultProxyStageProps { stage: SidebarVaultStages diff --git a/components/vault/sidebar/SidebarVaultStopLossStage.tsx b/components/vault/sidebar/SidebarVaultStopLossStage.tsx index fd48299bd0..bcc88defe4 100644 --- a/components/vault/sidebar/SidebarVaultStopLossStage.tsx +++ b/components/vault/sidebar/SidebarVaultStopLossStage.tsx @@ -3,8 +3,8 @@ import type { OpenVaultStage } from 'features/borrow/open/pipes/openVault.types' import type { OpenMultiplyVaultStage } from 'features/multiply/open/pipes/openMultiplyVault.types' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import React from 'react' -import { Flex, Image } from 'theme-ui' import { AddingStopLossAnimation } from 'theme/animations' +import { Flex, Image } from 'theme-ui' export function SidebarVaultStopLossStage(props: { stage: OpenVaultStage | OpenMultiplyVaultStage diff --git a/features/aave/components/order-information/OrderInformationTooltipAction.tsx b/features/aave/components/order-information/OrderInformationTooltipAction.tsx index 1ea7891a92..5286641a5e 100644 --- a/features/aave/components/order-information/OrderInformationTooltipAction.tsx +++ b/features/aave/components/order-information/OrderInformationTooltipAction.tsx @@ -2,8 +2,8 @@ import { Icon } from 'components/Icon' import { useOutsideElementClickHandler } from 'helpers/useOutsideElementClickHandler' import type { PropsWithChildren } from 'react' import React, { useState } from 'react' -import { Box, Flex } from 'theme-ui' import { question_o } from 'theme/icons' +import { Box, Flex } from 'theme-ui' export function OrderInformationTooltipAction({ children }: PropsWithChildren<{}>) { const [isOpen, setIsOpen] = useState(false) diff --git a/features/aave/manage/sidebars/SidebarManageAaveVault.tsx b/features/aave/manage/sidebars/SidebarManageAaveVault.tsx index eab5a3158a..0c306a507f 100644 --- a/features/aave/manage/sidebars/SidebarManageAaveVault.tsx +++ b/features/aave/manage/sidebars/SidebarManageAaveVault.tsx @@ -30,9 +30,9 @@ import { zero } from 'helpers/zero' import { LendingProtocol } from 'lendingProtocols' import { useTranslation } from 'next-i18next' import React, { useEffect } from 'react' -import { Box, Flex, Grid, Image, Text } from 'theme-ui' import { OpenVaultAnimation } from 'theme/animations' import { circle_close, circle_slider } from 'theme/icons' +import { Box, Flex, Grid, Image, Text } from 'theme-ui' import { match } from 'ts-pattern' import type { Sender } from 'xstate' diff --git a/features/aave/open/sidebars/SidebarOpenAaveVault.tsx b/features/aave/open/sidebars/SidebarOpenAaveVault.tsx index 2a84fca994..25e99462ed 100644 --- a/features/aave/open/sidebars/SidebarOpenAaveVault.tsx +++ b/features/aave/open/sidebars/SidebarOpenAaveVault.tsx @@ -25,8 +25,8 @@ import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { zero } from 'helpers/zero' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Flex, Grid, Image } from 'theme-ui' import { AddingStopLossAnimation, OpenVaultAnimation } from 'theme/animations' +import { Box, Flex, Grid, Image } from 'theme-ui' import type { Sender, StateFrom } from 'xstate' import { SidebarOpenAaveVaultEditingState } from './SidebarOpenAaveVaultEditingState' diff --git a/features/ajna/common/layout.tsx b/features/ajna/common/layout.tsx index cffd8401da..5b375f3477 100644 --- a/features/ajna/common/layout.tsx +++ b/features/ajna/common/layout.tsx @@ -5,8 +5,8 @@ import { AjnaNavigationController } from 'features/navigation/controls/AjnaNavig import type { PropsWithChildren } from 'react' import React from 'react' import { ajnaExtensionTheme } from 'theme' -import { ThemeUIProvider } from 'theme-ui' import { BackgroundLight } from 'theme/BackgroundLight' +import { ThemeUIProvider } from 'theme-ui' export function AjnaLayout({ children }: PropsWithChildren<{}>) { return ( diff --git a/features/ajna/positions/borrow/components/ContentFooterItemsBorrow.tsx b/features/ajna/positions/borrow/components/ContentFooterItemsBorrow.tsx index ac9424d093..799152cc75 100644 --- a/features/ajna/positions/borrow/components/ContentFooterItemsBorrow.tsx +++ b/features/ajna/positions/borrow/components/ContentFooterItemsBorrow.tsx @@ -10,8 +10,8 @@ import { useAjnaRewards } from 'features/ajna/rewards/useAjnaRewards' import { formatCryptoBalance, formatDecimalAsPercent } from 'helpers/formatters/format' import { useTranslation } from 'next-i18next' import React from 'react' -import { Text } from 'theme-ui' import { ajnaSparks } from 'theme/icons' +import { Text } from 'theme-ui' interface ContentFooterItemsBorrowProps { isLoading?: boolean diff --git a/features/ajna/positions/borrow/sidebars/AjnaBorrowFormContentSwitch.tsx b/features/ajna/positions/borrow/sidebars/AjnaBorrowFormContentSwitch.tsx index 26440ffba0..ed4c7e9bb3 100644 --- a/features/ajna/positions/borrow/sidebars/AjnaBorrowFormContentSwitch.tsx +++ b/features/ajna/positions/borrow/sidebars/AjnaBorrowFormContentSwitch.tsx @@ -2,8 +2,8 @@ import { ListWithIcon } from 'components/ListWithIcon' import { useAjnaGeneralContext } from 'features/ajna/positions/common/contexts/AjnaGeneralContext' import React from 'react' import { useTranslation } from 'react-i18next' -import { Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Text } from 'theme-ui' export function AjnaBorrowFormContentSwitch() { const { t } = useTranslation() diff --git a/features/ajna/positions/borrow/sidebars/AjnaBorrowFormContentTransition.tsx b/features/ajna/positions/borrow/sidebars/AjnaBorrowFormContentTransition.tsx index eda4fa12c4..a67d389ecb 100644 --- a/features/ajna/positions/borrow/sidebars/AjnaBorrowFormContentTransition.tsx +++ b/features/ajna/positions/borrow/sidebars/AjnaBorrowFormContentTransition.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import React from 'react' import { useTranslation } from 'react-i18next' -import { Text } from 'theme-ui' import { multiply_transition } from 'theme/icons' +import { Text } from 'theme-ui' export function AjnaBorrowFormContentTransition() { const { t } = useTranslation() diff --git a/features/ajna/positions/common/components/AjnaAdjustSlider.tsx b/features/ajna/positions/common/components/AjnaAdjustSlider.tsx index 28ec0afca6..7c84dcff30 100644 --- a/features/ajna/positions/common/components/AjnaAdjustSlider.tsx +++ b/features/ajna/positions/common/components/AjnaAdjustSlider.tsx @@ -10,8 +10,8 @@ import { formatCryptoBalance, formatDecimalAsPercent } from 'helpers/formatters/ import { one } from 'helpers/zero' import { useTranslation } from 'next-i18next' import React, { useEffect, useState } from 'react' -import { Flex, Text } from 'theme-ui' import { arrow_right } from 'theme/icons' +import { Flex, Text } from 'theme-ui' const min = new BigNumber(0.01) const max = new BigNumber(1) diff --git a/features/ajna/positions/common/components/AjnaDupePositionModal.tsx b/features/ajna/positions/common/components/AjnaDupePositionModal.tsx index 2a58b757ee..c6540568b0 100644 --- a/features/ajna/positions/common/components/AjnaDupePositionModal.tsx +++ b/features/ajna/positions/common/components/AjnaDupePositionModal.tsx @@ -4,6 +4,7 @@ import { AppLink } from 'components/Links' import { Modal, ModalCloseIcon } from 'components/Modal' import type { AjnaProduct } from 'features/ajna/common/types' import { getOraclessProductUrl } from 'features/poolFinder/helpers' +import { getPortfolioLink } from 'helpers/get-portfolio-link' import { useModalContext } from 'helpers/modalHook' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { startCase } from 'lodash' @@ -50,7 +51,7 @@ export function AjnaDupePositionModal({ const amount = hasMultiplyPositions ? 'plural' : 'singular' const type = product === 'earn' ? 'lender' : 'borrower' const primaryLink = hasMultiplyPositions - ? `/owner/${walletAddress}` + ? getPortfolioLink(walletAddress) : `${getOraclessProductUrl({ chainId, collateralAddress, diff --git a/features/ajna/positions/common/components/contentCards/ContentCardNetBorrowCost.tsx b/features/ajna/positions/common/components/contentCards/ContentCardNetBorrowCost.tsx index 9740a1d3d3..67fb4ea907 100644 --- a/features/ajna/positions/common/components/contentCards/ContentCardNetBorrowCost.tsx +++ b/features/ajna/positions/common/components/contentCards/ContentCardNetBorrowCost.tsx @@ -10,8 +10,8 @@ import { useAjnaRewards } from 'features/ajna/rewards/useAjnaRewards' import { formatCryptoBalance, formatDecimalAsPercent } from 'helpers/formatters/format' import { useTranslation } from 'next-i18next' import React from 'react' -import { Text } from 'theme-ui' import { ajnaSparks } from 'theme/icons' +import { Text } from 'theme-ui' interface ContentCardNetBorrowCostProps { isLoading?: boolean diff --git a/features/ajna/positions/common/controls/AjnaProductController.tsx b/features/ajna/positions/common/controls/AjnaProductController.tsx index 93a9f2b645..eebf3f65e3 100644 --- a/features/ajna/positions/common/controls/AjnaProductController.tsx +++ b/features/ajna/positions/common/controls/AjnaProductController.tsx @@ -28,8 +28,8 @@ import { WithLoadingIndicator } from 'helpers/AppSpinner' import { WithErrorHandler } from 'helpers/errorHandlers/WithErrorHandler' import { one, zero } from 'helpers/zero' import { upperFirst } from 'lodash' -import { useTranslation } from 'next-i18next' import { useRouter } from 'next/router' +import { useTranslation } from 'next-i18next' import React from 'react' interface AjnaProductControllerProps { diff --git a/features/ajna/positions/common/sidebars/AjnaFormContentRisk.tsx b/features/ajna/positions/common/sidebars/AjnaFormContentRisk.tsx index e9596723dd..fa94afe6d6 100644 --- a/features/ajna/positions/common/sidebars/AjnaFormContentRisk.tsx +++ b/features/ajna/positions/common/sidebars/AjnaFormContentRisk.tsx @@ -7,8 +7,8 @@ import { EXTERNAL_LINKS } from 'helpers/applicationLinks' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Image, Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Box, Image, Text } from 'theme-ui' const LINKS_MAP: { [key in AjnaProduct]: string } = { borrow: EXTERNAL_LINKS.DOCS.AJNA.LIQUIDATIONS, diff --git a/features/ajna/positions/common/sidebars/AjnaFormContentTransaction.tsx b/features/ajna/positions/common/sidebars/AjnaFormContentTransaction.tsx index 8707b0cd8b..947447eff5 100644 --- a/features/ajna/positions/common/sidebars/AjnaFormContentTransaction.tsx +++ b/features/ajna/positions/common/sidebars/AjnaFormContentTransaction.tsx @@ -5,8 +5,8 @@ import { upperFirst } from 'lodash' import { useTranslation } from 'next-i18next' import type { FC } from 'react' import React from 'react' -import { Text } from 'theme-ui' import { OpenVaultAnimation } from 'theme/animations' +import { Text } from 'theme-ui' interface AjnaFormContentTransactionProps { orderInformation: FC diff --git a/features/ajna/positions/multiply/sidebars/AjnaMultiplyFormContentSwitch.tsx b/features/ajna/positions/multiply/sidebars/AjnaMultiplyFormContentSwitch.tsx index 4a44e889f2..290a7b9812 100644 --- a/features/ajna/positions/multiply/sidebars/AjnaMultiplyFormContentSwitch.tsx +++ b/features/ajna/positions/multiply/sidebars/AjnaMultiplyFormContentSwitch.tsx @@ -1,8 +1,8 @@ import { ListWithIcon } from 'components/ListWithIcon' import React from 'react' import { useTranslation } from 'react-i18next' -import { Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Text } from 'theme-ui' export function AjnaMultiplyFormContentSwitch() { const { t } = useTranslation() diff --git a/features/ajna/positions/multiply/sidebars/AjnaMultiplyFormContentTransition.tsx b/features/ajna/positions/multiply/sidebars/AjnaMultiplyFormContentTransition.tsx index e4662c7099..0cae342fe0 100644 --- a/features/ajna/positions/multiply/sidebars/AjnaMultiplyFormContentTransition.tsx +++ b/features/ajna/positions/multiply/sidebars/AjnaMultiplyFormContentTransition.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import React from 'react' import { useTranslation } from 'react-i18next' -import { Text } from 'theme-ui' import { borrow_transition } from 'theme/icons' +import { Text } from 'theme-ui' export function AjnaMultiplyFormContentTransition() { const { t } = useTranslation() diff --git a/features/automation/common/sidebars/SidebarAutomationFeatureCreationStage.tsx b/features/automation/common/sidebars/SidebarAutomationFeatureCreationStage.tsx index 3059b5e0b1..b59a940dd6 100644 --- a/features/automation/common/sidebars/SidebarAutomationFeatureCreationStage.tsx +++ b/features/automation/common/sidebars/SidebarAutomationFeatureCreationStage.tsx @@ -5,8 +5,8 @@ import { AutomationFeatures } from 'features/automation/common/types' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Flex, Image, Text } from 'theme-ui' import { AddingStopLossAnimation } from 'theme/animations' +import { Box, Flex, Image, Text } from 'theme-ui' import type { SidebarAutomationFeatureCreationStageProps } from './SidebarAutomationFeatureCreationStage.types' diff --git a/features/borrow/manage/containers/ManageVaultDetails.tsx b/features/borrow/manage/containers/ManageVaultDetails.tsx index 5731418df8..c942477d9f 100644 --- a/features/borrow/manage/containers/ManageVaultDetails.tsx +++ b/features/borrow/manage/containers/ManageVaultDetails.tsx @@ -28,8 +28,8 @@ import { useAppConfig } from 'helpers/config' import { formatAmount } from 'helpers/formatters/format' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Grid } from 'theme-ui' import { bell } from 'theme/icons' +import { Box, Grid } from 'theme-ui' export function ManageVaultDetailsSummary({ vault: { debt, token, freeCollateral, daiYieldFromLockedCollateral }, diff --git a/features/borrow/open/sidebars/SidebarOpenBorrowVaultOpenStage.tsx b/features/borrow/open/sidebars/SidebarOpenBorrowVaultOpenStage.tsx index fae597b938..18ab2458d8 100644 --- a/features/borrow/open/sidebars/SidebarOpenBorrowVaultOpenStage.tsx +++ b/features/borrow/open/sidebars/SidebarOpenBorrowVaultOpenStage.tsx @@ -4,8 +4,8 @@ import { OpenVaultChangesInformation } from 'features/borrow/open/containers/Ope import type { OpenVaultState } from 'features/borrow/open/pipes/openVault.types' import { useTranslation } from 'next-i18next' import React from 'react' -import { Text } from 'theme-ui' import { OpenVaultAnimation } from 'theme/animations' +import { Text } from 'theme-ui' export function SidebarOpenBorrowVaultOpenStage(props: OpenVaultState) { const { t } = useTranslation() diff --git a/features/discover/common/DiscoverNavigation.tsx b/features/discover/common/DiscoverNavigation.tsx index c58afcc602..5af13d4a89 100644 --- a/features/discover/common/DiscoverNavigation.tsx +++ b/features/discover/common/DiscoverNavigation.tsx @@ -10,8 +10,8 @@ import { useRedirect } from 'helpers/useRedirect' import { useTranslation } from 'next-i18next' import React, { useState } from 'react' import { theme } from 'theme' -import { Box, Flex, Text } from 'theme-ui' import { useOnMobile } from 'theme/useBreakpointIndex' +import { Box, Flex, Text } from 'theme-ui' interface DiscoverNavigationProps { kind: DiscoverPages diff --git a/features/dsr/containers/DsrEditing.tsx b/features/dsr/containers/DsrEditing.tsx index 1ca141f1e9..cd52293838 100644 --- a/features/dsr/containers/DsrEditing.tsx +++ b/features/dsr/containers/DsrEditing.tsx @@ -12,8 +12,8 @@ import { zero } from 'helpers/zero' import { useTranslation } from 'next-i18next' import type { ChangeEvent } from 'react' import React, { useMemo } from 'react' -import { Box, Flex, Image } from 'theme-ui' import { OpenVaultAnimation } from 'theme/animations' +import { Box, Flex, Image } from 'theme-ui' interface DsrEditingProps { activeTab: DsrSidebarTabOptions diff --git a/features/dsr/helpers/dsrHistory.ts b/features/dsr/helpers/dsrHistory.ts index 12bf8b51e6..80ad8165fc 100644 --- a/features/dsr/helpers/dsrHistory.ts +++ b/features/dsr/helpers/dsrHistory.ts @@ -8,8 +8,8 @@ import { gql, GraphQLClient } from 'graphql-request' import padStart from 'lodash/padStart' import type { Observable } from 'rxjs' import { combineLatest, merge, of } from 'rxjs' -import { fromPromise } from 'rxjs/internal-compatibility' import { mergeAll } from 'rxjs/internal/operators' +import { fromPromise } from 'rxjs/internal-compatibility' import { filter, map, mergeMap, toArray } from 'rxjs/operators' import type { Dictionary } from 'ts-essentials' import Web3 from 'web3' diff --git a/features/dsr/sidebar/DsrSidebarCreation.tsx b/features/dsr/sidebar/DsrSidebarCreation.tsx index 9880f405dc..38c87cc83b 100644 --- a/features/dsr/sidebar/DsrSidebarCreation.tsx +++ b/features/dsr/sidebar/DsrSidebarCreation.tsx @@ -7,8 +7,8 @@ import { isProxyStage } from 'features/proxy/proxy' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Flex, Image } from 'theme-ui' import { AddingStopLossAnimation } from 'theme/animations' +import { Box, Flex, Image } from 'theme-ui' function getTxHash(state: DsrDepositState) { if (getIsAllowanceStage(state.stage)) { diff --git a/features/earn/guni/manage/containers/GuniManageMultiplyVaultEditing.tsx b/features/earn/guni/manage/containers/GuniManageMultiplyVaultEditing.tsx index 2448c1fc28..bb728b8544 100644 --- a/features/earn/guni/manage/containers/GuniManageMultiplyVaultEditing.tsx +++ b/features/earn/guni/manage/containers/GuniManageMultiplyVaultEditing.tsx @@ -3,8 +3,8 @@ import type { ManageMultiplyVaultState } from 'features/multiply/manage/pipes/Ma import { formatAmount, formatCryptoBalance } from 'helpers/formatters/format' import { useTranslation } from 'next-i18next' import React from 'react' -import { Divider, Flex, Grid, Text } from 'theme-ui' import { dai_circle_color } from 'theme/icons' +import { Divider, Flex, Grid, Text } from 'theme-ui' import { GuniManageMultiplyVaultChangesInformation } from './GuniManageMultiplyVaultChangesInformation' diff --git a/features/earn/guni/manage/sidebars/SidebarManageGuniVault.tsx b/features/earn/guni/manage/sidebars/SidebarManageGuniVault.tsx index aef695ebc4..e336be4aea 100644 --- a/features/earn/guni/manage/sidebars/SidebarManageGuniVault.tsx +++ b/features/earn/guni/manage/sidebars/SidebarManageGuniVault.tsx @@ -20,8 +20,8 @@ import { } from 'helpers/extractSidebarHelpers' import { useTranslation } from 'next-i18next' import React, { useEffect, useState } from 'react' -import { Grid } from 'theme-ui' import { circle_close } from 'theme/icons' +import { Grid } from 'theme-ui' export function SidebarManageGuniVault(props: ManageMultiplyVaultState) { const { t } = useTranslation() diff --git a/features/earn/guni/manage/sidebars/SidebarManageGuniVaultManageStage.tsx b/features/earn/guni/manage/sidebars/SidebarManageGuniVaultManageStage.tsx index f2e51d8070..ee3d381201 100644 --- a/features/earn/guni/manage/sidebars/SidebarManageGuniVaultManageStage.tsx +++ b/features/earn/guni/manage/sidebars/SidebarManageGuniVaultManageStage.tsx @@ -3,8 +3,8 @@ import { GuniManageMultiplyVaultChangesInformation } from 'features/earn/guni/ma import type { ManageMultiplyVaultState } from 'features/multiply/manage/pipes/ManageMultiplyVaultState.types' import { useTranslation } from 'next-i18next' import React, { useEffect, useState } from 'react' -import { Text } from 'theme-ui' import { OpenVaultAnimation } from 'theme/animations' +import { Text } from 'theme-ui' export function SidebarManageGuniVaultManageStage(props: ManageMultiplyVaultState) { const { t } = useTranslation() diff --git a/features/earn/guni/open/sidebars/SidebarOpenGuniVaultOpenStage.tsx b/features/earn/guni/open/sidebars/SidebarOpenGuniVaultOpenStage.tsx index f2081d1f3f..e04212570e 100644 --- a/features/earn/guni/open/sidebars/SidebarOpenGuniVaultOpenStage.tsx +++ b/features/earn/guni/open/sidebars/SidebarOpenGuniVaultOpenStage.tsx @@ -3,8 +3,8 @@ import { GuniOpenMultiplyVaultChangesInformation } from 'features/earn/guni/open import type { OpenGuniVaultState } from 'features/earn/guni/open/pipes/openGuniVault.types' import { useTranslation } from 'next-i18next' import React from 'react' -import { Text } from 'theme-ui' import { OpenVaultAnimation } from 'theme/animations' +import { Text } from 'theme-ui' export function SidebarOpenGuniVaultOpenStage(props: OpenGuniVaultState) { const { t } = useTranslation() diff --git a/features/follow/common/ShareButton.tsx b/features/follow/common/ShareButton.tsx index c3bacc3592..f9b4917068 100644 --- a/features/follow/common/ShareButton.tsx +++ b/features/follow/common/ShareButton.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import { AppLink } from 'components/Links' import React from 'react' -import { Button } from 'theme-ui' import { share } from 'theme/icons' +import { Button } from 'theme-ui' interface ShareButtonPropsWithLink { hashtags?: never diff --git a/features/follow/view/FollowButton.tsx b/features/follow/view/FollowButton.tsx index 866227abbe..1f739a2ba6 100644 --- a/features/follow/view/FollowButton.tsx +++ b/features/follow/view/FollowButton.tsx @@ -2,9 +2,9 @@ import { Icon } from 'components/Icon' import { useTranslation } from 'next-i18next' import React, { useState } from 'react' import { theme } from 'theme' +import { star } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Button, Card, Spinner, Text } from 'theme-ui' -import { star } from 'theme/icons' import { useMediaQuery } from 'usehooks-ts' interface FollowButtonProps { diff --git a/features/homepage/HomepageView.tsx b/features/homepage/HomepageView.tsx index 5bafa61c70..4f5f38d3e4 100644 --- a/features/homepage/HomepageView.tsx +++ b/features/homepage/HomepageView.tsx @@ -10,8 +10,8 @@ import { scrollTo } from 'helpers/scrollTo' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Flex, Grid, Image, Text } from 'theme-ui' import { slideInAnimation } from 'theme/animations' +import { Box, Flex, Grid, Image, Text } from 'theme-ui' import { HomepageHeadline } from './common/HomepageHeadline' import { HomepagePromoBlock } from './common/HomepagePromoBlock' diff --git a/features/homepage/common/Hero.tsx b/features/homepage/common/Hero.tsx index 9273ebda14..2c10bf74a0 100644 --- a/features/homepage/common/Hero.tsx +++ b/features/homepage/common/Hero.tsx @@ -6,9 +6,9 @@ import { scrollTo } from 'helpers/scrollTo' import { useTranslation } from 'next-i18next' import type { ReactNode } from 'react' import React from 'react' +import { arrow_right } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Button, Flex, Grid, Heading, Text } from 'theme-ui' -import { arrow_right } from 'theme/icons' export function Hero({ sx, diff --git a/features/homepage/common/HomepageHeadline.tsx b/features/homepage/common/HomepageHeadline.tsx index 06d70fa3b6..61d8427201 100644 --- a/features/homepage/common/HomepageHeadline.tsx +++ b/features/homepage/common/HomepageHeadline.tsx @@ -1,9 +1,9 @@ import { Icon } from 'components/Icon' import type { TranslateStringType } from 'helpers/translateStringType' import React from 'react' +import { arrow_right } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Button, Text } from 'theme-ui' -import { arrow_right } from 'theme/icons' type HomePageHeadlineProps = { primaryText: string diff --git a/features/multiply/manage/containers/ManageMultiplyVaultEditing.tsx b/features/multiply/manage/containers/ManageMultiplyVaultEditing.tsx index 19d7510c60..2f6bbdc7b2 100644 --- a/features/multiply/manage/containers/ManageMultiplyVaultEditing.tsx +++ b/features/multiply/manage/containers/ManageMultiplyVaultEditing.tsx @@ -23,8 +23,8 @@ import { zero } from 'helpers/zero' import { useTranslation } from 'next-i18next' import React, { useEffect } from 'react' import ReactSelect from 'react-select' -import { Box, Button, Card, Divider, Flex, Grid, Slider, Text, useThemeUI } from 'theme-ui' import { dai_circle_color } from 'theme/icons' +import { Box, Button, Card, Divider, Flex, Grid, Slider, Text, useThemeUI } from 'theme-ui' import { ManageMultiplyVaultChangesInformation } from './ManageMultiplyVaultChangesInformation' diff --git a/features/multiply/manage/sidebars/SidebarManageMultiplyVault.tsx b/features/multiply/manage/sidebars/SidebarManageMultiplyVault.tsx index c6dc13642c..70701e1ec5 100644 --- a/features/multiply/manage/sidebars/SidebarManageMultiplyVault.tsx +++ b/features/multiply/manage/sidebars/SidebarManageMultiplyVault.tsx @@ -24,8 +24,8 @@ import { } from 'helpers/extractSidebarHelpers' import { useTranslation } from 'next-i18next' import React, { useEffect, useState } from 'react' -import { Grid } from 'theme-ui' import { circle_close, circle_exchange, circle_slider } from 'theme/icons' +import { Grid } from 'theme-ui' import { SidebarManageMultiplyVaultEditingStage } from './SidebarManageMultiplyVaultEditingStage' diff --git a/features/multiply/manage/sidebars/SidebarManageMultiplyVaultManageStage.tsx b/features/multiply/manage/sidebars/SidebarManageMultiplyVaultManageStage.tsx index 027e144291..0f2d606b88 100644 --- a/features/multiply/manage/sidebars/SidebarManageMultiplyVaultManageStage.tsx +++ b/features/multiply/manage/sidebars/SidebarManageMultiplyVaultManageStage.tsx @@ -5,8 +5,8 @@ import { ManageMultiplyVaultChangesInformation } from 'features/multiply/manage/ import type { ManageMultiplyVaultState } from 'features/multiply/manage/pipes/ManageMultiplyVaultState.types' import { useTranslation } from 'next-i18next' import React, { useEffect, useState } from 'react' -import { Text } from 'theme-ui' import { OpenVaultAnimation } from 'theme/animations' +import { Text } from 'theme-ui' export function SidebarManageMultiplyVaultManageStage(props: ManageMultiplyVaultState) { const { t } = useTranslation() diff --git a/features/multiply/manage/sidebars/SidebarManageMultiplyVaultTransitionStage.tsx b/features/multiply/manage/sidebars/SidebarManageMultiplyVaultTransitionStage.tsx index a188c8d4dd..8a635e5524 100644 --- a/features/multiply/manage/sidebars/SidebarManageMultiplyVaultTransitionStage.tsx +++ b/features/multiply/manage/sidebars/SidebarManageMultiplyVaultTransitionStage.tsx @@ -4,8 +4,8 @@ import { VaultType } from 'features/generalManageVault/vaultType.types' import type { ManageMultiplyVaultStage } from 'features/multiply/manage/pipes/ManageMultiplyVaultStage.types' import { useTranslation } from 'next-i18next' import React from 'react' -import { Grid, Text } from 'theme-ui' import { borrow_transition, checkmark, multiply_transition } from 'theme/icons' +import { Grid, Text } from 'theme-ui' export function SidebarManageMultiplyVaultTransitionStage({ stage, diff --git a/features/multiply/open/sidebars/SidebarOpenMultiplyVaultOpenStage.tsx b/features/multiply/open/sidebars/SidebarOpenMultiplyVaultOpenStage.tsx index 263b8db10d..fa87004264 100644 --- a/features/multiply/open/sidebars/SidebarOpenMultiplyVaultOpenStage.tsx +++ b/features/multiply/open/sidebars/SidebarOpenMultiplyVaultOpenStage.tsx @@ -4,8 +4,8 @@ import { OpenMultiplyVaultChangesInformation } from 'features/multiply/open/cont import type { OpenMultiplyVaultState } from 'features/multiply/open/pipes/openMultiplyVault.types' import { useTranslation } from 'next-i18next' import React from 'react' -import { Text } from 'theme-ui' import { OpenVaultAnimation } from 'theme/animations' +import { Text } from 'theme-ui' export function SidebarOpenMultiplyVaultOpenStage(props: OpenMultiplyVaultState) { const { t } = useTranslation() diff --git a/features/navigation/controls/AjnaNavigationController.tsx b/features/navigation/controls/AjnaNavigationController.tsx index 9b1c6a42c0..b9a9369aee 100644 --- a/features/navigation/controls/AjnaNavigationController.tsx +++ b/features/navigation/controls/AjnaNavigationController.tsx @@ -6,6 +6,7 @@ import { NavigationActionsController } from 'features/navigation/controls/Naviga import type { SwapWidgetChangeAction } from 'features/swapWidget/SwapWidgetChange' import { SWAP_WIDGET_CHANGE_SUBJECT } from 'features/swapWidget/SwapWidgetChange' import { INTERNAL_LINKS } from 'helpers/applicationLinks' +import { getPortfolioLink } from 'helpers/get-portfolio-link' import { uiChanges } from 'helpers/uiChanges' import { useAccount } from 'helpers/useAccount' import React from 'react' @@ -45,7 +46,7 @@ export function AjnaNavigationController() { { label: , - link: `/owner/${walletAddress}`, + link: getPortfolioLink(walletAddress), }, ] : []), diff --git a/features/navigation/controls/NavigationController.tsx b/features/navigation/controls/NavigationController.tsx index 84d3d95345..de1868c5ea 100644 --- a/features/navigation/controls/NavigationController.tsx +++ b/features/navigation/controls/NavigationController.tsx @@ -9,13 +9,14 @@ import { getNavProtocolsPanel } from 'features/navigation/panels/getNavProtocols import { getNavTokensPanel } from 'features/navigation/panels/getNavTokensPanel' import { getNavUseCasesPanel } from 'features/navigation/panels/getNavUseCasesPanel' import { - type SwapWidgetChangeAction, SWAP_WIDGET_CHANGE_SUBJECT, + type SwapWidgetChangeAction, } from 'features/swapWidget/SwapWidgetChange' import { useConnection } from 'features/web3OnBoard/useConnection' import { PROMO_CARD_COLLECTIONS_PARSERS } from 'handlers/product-hub/promo-cards' import { INTERNAL_LINKS } from 'helpers/applicationLinks' import { useAppConfig } from 'helpers/config' +import { getPortfolioLink } from 'helpers/get-portfolio-link' import { uiChanges } from 'helpers/uiChanges' import { useAccount } from 'helpers/useAccount' import { useTranslation } from 'next-i18next' @@ -87,7 +88,7 @@ export function NavigationController() { ? [ { label: , - link: `/owner/${walletAddress}`, + link: getPortfolioLink(walletAddress), }, ] : []), diff --git a/features/navigation/helpers/getProductBorrowNavItems.ts b/features/navigation/helpers/getProductBorrowNavItems.ts index e0f24e9baa..4f58dda3d4 100644 --- a/features/navigation/helpers/getProductBorrowNavItems.ts +++ b/features/navigation/helpers/getProductBorrowNavItems.ts @@ -1,7 +1,8 @@ +import { NetworkNames } from 'blockchain/networks' import { getActionUrl } from 'features/productHub/helpers' import type { ProductHubItem, ProductHubSupportedNetworks } from 'features/productHub/types' import { ProductHubProductType } from 'features/productHub/types' -import type { LendingProtocol } from 'lendingProtocols' +import { LendingProtocol } from 'lendingProtocols' type ProductBorrowNavItem = { value: number @@ -22,8 +23,8 @@ const getProductBorrowInitNavItem = (startingValue: number): ProductBorrowNavIte value: startingValue, primaryToken: '', secondaryToken: '', - protocol: '' as LendingProtocol, - network: '' as ProductHubSupportedNetworks, + protocol: LendingProtocol.AaveV3, + network: NetworkNames.ethereumMainnet, url: '', }) diff --git a/features/newsletter/NewsletterView.tsx b/features/newsletter/NewsletterView.tsx index 87bf9f8aed..d26c469747 100644 --- a/features/newsletter/NewsletterView.tsx +++ b/features/newsletter/NewsletterView.tsx @@ -7,8 +7,8 @@ import { Trans, useTranslation } from 'next-i18next' import type { FormEvent } from 'react' import React, { useEffect, useState } from 'react' import { GRADIENTS } from 'theme' -import { Box, Button, Flex, Grid, Heading, Input, Text } from 'theme-ui' import { arrow_right, checkmark } from 'theme/icons' +import { Box, Button, Flex, Grid, Heading, Input, Text } from 'theme-ui' import { createNewsletter$ } from './newsletter' import type { diff --git a/features/notices/VaultsNoticesView.tsx b/features/notices/VaultsNoticesView.tsx index e5d95f6fbf..2312b96587 100644 --- a/features/notices/VaultsNoticesView.tsx +++ b/features/notices/VaultsNoticesView.tsx @@ -17,6 +17,7 @@ import { formatCryptoBalance, formatDecimalAsPercent, } from 'helpers/formatters/format' +import { getPortfolioLink } from 'helpers/get-portfolio-link' import { useObservable } from 'helpers/observableHook' import type { TranslateStringType } from 'helpers/translateStringType' import { zero } from 'helpers/zero' @@ -25,10 +26,10 @@ import { useTranslation } from 'next-i18next' import type { PropsWithChildren } from 'react' import React, { useEffect, useMemo, useState } from 'react' import { CountdownCircleTimer } from 'react-countdown-circle-timer' -import type { ThemeUIStyleObject } from 'theme-ui' -import { Box, Flex, Grid, Heading, Text } from 'theme-ui' import { bannerWallet, exclamationMark } from 'theme/icons' import { useTheme } from 'theme/useThemeUI' +import type { ThemeUIStyleObject } from 'theme-ui' +import { Box, Flex, Grid, Heading, Text } from 'theme-ui' import type { LiquidationCallEvent as AaveLiquidationCallEventV2 } from 'types/ethers-contracts/AaveV2LendingPool' import type { LiquidationCallEvent as AaveLiquidationCallEventV3 } from 'types/ethers-contracts/AaveV3Pool' import type { StateFrom } from 'xstate' @@ -171,7 +172,7 @@ export function VaultOwnershipBanner({ ) : ( {t('vault-notices.ownership.subheader2')}{' '} - + {t('here')} @@ -204,7 +205,7 @@ function PositionOwnershipBanner({ ) : ( {t('vault-notices.position.subheader2')}{' '} - + {t('here')} @@ -236,7 +237,7 @@ export function VaultOverviewOwnershipNotice({ subheader={ {t('vaults-overview.banner-content')}{' '} - + {t('here')} diff --git a/features/omni-kit/components/sidebars/OmniAdjustSlider.tsx b/features/omni-kit/components/sidebars/OmniAdjustSlider.tsx index 45df7af81e..a71b98721c 100644 --- a/features/omni-kit/components/sidebars/OmniAdjustSlider.tsx +++ b/features/omni-kit/components/sidebars/OmniAdjustSlider.tsx @@ -9,8 +9,8 @@ import { formatCryptoBalance, formatDecimalAsPercent } from 'helpers/formatters/ import { one } from 'helpers/zero' import { useTranslation } from 'next-i18next' import React, { useEffect, useState } from 'react' -import { Flex, Text } from 'theme-ui' import { arrow_right } from 'theme/icons' +import { Flex, Text } from 'theme-ui' const min = new BigNumber(0.01) const max = new BigNumber(1) diff --git a/features/omni-kit/components/sidebars/OmniFormContentTransaction.tsx b/features/omni-kit/components/sidebars/OmniFormContentTransaction.tsx index cff0c738a4..36edc14da2 100644 --- a/features/omni-kit/components/sidebars/OmniFormContentTransaction.tsx +++ b/features/omni-kit/components/sidebars/OmniFormContentTransaction.tsx @@ -5,8 +5,8 @@ import { upperFirst } from 'lodash' import { useTranslation } from 'next-i18next' import type { FC } from 'react' import React from 'react' -import { Text } from 'theme-ui' import { OpenVaultAnimation } from 'theme/animations' +import { Text } from 'theme-ui' interface OmniFormContentTransactionProps { orderInformation: FC diff --git a/features/omni-kit/components/sidebars/borrow/OmniBorrowFormContentSwitch.tsx b/features/omni-kit/components/sidebars/borrow/OmniBorrowFormContentSwitch.tsx index 07ebde7c8d..b1409305a0 100644 --- a/features/omni-kit/components/sidebars/borrow/OmniBorrowFormContentSwitch.tsx +++ b/features/omni-kit/components/sidebars/borrow/OmniBorrowFormContentSwitch.tsx @@ -2,8 +2,8 @@ import { ListWithIcon } from 'components/ListWithIcon' import { useOmniGeneralContext } from 'features/omni-kit/contexts' import React from 'react' import { useTranslation } from 'react-i18next' -import { Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Text } from 'theme-ui' export function OmniBorrowFormContentSwitch() { const { t } = useTranslation() diff --git a/features/omni-kit/components/sidebars/borrow/OmniBorrowFormContentTransition.tsx b/features/omni-kit/components/sidebars/borrow/OmniBorrowFormContentTransition.tsx index ecb2df9f55..47f7b36eb9 100644 --- a/features/omni-kit/components/sidebars/borrow/OmniBorrowFormContentTransition.tsx +++ b/features/omni-kit/components/sidebars/borrow/OmniBorrowFormContentTransition.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import React from 'react' import { useTranslation } from 'react-i18next' -import { Text } from 'theme-ui' import { multiply_transition } from 'theme/icons' +import { Text } from 'theme-ui' export function OmniBorrowFormContentTransition() { const { t } = useTranslation() diff --git a/features/omni-kit/components/sidebars/multiply/OmniMultiplyFormContentSwitch.tsx b/features/omni-kit/components/sidebars/multiply/OmniMultiplyFormContentSwitch.tsx index f2ea8c4796..a04e8ae3d4 100644 --- a/features/omni-kit/components/sidebars/multiply/OmniMultiplyFormContentSwitch.tsx +++ b/features/omni-kit/components/sidebars/multiply/OmniMultiplyFormContentSwitch.tsx @@ -1,8 +1,8 @@ import { ListWithIcon } from 'components/ListWithIcon' import React from 'react' import { useTranslation } from 'react-i18next' -import { Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Text } from 'theme-ui' export function OmniMultiplyFormContentSwitch() { const { t } = useTranslation() diff --git a/features/omni-kit/components/sidebars/multiply/OmniMultiplyFormContentTransition.tsx b/features/omni-kit/components/sidebars/multiply/OmniMultiplyFormContentTransition.tsx index 8bbd85350e..20c8c216c5 100644 --- a/features/omni-kit/components/sidebars/multiply/OmniMultiplyFormContentTransition.tsx +++ b/features/omni-kit/components/sidebars/multiply/OmniMultiplyFormContentTransition.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import React from 'react' import { useTranslation } from 'react-i18next' -import { Text } from 'theme-ui' import { borrow_transition } from 'theme/icons' +import { Text } from 'theme-ui' export function OmniMultiplyFormContentTransition() { const { t } = useTranslation() diff --git a/features/omni-kit/controllers/OmniProductController.tsx b/features/omni-kit/controllers/OmniProductController.tsx index f9de25b7c5..c4051063b8 100644 --- a/features/omni-kit/controllers/OmniProductController.tsx +++ b/features/omni-kit/controllers/OmniProductController.tsx @@ -1,4 +1,4 @@ -import { type NetworkNames, getNetworkByName } from 'blockchain/networks' +import { getNetworkByName, type NetworkNames } from 'blockchain/networks' import { WithConnection } from 'components/connectWallet' import { PageSEOTags } from 'components/HeadTags' import { PositionLoadingState } from 'components/vault/PositionLoadingState' diff --git a/features/omni-kit/controllers/OmniValidationMessagesController.tsx b/features/omni-kit/controllers/OmniValidationMessagesController.tsx index d3d7504d97..cb9dd1dcb2 100644 --- a/features/omni-kit/controllers/OmniValidationMessagesController.tsx +++ b/features/omni-kit/controllers/OmniValidationMessagesController.tsx @@ -1,6 +1,6 @@ import { MessageCard } from 'components/MessageCard' import { useOmniGeneralContext } from 'features/omni-kit/contexts/OmniGeneralContext' -import { type OmniValidationItem, OmniProductType } from 'features/omni-kit/types' +import { OmniProductType, type OmniValidationItem } from 'features/omni-kit/types' import { useTranslation } from 'next-i18next' import type { FC } from 'react' import React from 'react' diff --git a/features/omni-kit/helpers/getOmniFlowStateConfig.ts b/features/omni-kit/helpers/getOmniFlowStateConfig.ts index 753bbef05c..14580feac3 100644 --- a/features/omni-kit/helpers/getOmniFlowStateConfig.ts +++ b/features/omni-kit/helpers/getOmniFlowStateConfig.ts @@ -1,9 +1,9 @@ import type BigNumber from 'bignumber.js' import { getMaxIncreasedValue } from 'features/ajna/positions/common/helpers/getMaxIncreasedValue' import { - type OmniFormState, OmniBorrowFormAction, OmniEarnFormAction, + type OmniFormState, OmniMultiplyFormAction, OmniSidebarEarnPanel, } from 'features/omni-kit/types' diff --git a/features/omni-kit/hooks/useOmniTransition.ts b/features/omni-kit/hooks/useOmniTransition.ts index c99d20f9d4..30bd6c66db 100644 --- a/features/omni-kit/hooks/useOmniTransition.ts +++ b/features/omni-kit/hooks/useOmniTransition.ts @@ -1,8 +1,8 @@ import BigNumber from 'bignumber.js' import { VaultType } from 'features/generalManageVault/vaultType.types' import { - type OmniFormAction, OmniBorrowFormAction, + type OmniFormAction, OmniMultiplyFormAction, OmniProductType, } from 'features/omni-kit/types' diff --git a/features/omni-kit/protocols/ajna/constants.ts b/features/omni-kit/protocols/ajna/constants.ts index c81a6a9af0..fdadf92697 100644 --- a/features/omni-kit/protocols/ajna/constants.ts +++ b/features/omni-kit/protocols/ajna/constants.ts @@ -3,7 +3,7 @@ import { omniSidebarManageSteps, omniSidebarSetupSteps, } from 'features/omni-kit/constants' -import { type OmniSidebarStepsSet, OmniSidebarStep } from 'features/omni-kit/types' +import { OmniSidebarStep, type OmniSidebarStepsSet } from 'features/omni-kit/types' export const ajnaOmniSteps: OmniSidebarStepsSet = { borrow: { diff --git a/features/omni-kit/protocols/ajna/metadata/AjnaOmniEarnFormOrder.tsx b/features/omni-kit/protocols/ajna/metadata/AjnaOmniEarnFormOrder.tsx index 556a748482..a6c2f89a35 100644 --- a/features/omni-kit/protocols/ajna/metadata/AjnaOmniEarnFormOrder.tsx +++ b/features/omni-kit/protocols/ajna/metadata/AjnaOmniEarnFormOrder.tsx @@ -2,8 +2,8 @@ import { useOmniProductContext } from 'features/omni-kit/contexts/OmniProductCon import { AjnaOmniClaimCollateralFormOrderInformation } from 'features/omni-kit/protocols/ajna/metadata/AjnaOmniClaimCollateralFormOrderInformation' import { AjnaOmniEarnFormOrderInformation } from 'features/omni-kit/protocols/ajna/metadata/AjnaOmniEarnFormOrderInformation' import { - type OmniIsCachedPosition, OmniEarnFormAction, + type OmniIsCachedPosition, OmniProductType, } from 'features/omni-kit/types' import type { FC } from 'react' diff --git a/features/omni-kit/protocols/ajna/metadata/AjnaOmniFormContentRisk.tsx b/features/omni-kit/protocols/ajna/metadata/AjnaOmniFormContentRisk.tsx index 2cc2d8dfb0..520eb8146d 100644 --- a/features/omni-kit/protocols/ajna/metadata/AjnaOmniFormContentRisk.tsx +++ b/features/omni-kit/protocols/ajna/metadata/AjnaOmniFormContentRisk.tsx @@ -7,8 +7,8 @@ import { EXTERNAL_LINKS } from 'helpers/applicationLinks' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Image, Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Box, Image, Text } from 'theme-ui' const LINKS_MAP: { [key in AjnaProduct]: string } = { borrow: EXTERNAL_LINKS.DOCS.AJNA.LIQUIDATIONS, diff --git a/features/omni-kit/protocols/morpho-blue/constants.ts b/features/omni-kit/protocols/morpho-blue/constants.ts index f5ac8f2b96..57ab611d58 100644 --- a/features/omni-kit/protocols/morpho-blue/constants.ts +++ b/features/omni-kit/protocols/morpho-blue/constants.ts @@ -3,7 +3,7 @@ import { omniSidebarManageSteps, omniSidebarSetupSteps, } from 'features/omni-kit/constants' -import { type OmniSidebarStepsSet, OmniProductType } from 'features/omni-kit/types' +import { OmniProductType, type OmniSidebarStepsSet } from 'features/omni-kit/types' export const morphoSeoTags = { productKey: `seo.morphoProductPage.title`, diff --git a/features/omni-kit/server/getOmniServerSideProps.ts b/features/omni-kit/server/getOmniServerSideProps.ts index ccd098e590..5aa2d8ad20 100644 --- a/features/omni-kit/server/getOmniServerSideProps.ts +++ b/features/omni-kit/server/getOmniServerSideProps.ts @@ -1,4 +1,4 @@ -import { type NetworkNames, isSupportedNetwork } from 'blockchain/networks' +import { isSupportedNetwork, type NetworkNames } from 'blockchain/networks' import { isAddress } from 'ethers/lib/utils' import type { OmniProductPage } from 'features/omni-kit/types' import { OmniProductType } from 'features/omni-kit/types' diff --git a/features/poolCreator/hooks/usePoolCreatorData.tsx b/features/poolCreator/hooks/usePoolCreatorData.tsx index e15bf0efcc..535add7db2 100644 --- a/features/poolCreator/hooks/usePoolCreatorData.tsx +++ b/features/poolCreator/hooks/usePoolCreatorData.tsx @@ -27,8 +27,8 @@ import { useDebouncedEffect } from 'helpers/useDebouncedEffect' import { zero } from 'helpers/zero' import { Trans, useTranslation } from 'next-i18next' import React, { useEffect, useMemo, useState } from 'react' -import { takeWhileInclusive } from 'rxjs-take-while-inclusive' import { first } from 'rxjs/operators' +import { takeWhileInclusive } from 'rxjs-take-while-inclusive' import { Text } from 'theme-ui' interface UsePoolCreatorDataProps { diff --git a/features/poolFinder/components/PoolFinderAddressInput.tsx b/features/poolFinder/components/PoolFinderAddressInput.tsx index 808de6e3e6..3fcdc5c672 100644 --- a/features/poolFinder/components/PoolFinderAddressInput.tsx +++ b/features/poolFinder/components/PoolFinderAddressInput.tsx @@ -5,8 +5,8 @@ import { AppLink } from 'components/Links' import { isAddress } from 'ethers/lib/utils' import type { FC } from 'react' import React from 'react' -import { Flex, Input, Label } from 'theme-ui' import { link } from 'theme/icons' +import { Flex, Input, Label } from 'theme-ui' interface PoolFinderAddressInputProps { label: string diff --git a/features/poolFinder/components/PoolFinderReplacer.tsx b/features/poolFinder/components/PoolFinderReplacer.tsx index 545e955009..e80dd3bab2 100644 --- a/features/poolFinder/components/PoolFinderReplacer.tsx +++ b/features/poolFinder/components/PoolFinderReplacer.tsx @@ -1,8 +1,8 @@ import { Icon } from 'components/Icon' import type { FC } from 'react' import React from 'react' -import { Button } from 'theme-ui' import { refresh } from 'theme/icons' +import { Button } from 'theme-ui' interface PoolFinderReplacerProps { isVisible: boolean diff --git a/features/poolFinder/controls/PoolFinderNaturalLanguageSelectorController.tsx b/features/poolFinder/controls/PoolFinderNaturalLanguageSelectorController.tsx index 4a0cf0f196..e177e7a917 100644 --- a/features/poolFinder/controls/PoolFinderNaturalLanguageSelectorController.tsx +++ b/features/poolFinder/controls/PoolFinderNaturalLanguageSelectorController.tsx @@ -2,8 +2,8 @@ import { HeaderSelector } from 'components/HeaderSelector' import { productHubOptionsMap } from 'features/productHub/meta' import type { ProductHubProductType } from 'features/productHub/types' import { INTERNAL_LINKS } from 'helpers/applicationLinks' -import { useTranslation } from 'next-i18next' import { useRouter } from 'next/router' +import { useTranslation } from 'next-i18next' import type { FC } from 'react' import React, { useRef } from 'react' import { Box, Heading } from 'theme-ui' diff --git a/features/productHub/views/ProductHubView.tsx b/features/productHub/views/ProductHubView.tsx index 8636aa6942..bf77af7afb 100644 --- a/features/productHub/views/ProductHubView.tsx +++ b/features/productHub/views/ProductHubView.tsx @@ -27,8 +27,8 @@ import { PROMO_CARD_COLLECTIONS_PARSERS } from 'handlers/product-hub/promo-cards import type { PromoCardsCollection } from 'handlers/product-hub/types' import { WithLoadingIndicator } from 'helpers/AppSpinner' import type { LendingProtocol } from 'lendingProtocols' -import { useTranslation } from 'next-i18next' import { useSearchParams } from 'next/navigation' +import { useTranslation } from 'next-i18next' import type { FC, ReactNode } from 'react' import React, { Fragment, useEffect, useMemo, useState } from 'react' import { Box, Flex } from 'theme-ui' diff --git a/features/referralOverview/FeesView.tsx b/features/referralOverview/FeesView.tsx index b79cb316e1..561bf6314d 100644 --- a/features/referralOverview/FeesView.tsx +++ b/features/referralOverview/FeesView.tsx @@ -12,9 +12,9 @@ import { formatAddress } from 'helpers/formatters/format' import { useModalContext } from 'helpers/modalHook' import { useTranslation } from 'next-i18next' import React from 'react' -import { Box, Button, Card, Divider, Flex, Grid, Spinner, Text } from 'theme-ui' import { fadeInAnimation } from 'theme/animations' import { arrow_right, dai_circle_color } from 'theme/icons' +import { Box, Button, Card, Divider, Flex, Grid, Spinner, Text } from 'theme-ui' import type { UserReferralState } from './user.types' import { ClaimTxnState } from './user.types' diff --git a/features/referralOverview/ReferralLanding.tsx b/features/referralOverview/ReferralLanding.tsx index 4a6839ce50..b61a16a7e3 100644 --- a/features/referralOverview/ReferralLanding.tsx +++ b/features/referralOverview/ReferralLanding.tsx @@ -17,8 +17,8 @@ import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { useRedirect } from 'helpers/useRedirect' import { Trans, useTranslation } from 'next-i18next' import React from 'react' -import { Box, Button, Flex, Image, Text } from 'theme-ui' import { arrow_right } from 'theme/icons' +import { Box, Button, Flex, Image, Text } from 'theme-ui' import type { UpsertUser } from './FeesView' import { ReferralLayout } from './ReferralLayout' diff --git a/features/referralOverview/ReferralLayout.tsx b/features/referralOverview/ReferralLayout.tsx index 776496f915..d84d9b2ffd 100644 --- a/features/referralOverview/ReferralLayout.tsx +++ b/features/referralOverview/ReferralLayout.tsx @@ -4,9 +4,9 @@ import { EXTERNAL_LINKS } from 'helpers/applicationLinks' import { useTranslation } from 'next-i18next' import type { PropsWithChildren } from 'react' import React from 'react' -import { Flex, Grid, Heading, Text } from 'theme-ui' import { fadeInAnimation } from 'theme/animations' import { arrow_right } from 'theme/icons' +import { Flex, Grid, Heading, Text } from 'theme-ui' export function ReferralLayout({ children }: PropsWithChildren<{}>) { const { t } = useTranslation() diff --git a/features/referralOverview/ReferralsView.tsx b/features/referralOverview/ReferralsView.tsx index 2a7975fed0..390b1c0354 100644 --- a/features/referralOverview/ReferralsView.tsx +++ b/features/referralOverview/ReferralsView.tsx @@ -5,9 +5,9 @@ import { isAddress } from 'ethers/lib/utils' import { formatAddress } from 'helpers/formatters/format' import { useTranslation } from 'next-i18next' import React, { useRef, useState } from 'react' -import { Box, Card, Flex, Text, Textarea } from 'theme-ui' import { fadeInAnimation } from 'theme/animations' import { checkmark, duplicate } from 'theme/icons' +import { Box, Card, Flex, Text, Textarea } from 'theme-ui' interface Props { address: string diff --git a/features/stateMachines/dpmAccount/CreateDPMAccountView.tsx b/features/stateMachines/dpmAccount/CreateDPMAccountView.tsx index 4c3930c126..1566920d75 100644 --- a/features/stateMachines/dpmAccount/CreateDPMAccountView.tsx +++ b/features/stateMachines/dpmAccount/CreateDPMAccountView.tsx @@ -13,8 +13,8 @@ import { EXTERNAL_LINKS } from 'helpers/applicationLinks' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { Trans, useTranslation } from 'next-i18next' import React from 'react' -import { Grid, Image, Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Grid, Image, Text } from 'theme-ui' import type { ActorRefFrom, Sender, StateFrom } from 'xstate' import type { diff --git a/features/stateMachines/proxy/ProxyView.tsx b/features/stateMachines/proxy/ProxyView.tsx index a291bff64b..10411738d6 100644 --- a/features/stateMachines/proxy/ProxyView.tsx +++ b/features/stateMachines/proxy/ProxyView.tsx @@ -13,8 +13,8 @@ import { useAppConfig } from 'helpers/config' import { staticFilesRuntimeUrl } from 'helpers/staticPaths' import { Trans, useTranslation } from 'next-i18next' import React from 'react' -import { Grid, Image, Text } from 'theme-ui' import { checkmark } from 'theme/icons' +import { Grid, Image, Text } from 'theme-ui' import type { ActorRefFrom, Sender } from 'xstate' import type { ProxyEvent, ProxyStateMachine, ProxyStateMachineState } from './state' diff --git a/features/termsOfService/TermsOfService.tsx b/features/termsOfService/TermsOfService.tsx index 1d1df8567c..92af73c713 100644 --- a/features/termsOfService/TermsOfService.tsx +++ b/features/termsOfService/TermsOfService.tsx @@ -9,13 +9,13 @@ import { NewReferralModal } from 'features/referralOverview/NewReferralModal' import type { UserReferralState } from 'features/referralOverview/user.types' import { useWalletManagement } from 'features/web3OnBoard/useConnection' import { useObservable } from 'helpers/observableHook' -import { useTranslation } from 'next-i18next' import getConfig from 'next/config' +import { useTranslation } from 'next-i18next' import type { ReactNode } from 'react' import React, { useState } from 'react' -import { Box, Button, Flex, Grid, Heading, Label, Text } from 'theme-ui' import { fadeIn } from 'theme/animations' import { checkmark } from 'theme/icons' +import { Box, Button, Flex, Grid, Heading, Label, Text } from 'theme-ui' import type { TermsAcceptanceStage, TermsAcceptanceState } from './termsAcceptance.types' diff --git a/features/termsOfService/termsAcceptance.ts b/features/termsOfService/termsAcceptance.ts index d94780a933..dd3953a3f8 100644 --- a/features/termsOfService/termsAcceptance.ts +++ b/features/termsOfService/termsAcceptance.ts @@ -4,8 +4,8 @@ import type { Web3Context, Web3ContextConnected } from 'features/web3Context' import { checkIfGnosisSafe } from 'helpers/checkIfGnosisSafe' import type { Observable } from 'rxjs' import { identity, merge, NEVER, of, Subject } from 'rxjs' -import { takeWhileInclusive } from 'rxjs-take-while-inclusive' import { catchError, map, repeat, shareReplay, startWith, switchMap } from 'rxjs/operators' +import { takeWhileInclusive } from 'rxjs-take-while-inclusive' import type Web3 from 'web3' import type { TermsAcceptanceState } from './termsAcceptance.types' diff --git a/features/userSettings/UserSettingsView.tsx b/features/userSettings/UserSettingsView.tsx index 67bd949d6f..3f3c28d08c 100644 --- a/features/userSettings/UserSettingsView.tsx +++ b/features/userSettings/UserSettingsView.tsx @@ -18,14 +18,14 @@ import { formatPrecision, } from 'helpers/formatters/format' import { useObservable } from 'helpers/observableHook' -import { useTranslation } from 'next-i18next' import Link from 'next/link' +import { useTranslation } from 'next-i18next' import type { ChangeEvent } from 'react' import React, { useCallback, useRef, useState } from 'react' import { createNumberMask } from 'text-mask-addons' +import { chevron_down, chevron_up, dai_color, settings, sign_out } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Button, Card, Flex, Grid, Heading, Link as ThemeLink, Text, Textarea } from 'theme-ui' -import { chevron_down, chevron_up, dai_color, settings, sign_out } from 'theme/icons' import { UnreachableCaseError } from 'ts-essentials' import { SLIPPAGE_OPTIONS } from './userSettings.constants' diff --git a/features/vaultHistory/VaultHistoryEntry.tsx b/features/vaultHistory/VaultHistoryEntry.tsx index 6cb3a0cd2e..803aa7ec56 100644 --- a/features/vaultHistory/VaultHistoryEntry.tsx +++ b/features/vaultHistory/VaultHistoryEntry.tsx @@ -21,8 +21,8 @@ import { zero } from 'helpers/zero' import { useTranslation } from 'next-i18next' import type { PropsWithChildren } from 'react' import React, { useState } from 'react' -import { Box, Flex, Text } from 'theme-ui' import { chevron_down, chevron_up } from 'theme/icons' +import { Box, Flex, Text } from 'theme-ui' import type { TranslationType } from 'ts_modules/i18next' import type { VaultHistoryEvent } from './vaultHistory.types' diff --git a/features/vaultsOverview/Filters.tsx b/features/vaultsOverview/Filters.tsx index 9a018986ca..da9f7cafb4 100644 --- a/features/vaultsOverview/Filters.tsx +++ b/features/vaultsOverview/Filters.tsx @@ -1,13 +1,13 @@ import { trackingEvents } from 'analytics/trackingEvents' import type { MixpanelPages } from 'analytics/types' -import { type CoinTag, COIN_TAGS } from 'blockchain/TokenConfig' +import { COIN_TAGS, type CoinTag } from 'blockchain/TokenConfig' import { Icon } from 'components/Icon' import { useTranslation } from 'next-i18next' import React, { memo, useCallback } from 'react' import ReactSelect from 'react-select' +import { chevron, searchIcon } from 'theme/icons' import type { ThemeUIStyleObject } from 'theme-ui' import { Box, Button, Flex, Input } from 'theme-ui' -import { chevron, searchIcon } from 'theme/icons' interface FiltersProps { onSearch: (search: string) => void diff --git a/features/vaultsOverview/components/AssetsAndPositionsOverviewLoadingState.tsx b/features/vaultsOverview/components/AssetsAndPositionsOverviewLoadingState.tsx index 8145357a30..84b58c2c39 100644 --- a/features/vaultsOverview/components/AssetsAndPositionsOverviewLoadingState.tsx +++ b/features/vaultsOverview/components/AssetsAndPositionsOverviewLoadingState.tsx @@ -1,7 +1,7 @@ import { Skeleton } from 'components/Skeleton' import React from 'react' -import { Box, Flex, Grid } from 'theme-ui' import { useBreakpointIndex } from 'theme/useBreakpointIndex' +import { Box, Flex, Grid } from 'theme-ui' export function AssetsAndPositionsOverviewLoadingState() { const breakpointIndex = useBreakpointIndex() diff --git a/features/vaultsOverview/containers/AssetsAndPositionsOverview.tsx b/features/vaultsOverview/containers/AssetsAndPositionsOverview.tsx index a766a62b99..cceecf8bff 100644 --- a/features/vaultsOverview/containers/AssetsAndPositionsOverview.tsx +++ b/features/vaultsOverview/containers/AssetsAndPositionsOverview.tsx @@ -23,10 +23,10 @@ import { zero } from 'helpers/zero' import { Trans, useTranslation } from 'next-i18next' import React, { useState } from 'react' import { createPortal } from 'react-dom' -import type { ThemeUIStyleObject } from 'theme-ui' -import { Box, Card, Flex, Grid, Heading, Image, Link, Text } from 'theme-ui' import { arrow_right, dots_v } from 'theme/icons' import { useBreakpointIndex } from 'theme/useBreakpointIndex' +import type { ThemeUIStyleObject } from 'theme-ui' +import { Box, Card, Flex, Grid, Heading, Image, Link, Text } from 'theme-ui' function tokenColor(symbol: string) { return getToken(symbol)?.color || '#999' diff --git a/features/vaultsOverview/containers/ConnectWalletPrompt.tsx b/features/vaultsOverview/containers/ConnectWalletPrompt.tsx index 22edc47805..9adc175c88 100644 --- a/features/vaultsOverview/containers/ConnectWalletPrompt.tsx +++ b/features/vaultsOverview/containers/ConnectWalletPrompt.tsx @@ -4,8 +4,8 @@ import { useConnection } from 'features/web3OnBoard/useConnection' import { useObservable } from 'helpers/observableHook' import { useTranslation } from 'next-i18next' import React from 'react' -import { Button, Flex, Heading } from 'theme-ui' import { arrow_right } from 'theme/icons' +import { Button, Flex, Heading } from 'theme-ui' export function ConnectWalletPrompt() { const { t } = useTranslation() diff --git a/handlers/product-hub/helpers/get-token-group.ts b/handlers/product-hub/helpers/get-token-group.ts index 1c8d37b0e9..51cb720192 100644 --- a/handlers/product-hub/helpers/get-token-group.ts +++ b/handlers/product-hub/helpers/get-token-group.ts @@ -5,8 +5,9 @@ export function getTokenGroup(token: string): string { switch (token) { case 'CBETH': case 'RETH': - case 'WSTETH': case 'STETH': + case 'WETH': + case 'WSTETH': case 'YIELDETH': return 'ETH' case 'TBTC': diff --git a/helpers/clients/portfolio-client.ts b/helpers/clients/portfolio-client.ts new file mode 100644 index 0000000000..13e83e7ec3 --- /dev/null +++ b/helpers/clients/portfolio-client.ts @@ -0,0 +1,40 @@ +import { useCallback, useMemo } from 'react' + +import type { PortfolioAssetsResponse } from 'lambdas/src/portfolio-assets/types' +import type { PortfolioOverviewResponse } from 'lambdas/src/portfolio-overview/types' +import type { PortfolioPositionsResponse } from 'lambdas/src/portfolio-positions/types' + +/** + * typed client for fetching portfolio data from aws gateway + * @param baseUrl + * @param headers + * @returns getters for portfolio data + */ +export const usePortfolioClient = (baseUrl: string, headers: HeadersInit) => { + const fetchPortfolioGeneric = useCallback( + async ( + section: 'overview' | 'assets' | 'positions', + address: string, + ): Promise => { + const response = await fetch(`${baseUrl}/portfolio-${section}?address=${address}`, { + headers, + }) + .then((res) => res.json()) + .catch((err) => console.error(err)) + return response + }, + [baseUrl, headers], + ) + + return useMemo( + () => ({ + fetchPortfolioOverview: (address: string) => + fetchPortfolioGeneric('overview', address), + fetchPortfolioAssets: (address: string) => + fetchPortfolioGeneric('assets', address), + fetchPortfolioPositions: (address: string) => + fetchPortfolioGeneric('positions', address), + }), + [fetchPortfolioGeneric], + ) +} diff --git a/helpers/form.tsx b/helpers/form.tsx index d68cbe0436..8b8fec2670 100644 --- a/helpers/form.tsx +++ b/helpers/form.tsx @@ -6,8 +6,8 @@ import type { GasPriceParams, Tickers } from 'blockchain/prices.types' import { MODAL_CONTAINER_TREZOR_METAMASK_EIP1559 } from 'components/Modal' import type { Observable } from 'rxjs' import { combineLatest, of } from 'rxjs' -import { takeWhileInclusive } from 'rxjs-take-while-inclusive' import { catchError, first, flatMap, map, startWith, switchMap } from 'rxjs/operators' +import { takeWhileInclusive } from 'rxjs-take-while-inclusive' import type { OmitProperties, ValueOf } from 'ts-essentials' import type { TxHelpers, TxHelpers$ } from './context/TxHelpers' diff --git a/helpers/get-portfolio-link.ts b/helpers/get-portfolio-link.ts new file mode 100644 index 0000000000..22f2859b3d --- /dev/null +++ b/helpers/get-portfolio-link.ts @@ -0,0 +1,10 @@ +import { getLocalAppConfig } from './config' + +export const getPortfolioLink = (address?: string) => { + if (!address) { + return '' + } + const portfolioAddress = getLocalAppConfig('features').NewPortfolio ? 'portfolio' : 'owner' + + return `/${portfolioAddress}/${address}` +} diff --git a/infra/.gitignore b/infra/.gitignore new file mode 100644 index 0000000000..1dfae30c78 --- /dev/null +++ b/infra/.gitignore @@ -0,0 +1,11 @@ +*.d.ts +*.js +node_modules +cdktf.out +cdktf.log +*terraform.*.tfstate* +.gen +.terraform +tsconfig.tsbuildinfo +!jest.config.js +!setup.js \ No newline at end of file diff --git a/infra/__tests__/main-test.ts b/infra/__tests__/main-test.ts new file mode 100644 index 0000000000..e22c6cfcfa --- /dev/null +++ b/infra/__tests__/main-test.ts @@ -0,0 +1,89 @@ +// Copyright (c) HashiCorp, Inc +// SPDX-License-Identifier: MPL-2.0 +// import 'cdktf/lib/testing/adapters/jest' // Load types for expect matchers +// import { Testing } from "cdktf"; + +describe('My CDKTF Application', () => { + // The tests below are example tests, you can find more information at + // https://cdk.tf/testing + it.todo('should be tested') + + // // All Unit tests test the synthesised terraform code, it does not create real-world resources + // describe("Unit testing using assertions", () => { + // it("should contain a resource", () => { + // // import { Image,Container } from "./.gen/providers/docker" + // expect( + // Testing.synthScope((scope) => { + // new MyApplicationsAbstraction(scope, "my-app", {}); + // }) + // ).toHaveResource(Container); + + // expect( + // Testing.synthScope((scope) => { + // new MyApplicationsAbstraction(scope, "my-app", {}); + // }) + // ).toHaveResourceWithProperties(Image, { name: "ubuntu:latest" }); + // }); + // }); + + // describe("Unit testing using snapshots", () => { + // it("Tests the snapshot", () => { + // const app = Testing.app(); + // const stack = new TerraformStack(app, "test"); + + // new TestProvider(stack, "provider", { + // accessKey: "1", + // }); + + // new TestResource(stack, "test", { + // name: "my-resource", + // }); + + // expect(Testing.synth(stack)).toMatchSnapshot(); + // }); + + // it("Tests a combination of resources", () => { + // expect( + // Testing.synthScope((stack) => { + // new TestDataSource(stack, "test-data-source", { + // name: "foo", + // }); + + // new TestResource(stack, "test-resource", { + // name: "bar", + // }); + // }) + // ).toMatchInlineSnapshot(); + // }); + // }); + + // describe("Checking validity", () => { + // it("check if the produced terraform configuration is valid", () => { + // const app = Testing.app(); + // const stack = new TerraformStack(app, "test"); + + // new TestDataSource(stack, "test-data-source", { + // name: "foo", + // }); + + // new TestResource(stack, "test-resource", { + // name: "bar", + // }); + // expect(Testing.fullSynth(app)).toBeValidTerraform(); + // }); + + // it("check if this can be planned", () => { + // const app = Testing.app(); + // const stack = new TerraformStack(app, "test"); + + // new TestDataSource(stack, "test-data-source", { + // name: "foo", + // }); + + // new TestResource(stack, "test-resource", { + // name: "bar", + // }); + // expect(Testing.fullSynth(app)).toPlanSuccessfully(); + // }); + // }); +}) diff --git a/infra/cdktf.json b/infra/cdktf.json new file mode 100644 index 0000000000..7a040c5db3 --- /dev/null +++ b/infra/cdktf.json @@ -0,0 +1,11 @@ +{ + "language": "typescript", + "app": "npx ts-node main.ts", + "projectId": "bf1f7088-c72f-42f3-aa73-46c13e5281cf", + "sendCrashReports": "false", + "terraformProviders": [ + "hashicorp/aws@~>4.0" + ], + "terraformModules": [], + "context": {} +} \ No newline at end of file diff --git a/infra/help b/infra/help new file mode 100644 index 0000000000..716be8d964 --- /dev/null +++ b/infra/help @@ -0,0 +1,51 @@ +======================================================================================================== + + Your CDKTF TypeScript project is ready! + + cat help Print this message + + Compile: + npm run get Import/update Terraform providers and modules (you should check-in this directory) + npm run compile Compile typescript code to javascript (or "npm run watch") + npm run watch Watch for changes and compile typescript in the background + npm run build Compile typescript + + Synthesize: + cdktf synth [stack] Synthesize Terraform resources from stacks to cdktf.out/ (ready for 'terraform apply') + + Diff: + cdktf diff [stack] Perform a diff (terraform plan) for the given stack + + Deploy: + cdktf deploy [stack] Deploy the given stack + + Destroy: + cdktf destroy [stack] Destroy the stack + + Test: + npm run test Runs unit tests (edit __tests__/main-test.ts to add your own tests) + npm run test:watch Watches the tests and reruns them on change + + Upgrades: + npm run upgrade Upgrade cdktf modules to latest version + npm run upgrade:next Upgrade cdktf modules to latest "@next" version (last commit) + + Use Providers: + + You can add prebuilt providers (if available) or locally generated ones using the add command: + + cdktf provider add "aws@~>3.0" null kreuzwerker/docker + + You can find all prebuilt providers on npm: https://www.npmjs.com/search?q=keywords:cdktf + You can also install these providers directly through npm: + + npm install @cdktf/provider-aws + npm install @cdktf/provider-google + npm install @cdktf/provider-azurerm + npm install @cdktf/provider-docker + npm install @cdktf/provider-github + npm install @cdktf/provider-null + + You can also build any module or provider locally. Learn more https://cdk.tf/modules-and-providers + +======================================================================================================== diff --git a/infra/jest.config.js b/infra/jest.config.js new file mode 100644 index 0000000000..a4052f1ab5 --- /dev/null +++ b/infra/jest.config.js @@ -0,0 +1,187 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +/* + * For a detailed explanation regarding each configuration property, visit: + * https://jestjs.io/docs/configuration + */ + +module.exports = { + + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + // bail: 0, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/private/var/folders/z_/v03l33d55fb57nrr3b1q03ch0000gq/T/jest_dz", + + // Automatically clear mock calls and instances between every test + clearMocks: true, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: undefined, + + // The directory where Jest should output its coverage files + // coverageDirectory: undefined, + + // An array of regexp pattern strings used to skip coverage collection + // coveragePathIgnorePatterns: [ + // "/node_modules/" + // ], + + // Indicates which provider should be used to instrument code for coverage + coverageProvider: "v8", + + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], + + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: undefined, + + // A path to a custom dependency extractor + // dependencyExtractor: undefined, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: undefined, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: undefined, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + moduleFileExtensions: ["ts", "js", "json", "node"], + + // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", + + // A preset that is used as a base for Jest's configuration + preset: "ts-jest", + + // Run tests from one or more projects + // projects: undefined, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state between every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: undefined, + + // Automatically restore mock state between every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + // rootDir: undefined, + + // A list of paths to directories that Jest should use to search for files in + // roots: [ + // "" + // ], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + // setupFiles: [], + + // A list of paths to modules that run some code to configure or set up the testing framework before each test + setupFilesAfterEnv: ["/setup.js"], + + // The number of seconds after which a test is considered as slow and reported as such in the results. + // slowTestThreshold: 5, + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + testEnvironment: "node", + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + testMatch: [ + "**/__tests__/**/*.ts", + "**/?(*.)+(spec|test).ts" + ], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + testPathIgnorePatterns: ["/node_modules/", ".d.ts", ".js"], + + // The regexp pattern or array of patterns that Jest uses to detect test files + // testRegex: [], + + // This option allows the use of a custom results processor + // testResultsProcessor: undefined, + + // This option allows use of a custom test runner + // testRunner: "jest-circus/runner", + + // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href + // testURL: "http://localhost", + + // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" + // timers: "real", + + // A map from regular expressions to paths to transformers + // transform: undefined, + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/", + // "\\.pnp\\.[^\\/]+$" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + // verbose: undefined, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +}; diff --git a/infra/main.ts b/infra/main.ts new file mode 100644 index 0000000000..cb1558c266 --- /dev/null +++ b/infra/main.ts @@ -0,0 +1,135 @@ +import * as path from 'path' +import { Construct } from 'constructs' +import { + App, + TerraformStack, + CloudBackend, + RemoteBackend, + NamedCloudWorkspace, + TerraformAsset, + AssetType, + TerraformOutput, +} from 'cdktf' + +import * as aws from '@cdktf/provider-aws' +import * as random from '@cdktf/provider-random' + +interface LambdaFunctionConfig { + path: string + handler: string + runtime: string + stageName: string + version: string +} + +const lambdaRolePolicy = { + Version: '2012-10-17', + Statement: [ + { + Action: 'sts:AssumeRole', + Principal: { + Service: 'lambda.amazonaws.com', + }, + Effect: 'Allow', + Sid: '', + }, + ], +} + +class LambdaStack extends TerraformStack { + constructor(scope: Construct, name: string, config: LambdaFunctionConfig) { + super(scope, name) + + new aws.provider.AwsProvider(this, 'AWS', { + region: 'eu-north-1', + }) + + // Create random value + const pet = new random.pet.Pet(this, 'random-name', { + length: 2, + }) + + // Create Lambda executable + const asset = new TerraformAsset(this, 'lambda-asset', { + path: path.resolve(__dirname, config.path), + type: AssetType.ARCHIVE, // if left empty it infers directory and file + }) + + // Create unique S3 bucket that hosts Lambda executable + const bucket = new aws.s3Bucket.S3Bucket(this, 'bucket', { + bucketPrefix: `learn-cdktf-${name}`, + }) + + // Upload Lambda zip file to newly created S3 bucket + const lambdaArchive = new aws.s3Object.S3Object(this, 'lambda-archive', { + bucket: bucket.bucket, + key: `${config.version}/${asset.fileName}`, + source: asset.path, // returns a posix path + }) + + // Create Lambda role + const role = new aws.iamRole.IamRole(this, 'lambda-exec', { + name: `learn-cdktf-${name}-${pet.id}`, + assumeRolePolicy: JSON.stringify(lambdaRolePolicy), + }) + + // Add execution role for lambda to write to CloudWatch logs + new aws.iamRolePolicyAttachment.IamRolePolicyAttachment(this, 'lambda-managed-policy', { + policyArn: 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole', + role: role.name, + }) + + // Create Lambda function + const lambdaFunc = new aws.lambdaFunction.LambdaFunction(this, 'learn-cdktf-lambda', { + functionName: `learn-cdktf-${name}-${pet.id}`, + s3Bucket: bucket.bucket, + s3Key: lambdaArchive.key, + handler: config.handler, + runtime: config.runtime, + role: role.arn, + }) + + // Create and configure API gateway + const api = new aws.apigatewayv2Api.Apigatewayv2Api(this, 'api-gw', { + name: name, + protocolType: 'HTTP', + target: lambdaFunc.arn, + }) + + new aws.lambdaPermission.LambdaPermission(this, 'apigw-lambda', { + functionName: lambdaFunc.functionName, + action: 'lambda:InvokeFunction', + principal: 'apigateway.amazonaws.com', + sourceArn: `${api.executionArn}/*/*`, + }) + + new TerraformOutput(this, 'url', { + value: api.apiEndpoint, + }) + } +} + +const app = new App() +const stack = new LambdaStack(app, 'lambda-hello-world', { + path: '../lambdas/dist/portfolio-overview', + handler: 'index.handler', + runtime: 'nodejs18.x', + stageName: 'hello-world', + version: 'v0.0.1', +}) + +// new CloudBackend(stack, { +// hostname: 'app.terraform.io', +// organization: 'Oazo', +// workspaces: new NamedCloudWorkspace('borrow-infra'), +// }) + +// new RemoteBackend(stack, { +// hostname: 'app.terraform.io', +// organization: 'Oazo', +// workspaces: { +// name: 'borrow-infra', +// }, +// }) + +app.synth() diff --git a/infra/package-lock.json b/infra/package-lock.json new file mode 100644 index 0000000000..62c8982766 --- /dev/null +++ b/infra/package-lock.json @@ -0,0 +1,4475 @@ +{ + "name": "infra", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "infra", + "version": "1.0.0", + "license": "MPL-2.0", + "dependencies": { + "@cdktf/provider-aws": "^18.0.3", + "@cdktf/provider-random": "^10.0.0", + "cdktf": "^0.19.0", + "constructs": "^10.3.0" + }, + "devDependencies": { + "@types/jest": "^29.5.7", + "@types/node": "^20.8.10", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "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/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "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==", + "dev": 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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "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==", + "dev": 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==", + "dev": 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==", + "dev": 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==", + "dev": 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==", + "dev": 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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.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==", + "dev": 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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cdktf/provider-aws": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@cdktf/provider-aws/-/provider-aws-18.0.3.tgz", + "integrity": "sha512-TvWZhPjq7ecLK1umlyPPCfazwqK3qeetYDVrdHJ7eMo3KRmjYEFZnZLtMFFYzhOyr3kmTHPUqbp6UWE41LD+jA==", + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "cdktf": "^0.19.0", + "constructs": "^10.0.0" + } + }, + "node_modules/@cdktf/provider-random": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@cdktf/provider-random/-/provider-random-10.0.0.tgz", + "integrity": "sha512-MTOq2+zvmNEbT0v1vpUfGHXxeL1Up7i8IkxjHuVeGPXpXJ+42WzASxTcaO6597IYwTnvpyv6gbTsPQMFHMex2A==", + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "cdktf": "^0.19.0", + "constructs": "^10.0.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "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/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "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==", + "dev": 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/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "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==", + "dev": 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.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", + "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", + "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.29", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", + "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", + "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + } + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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 + }, + "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" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "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" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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 + }, + "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" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001559", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", + "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", + "dev": true, + "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" + } + ] + }, + "node_modules/cdktf": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/cdktf/-/cdktf-0.19.0.tgz", + "integrity": "sha512-5tcNhvrvsE9WawC5cPwV7B9ATQ5lWNjyCJN7EnMofxTtkBEdnnGx0esC+vpNO4Fs0LhmV37qCUlm+K6anZaPYw==", + "bundleDependencies": [ + "archiver", + "json-stable-stringify", + "semver" + ], + "dependencies": { + "archiver": "5.3.1", + "json-stable-stringify": "^1.0.2", + "semver": "^7.5.3" + }, + "peerDependencies": { + "constructs": "^10.0.25" + } + }, + "node_modules/cdktf/node_modules/archiver": { + "version": "5.3.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cdktf/node_modules/archiver-utils": { + "version": "2.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cdktf/node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "inBundle": true, + "license": "MIT", + "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/cdktf/node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/cdktf/node_modules/async": { + "version": "3.2.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/bl": { + "version": "4.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/cdktf/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cdktf/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/cdktf/node_modules/buffer-crc32": { + "version": "0.2.13", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/cdktf/node_modules/compress-commons": { + "version": "4.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cdktf/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/core-util-is": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/crc-32": { + "version": "1.2.2", + "inBundle": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cdktf/node_modules/crc32-stream": { + "version": "4.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cdktf/node_modules/end-of-stream": { + "version": "1.4.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/cdktf/node_modules/fs-constants": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/fs.realpath": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/cdktf/node_modules/glob": { + "version": "7.2.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cdktf/node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/cdktf/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cdktf/node_modules/graceful-fs": { + "version": "4.2.10", + "inBundle": true, + "license": "ISC" + }, + "node_modules/cdktf/node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/cdktf/node_modules/inflight": { + "version": "1.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/cdktf/node_modules/inherits": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/cdktf/node_modules/isarray": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/json-stable-stringify": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonify": "^0.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cdktf/node_modules/jsonify": { + "version": "0.0.1", + "inBundle": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cdktf/node_modules/lazystream": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/cdktf/node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "inBundle": true, + "license": "MIT", + "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/cdktf/node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/cdktf/node_modules/lodash.defaults": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/lodash.difference": { + "version": "4.5.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/lodash.flatten": { + "version": "4.4.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/lodash.isplainobject": { + "version": "4.0.6", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/lodash.union": { + "version": "4.6.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cdktf/node_modules/minimatch": { + "version": "5.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cdktf/node_modules/normalize-path": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cdktf/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/cdktf/node_modules/path-is-absolute": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cdktf/node_modules/process-nextick-args": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/readable-stream": { + "version": "3.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cdktf/node_modules/readdir-glob": { + "version": "1.1.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/cdktf/node_modules/safe-buffer": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/semver": { + "version": "7.5.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cdktf/node_modules/string_decoder": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/cdktf/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/tar-stream": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cdktf/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdktf/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/cdktf/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/cdktf/node_modules/zip-stream": { + "version": "4.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "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/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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/constructs": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": 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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.571", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.571.tgz", + "integrity": "sha512-Sc+VtKwKCDj3f/kLBjdyjMpNzoZsU6WuL/wFb6EH8USmHEcebxRXcRrVpOpayxd52tuey4RUDpUsw5OS5LhJqg==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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 + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "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.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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 + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "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" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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 + }, + "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 + }, + "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==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "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==", + "dev": 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-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "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-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "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-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "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/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "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/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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 + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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 + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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 + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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 + }, + "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/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=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" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/p-locate/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/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "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/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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 + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "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/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": 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==", + "dev": 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", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "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" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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 + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/infra/package.json b/infra/package.json new file mode 100644 index 0000000000..df13d17da4 --- /dev/null +++ b/infra/package.json @@ -0,0 +1,38 @@ +{ + "name": "infra", + "version": "1.0.0", + "main": "main.js", + "types": "main.ts", + "license": "MPL-2.0", + "private": true, + "scripts": { + "get": "cdktf get", + "destroy": "cdktf destroy", + "deploy": "cdktf deploy", + "build": "tsc", + "synth": "cdktf synth", + "compile": "tsc --pretty", + "watch": "tsc -w", + "test": "jest", + "test:watch": "jest --watch", + "upgrade": "npm i cdktf@latest cdktf-cli@latest", + "upgrade:next": "npm i cdktf@next cdktf-cli@next" + }, + "engines": { + "node": ">=18.0" + }, + "dependencies": { + "@cdktf/provider-aws": "^18.0.3", + "@cdktf/provider-random": "^10.0.0", + "cdktf": "^0.19.0", + "constructs": "^10.3.0" + }, + "devDependencies": { + "@types/jest": "^29.5.7", + "@types/node": "^20.8.10", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} diff --git a/infra/readme.md b/infra/readme.md new file mode 100644 index 0000000000..8809feaf92 --- /dev/null +++ b/infra/readme.md @@ -0,0 +1,29 @@ +# Architecture + +Portfolio API + +```mermaid +sequenceDiagram + participant b as Browser + participant s as S3 + participant gc as Gateway Cache + participant g as REST Gateway + participant l as Lambda + participant d as Debank API + b ->> s: wallet address + s ->> gc: wallet address + alt cache hit + gc ->> gc: read cache + else cache miss + gc ->>+ g: wallet address + g ->>+l: lamda invoke + l ->>+ g: proxy req + g ->> d: proxy req + api key + d -->> g: proxy res + g -->>- l: proxy res + l -->>- g: lambda close + g -->>- gc: portfolio data + end + gc -->> s: portfolio data + s -->> b: portfolio data +``` diff --git a/infra/setup.js b/infra/setup.js new file mode 100644 index 0000000000..0b7e72f07b --- /dev/null +++ b/infra/setup.js @@ -0,0 +1,2 @@ +const cdktf = require("cdktf"); +cdktf.Testing.setupJest(); diff --git a/infra/tsconfig.json b/infra/tsconfig.json new file mode 100644 index 0000000000..27659f58b1 --- /dev/null +++ b/infra/tsconfig.json @@ -0,0 +1,35 @@ +{ + "compilerOptions": { + "alwaysStrict": true, + "declaration": true, + "experimentalDecorators": true, + "inlineSourceMap": true, + "inlineSources": true, + "lib": [ + "es2018" + ], + "module": "CommonJS", + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "strict": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, + "stripInternal": true, + "target": "ES2018", + "incremental": true, + "skipLibCheck": true + }, + "include": [ + "**/*.ts" + ], + "exclude": [ + "node_modules", + "cdktf.out" + ] +} \ No newline at end of file diff --git a/lambdas/README.md b/lambdas/README.md new file mode 100644 index 0000000000..64b0221f9b --- /dev/null +++ b/lambdas/README.md @@ -0,0 +1,7 @@ +# Lambdas + +## Build from sources + +Run `yarn build` +Build artifacts will be located in the artifacts folder, as zip files. +Each zip is corresponding to each lambda function. diff --git a/lambdas/package-lock.json b/lambdas/package-lock.json new file mode 100644 index 0000000000..b7a94b63e0 --- /dev/null +++ b/lambdas/package-lock.json @@ -0,0 +1,523 @@ +{ + "name": "lambdas", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lambdas", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "renamer": "^4.0.0", + "typescript": "^5.2.2" + }, + "devDependencies": { + "@types/aws-lambda": "^8.10.76" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.125", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.125.tgz", + "integrity": "sha512-Vqw/WMlV4O1fJT6capim01v7VLDZkcX1n6Yhb52E7IfnMqYbNfwHfyDV8rRN42NLBtdDvfaqcCqs2K0fr5ljZw==", + "dev": true + }, + "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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "engines": { + "node": ">=12.17" + } + }, + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==" + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-args/node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/command-line-args/node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/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==" + }, + "node_modules/command-line-usage/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/current-module-paths": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/current-module-paths/-/current-module-paths-1.1.1.tgz", + "integrity": "sha512-8Ga5T8oMXBaSsHq9Gj+bddX7kHSaJKsl2vaAd3ep51eQLkr4W18eFEmEZM5bLo1zrz8tt3jE1U8QK9QGhaLR4g==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" + }, + "node_modules/file-set": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/file-set/-/file-set-5.1.3.tgz", + "integrity": "sha512-mQ6dqz+z59on3B50IGF3ujNGbZmY1TAeLHpNfhLEeNM6Lky31w3RUlbCyqZWQs0DuZJQU4R2qDuVd9ojyzadcg==", + "dependencies": { + "array-back": "^6.2.2", + "glob": "^7.2.0" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-replace/node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "engines": { + "node": ">=6" + } + }, + "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/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/load-module": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/load-module/-/load-module-4.2.1.tgz", + "integrity": "sha512-Sbfg6R4LjvyThJpqUoADHMjyoI2+cL4msbCQeZ9kkY/CqP/TT2938eftKm7x4I2gd4/A+DEe6nePkbfWYbXwSw==", + "dependencies": { + "array-back": "^6.2.0" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/printj": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.1.tgz", + "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/renamer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/renamer/-/renamer-4.0.0.tgz", + "integrity": "sha512-yurufcXxbJfFBVAUoByNyDVH811zTZ/MrKo6gUH8pHGeAmdK7J5egj2lSNe57HuVIvnVzSalzeVGu8pi8UHGxg==", + "dependencies": { + "array-back": "^6.2.0", + "chalk": "^4.1.2", + "command-line-args": "^5.2.0", + "command-line-usage": "^6.1.1", + "current-module-paths": "^1.1.0", + "fast-diff": "^1.2.0", + "file-set": "^5.1.2", + "global-dirs": "^3.0.0", + "load-module": "^4.2.1", + "printj": "^1.3.0", + "stream-read-all": "^3.0.1", + "typical": "^7.1.1" + }, + "bin": { + "renamer": "bin/cli.js" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/stream-read-all": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", + "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", + "engines": { + "node": ">=10" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=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==" + } + } +} diff --git a/lambdas/package.json b/lambdas/package.json new file mode 100644 index 0000000000..81e95b3b29 --- /dev/null +++ b/lambdas/package.json @@ -0,0 +1,21 @@ +{ + "name": "lambdas", + "version": "1.0.0", + "scripts": { + "tsc": "tsc", + "watch": "tsc -w", + "test": "echo \"Error: no test specified\" && exit 1", + "zip-assets": "zip -r artifacts/portfolio-assets.zip dist/common dist/portfolio-assets", + "zip-overview": "zip -r artifacts/portfolio-overview.zip dist/common dist/portfolio-overview", + "zip-positions": "zip -r artifacts/portfolio-positions.zip dist/common dist/portfolio-positions", + "build": "npm run tsc && mkdir -p artifacts && npm run zip-assets && npm run zip-overview && npm run zip-positions" + }, + "author": "Piter", + "license": "ISC", + "devDependencies": { + "@types/aws-lambda": "^8.10.76" + }, + "dependencies": { + "typescript": "^5.2.2" + } +} diff --git a/lambdas/src/common/constants.ts b/lambdas/src/common/constants.ts new file mode 100644 index 0000000000..9a29ec79f2 --- /dev/null +++ b/lambdas/src/common/constants.ts @@ -0,0 +1 @@ +export const SUPPORTED_CHAIN_IDS = ['eth', 'op', 'arb', 'base'] diff --git a/lambdas/src/common/debank.ts b/lambdas/src/common/debank.ts new file mode 100644 index 0000000000..09b2f19c83 --- /dev/null +++ b/lambdas/src/common/debank.ts @@ -0,0 +1,55 @@ +import { NetworkNames } from './domain' + +export type ProtocolAsset = { + id: string + chain: string + name: string + site_url: string + logo_url: string + has_supported_portfolio: boolean + tvl: number + net_usd_value: number + asset_usd_value: number + debt_usd_value: number +} + +export type WalletAsset = { + usd_value: number +} + +export type DebankToken = { + id: string + chain: string + name: string + symbol: string + display_symbol: string + optimized_symbol: string + decimals: number + logo_url: string + protocol_id: string + price: number + price_24h_change: number + is_verified: boolean + is_core: boolean + is_wallet: boolean + time_at: number + amount: number + raw_amount: number + raw_amount_hex_str: string +} + +export enum DebankNetworkNames { + ethereumMainnet = 'eth', + arbitrumMainnet = 'arb', + polygonMainnet = 'matic', + optimismMainnet = 'op', + baseMainnet = 'base', +} + +export const DebankNetworkNameToOurs = { + [DebankNetworkNames.ethereumMainnet]: NetworkNames.ethereumMainnet, + [DebankNetworkNames.arbitrumMainnet]: NetworkNames.arbitrumMainnet, + [DebankNetworkNames.polygonMainnet]: NetworkNames.polygonMainnet, + [DebankNetworkNames.optimismMainnet]: NetworkNames.optimismMainnet, + [DebankNetworkNames.baseMainnet]: NetworkNames.baseMainnet, +} diff --git a/lambdas/src/common/domain.ts b/lambdas/src/common/domain.ts new file mode 100644 index 0000000000..3776cea21b --- /dev/null +++ b/lambdas/src/common/domain.ts @@ -0,0 +1,21 @@ +export enum NetworkNames { + ethereumMainnet = 'ethereum', + ethereumGoerli = 'ethereum_goerli', + arbitrumMainnet = 'arbitrum', + arbitrumGoerli = 'arbitrum_goerli', + polygonMainnet = 'polygon', + polygonMumbai = 'polygon_mumbai', + optimismMainnet = 'optimism', + optimismGoerli = 'optimism_goerli', + baseMainnet = 'base', + baseGoerli = 'base_goerli', +} + +export enum LendingProtocol { + AaveV2 = 'aavev2', + AaveV3 = 'aavev3', + Ajna = 'ajna', + Maker = 'maker', + MorphoBlue = 'morphoblue', + SparkV3 = 'sparkv3', +} diff --git a/lambdas/src/common/errors.ts b/lambdas/src/common/errors.ts new file mode 100644 index 0000000000..0deeacf6f7 --- /dev/null +++ b/lambdas/src/common/errors.ts @@ -0,0 +1,7 @@ +export const parseCatchedError = (error: unknown): string => { + if (error instanceof Error) { + return error.message + } + + return 'Unknown error' +} diff --git a/lambdas/src/common/guards.ts b/lambdas/src/common/guards.ts new file mode 100644 index 0000000000..a3aad78aee --- /dev/null +++ b/lambdas/src/common/guards.ts @@ -0,0 +1,7 @@ +export const isValidAddress = (address: unknown): address is string => { + if (typeof address !== 'string' || !!RegExp(/^0x[a-fA-F0-9]{40}$/).exec(address)) { + return false + } + + return true +} diff --git a/lambdas/src/common/helpers.ts b/lambdas/src/common/helpers.ts new file mode 100644 index 0000000000..53f64d1270 --- /dev/null +++ b/lambdas/src/common/helpers.ts @@ -0,0 +1,6 @@ +export const getDefaultErrorMessage = (error: any): string => { + if (error && 'message' in error && typeof error.message === 'string') { + return error.message + } + return "Couldn't get error message" +} diff --git a/lambdas/src/common/responses.ts b/lambdas/src/common/responses.ts new file mode 100644 index 0000000000..111f4f711f --- /dev/null +++ b/lambdas/src/common/responses.ts @@ -0,0 +1,48 @@ +import type { APIGatewayProxyResultV2 } from 'aws-lambda' + +import type { DefaultErrorResponse } from './types' + +export function createOkBody(obj: Record): string { + return JSON.stringify(obj) +} + +export function createErrorBody(message: string): string { + const errorObject: DefaultErrorResponse = { message } + return JSON.stringify(errorObject) +} + +export function createHeaders(): Record { + return { + 'Access-Control-Allow-Origin': '*', + } +} + +export function ResponseOk>({ + body, +}: { + body: T +}): APIGatewayProxyResultV2 { + return { + statusCode: 200, + headers: createHeaders(), + body: createOkBody(body), + } +} + +export function ResponseBadRequest(message: string): APIGatewayProxyResultV2 { + return { + statusCode: 400, + headers: createHeaders(), + body: createErrorBody(message), + } +} + +export function ResponseInternalServerError( + message: string = 'Internal server error', +): APIGatewayProxyResultV2 { + return { + statusCode: 500, + headers: createHeaders(), + body: createErrorBody(message), + } +} diff --git a/lambdas/src/common/types.ts b/lambdas/src/common/types.ts new file mode 100644 index 0000000000..2181b77b1a --- /dev/null +++ b/lambdas/src/common/types.ts @@ -0,0 +1,3 @@ +export type DefaultErrorResponse = { + message: string +} diff --git a/lambdas/src/common/validators.ts b/lambdas/src/common/validators.ts new file mode 100644 index 0000000000..d1ff99d0cc --- /dev/null +++ b/lambdas/src/common/validators.ts @@ -0,0 +1,21 @@ +import type { APIGatewayProxyEventV2 } from 'aws-lambda' + +import { isValidAddress } from './guards' + +export const getAddressFromRequest = (event: APIGatewayProxyEventV2): string => { + const query = event.queryStringParameters + if (query == null) { + throw Error('Missing query string') + } + + const { address } = query + + if (!address) { + throw Error('Missing address') + } + if (isValidAddress(address)) { + throw Error('Invalid address') + } + + return address +} diff --git a/lambdas/src/portfolio-assets/index.ts b/lambdas/src/portfolio-assets/index.ts new file mode 100644 index 0000000000..3d6b653083 --- /dev/null +++ b/lambdas/src/portfolio-assets/index.ts @@ -0,0 +1,66 @@ +/* eslint-disable no-relative-import-paths/no-relative-import-paths */ +import type { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from 'aws-lambda' + +import { getDefaultErrorMessage } from '../common/helpers' +import { ResponseBadRequest, ResponseOk } from '../common/responses' +import { getAddressFromRequest } from '../common/validators' +import { PortfolioAssetsResponse, PortfolioAsset } from './types' +import { DebankNetworkNameToOurs, DebankNetworkNames, DebankToken } from '../common/debank' +import { NetworkNames } from '../common/domain' + +const { + DEBANK_API_KEY: debankApiKey, + DEBANK_API_URL: serviceUrl = 'https://pro-openapi.debank.com/v1', +} = process.env +if (!debankApiKey) { + throw new Error('Missing DEBANK_API_KEY') +} +const debankAuthHeaderKey = 'AccessKey' +const headers = { [debankAuthHeaderKey]: debankApiKey } + +export const handler = async (event: APIGatewayProxyEventV2): Promise => { + // validate the query + let address: string | undefined + + try { + address = getAddressFromRequest(event) + } catch (error) { + const message = getDefaultErrorMessage(error) + return ResponseBadRequest(message) + } + + const reqUrl = new URL(`${serviceUrl}/user/all_token_list?id=${address}`) + const response: DebankToken[] = await fetch(reqUrl.toString(), { + headers, + }) + .then((res) => res.json()) + .catch((error) => { + console.error(error) + throw new Error('Failed to fetch wallet assets') + }) + + const tokensData = response + const preparedTokenData = tokensData + .filter(({ chain, is_wallet }) => is_wallet && chain !== undefined) + .map( + (token): PortfolioAsset => ({ + name: token.name, + symbol: token.symbol, + network: DebankNetworkNameToOurs[token.chain as DebankNetworkNames], + priceUSD: token.price, + price24hChange: token.price_24h_change, + balance: token.amount, + balanceUSD: token.amount * token.price, + }), + ) + .filter(({ network }) => Object.values(NetworkNames).includes(network)) + .sort((a, b) => b.balanceUSD - a.balanceUSD) + + const walletAssetsResponse: PortfolioAssetsResponse = { + assets: preparedTokenData, + } + + return ResponseOk({ body: walletAssetsResponse }) +} + +export default handler diff --git a/lambdas/src/portfolio-assets/types.ts b/lambdas/src/portfolio-assets/types.ts new file mode 100644 index 0000000000..190f925119 --- /dev/null +++ b/lambdas/src/portfolio-assets/types.ts @@ -0,0 +1,15 @@ +import { NetworkNames } from '../common/domain' + +export type PortfolioAsset = { + name: string + network: NetworkNames + symbol: string + priceUSD: number + price24hChange?: number + balance: number + balanceUSD: number +} + +export type PortfolioAssetsResponse = { + assets: PortfolioAsset[] +} diff --git a/lambdas/src/portfolio-overview/index.ts b/lambdas/src/portfolio-overview/index.ts new file mode 100644 index 0000000000..cc53a0a8db --- /dev/null +++ b/lambdas/src/portfolio-overview/index.ts @@ -0,0 +1,113 @@ +/* eslint-disable no-relative-import-paths/no-relative-import-paths */ +import type { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from 'aws-lambda' + +import { getDefaultErrorMessage } from '../common/helpers' +import { ResponseBadRequest, ResponseInternalServerError, ResponseOk } from '../common/responses' +import { getAddressFromRequest } from '../common/validators' +import type { PortfolioOverviewResponse } from './types' +import { ProtocolAsset, WalletAsset } from '../common/debank' + +const SUPPORTED_CHAIN_IDS = ['eth', 'op', 'arb', 'base'] + +const { + DEBANK_API_KEY: debankApiKey, + DEBANK_API_URL: serviceUrl = 'https://pro-openapi.debank.com/v1', +} = process.env +if (!debankApiKey) { + throw new Error('Missing DEBANK_API_KEY') +} +const debankAuthHeaderKey = 'AccessKey' +const headers = { [debankAuthHeaderKey]: debankApiKey } + +export const handler = async (event: APIGatewayProxyEventV2): Promise => { + // validate the query + let address: string | undefined + + try { + address = getAddressFromRequest(event) + } catch (error) { + const message = getDefaultErrorMessage(error) + return ResponseBadRequest(message) + } + + try { + // fetch for wallet assets on supported chains + const walletBalanceUsdValue: number | undefined = await getWalletAssetsUsdValue( + address, + headers, + ) + + // fetch for supported protocol assets on supported chains + const protocolAssets: ProtocolAsset[] | undefined = await getProtocolAssets(address, headers) + + const suppliedUsdValue: number = protocolAssets.reduce( + (acc, { net_usd_value }) => acc + net_usd_value, + 0, + ) + + const borrowedUsdValue: number = protocolAssets.reduce( + (acc, { debt_usd_value }) => acc + debt_usd_value, + 0, + ) + + const assetUsdValue: number = protocolAssets.reduce( + (acc, { asset_usd_value }) => acc + asset_usd_value, + 0, + ) + + const body: PortfolioOverviewResponse = { + walletBalanceUsdValue, + suppliedUsdValue, + suppliedPercentageChange: 0, + borrowedUsdValue, + borrowedPercentageChange: 0, + totalUsdValue: assetUsdValue, + totalPercentageChange: 0, + // protocolAssets, + } + return ResponseOk({ body }) + } catch (error) { + console.error(error) + return ResponseInternalServerError() + } +} + +const getWalletAssetsUsdValue = async ( + address: string, + headers: Record, +): Promise => { + const results = await Promise.all( + SUPPORTED_CHAIN_IDS.map((chainId) => + fetch(`${serviceUrl}/user/chain_balance?id=${address}&chain_id=${chainId}`, { + headers, + }).then((_res) => _res.json() as Promise), + ), + ).catch((error) => { + console.error(error) + throw new Error('Failed to fetch wallet assets') + }) + + const walletAssetsUsdValue = results.reduce((acc, cur) => { + acc = acc + cur.usd_value + return acc + }, 0) + return walletAssetsUsdValue +} + +const getProtocolAssets = async ( + address: string, + headers: Record, +): Promise => { + const protocolAssets = await fetch( + `${serviceUrl}/user/all_simple_protocol_list?id=${address}&chain_ids=${SUPPORTED_CHAIN_IDS.toString()}`, + { headers }, + ) + .then((_res) => _res.json() as Promise) + .catch((error) => { + console.error(error) + throw new Error('Failed to fetch wallet assets') + }) + return protocolAssets +} + +export default handler diff --git a/lambdas/src/portfolio-overview/types.ts b/lambdas/src/portfolio-overview/types.ts new file mode 100644 index 0000000000..3a0da699fe --- /dev/null +++ b/lambdas/src/portfolio-overview/types.ts @@ -0,0 +1,9 @@ +export type PortfolioOverviewResponse = { + walletBalanceUsdValue: number + suppliedUsdValue: number + suppliedPercentageChange: number + borrowedUsdValue: number + borrowedPercentageChange: number + totalUsdValue: number + totalPercentageChange: number +} diff --git a/lambdas/src/portfolio-positions/index.ts b/lambdas/src/portfolio-positions/index.ts new file mode 100644 index 0000000000..8ebdd7ac77 --- /dev/null +++ b/lambdas/src/portfolio-positions/index.ts @@ -0,0 +1,24 @@ +/* eslint-disable no-relative-import-paths/no-relative-import-paths */ +import type { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from 'aws-lambda' + +import { getDefaultErrorMessage } from '../common/helpers' +import { ResponseBadRequest, ResponseOk } from '../common/responses' +import { getAddressFromRequest } from '../common/validators' +import { mockPositionsResponse } from './mock' + +export const handler = async (event: APIGatewayProxyEventV2): Promise => { + // validate the query + let address: string | undefined + + try { + address = getAddressFromRequest(event) + address + } catch (error) { + const message = getDefaultErrorMessage(error) + return ResponseBadRequest(message) + } + + return ResponseOk({ body: mockPositionsResponse.response }) +} + +export default handler diff --git a/lambdas/src/portfolio-positions/mock.ts b/lambdas/src/portfolio-positions/mock.ts new file mode 100644 index 0000000000..15c4f98236 --- /dev/null +++ b/lambdas/src/portfolio-positions/mock.ts @@ -0,0 +1,324 @@ +import { LendingProtocol, NetworkNames } from '../common/domain' +import { PortfolioPositionsResponse, ProductType, StrategyType } from './types' + +export const mockPositionsResponse: { + status: number + response: PortfolioPositionsResponse +} = { + status: 200, + response: { + positions: [ + { + positionId: 2137, + type: ProductType.Multiply, + network: NetworkNames.ethereumMainnet, + protocol: LendingProtocol.Maker, + strategyType: StrategyType.Short, + openDate: 1697124880, + tokens: { + supply: { + symbol: 'ETH', + amount: 1, + amountUSD: 1816.33, + }, + borrow: { + symbol: 'DAI', + amount: 1000, + amountUSD: 1000, + }, + }, + details: [ + { + type: 'netValue', + value: '1.32M', + }, + { + type: 'pnl', + value: '2.32%', + accent: 'positive', + }, + { + type: 'liquidationPrice', + value: '$1,234', + subvalue: 'Now: $1,420', + }, + { + type: 'ltv', + value: '72%', + subvalue: 'Max 76%', + }, + { + type: 'multiple', + value: '4x', + subvalue: 'Max 5.1x', + }, + ], + automations: { + stopLoss: { + enabled: true, + price: 0.8, + }, + autoBuy: { + enabled: true, + price: 1450, + }, + autoSell: { + enabled: true, + price: 2100, + }, + takeProfit: { + enabled: false, + }, + }, + }, + { + positionId: 12, + type: ProductType.Borrow, + network: NetworkNames.ethereumMainnet, + protocol: LendingProtocol.AaveV3, + strategyType: StrategyType.Short, + openDate: 1696174480, + tokens: { + supply: { + symbol: 'DAI', + amount: 390100, + amountUSD: 390100, + }, + borrow: { + symbol: 'WBTC', + amount: 1, + amountUSD: 34642.8, + }, + }, + details: [ + { + type: 'collateralLocked', + value: '423M', + }, + { + type: 'totalDebt', + value: '32.2M', + }, + { + type: 'liquidationPrice', + value: '$453', + subvalue: 'Now: $953.26', + }, + { + type: 'ltv', + value: '72%', + subvalue: 'Max 76%', + }, + { + type: 'multiple', + value: '4x', + subvalue: 'Max 5.1x', + }, + ], + automations: { + stopLoss: { + enabled: false, + }, + }, + }, + { + positionId: 333, + type: ProductType.Earn, + network: NetworkNames.ethereumMainnet, + protocol: LendingProtocol.Ajna, + strategyType: StrategyType.Long, + lendingType: 'active', + openDate: 1692174480, + tokens: { + supply: { + symbol: 'ETH', + amount: 50, + amountUSD: 390100, + }, + borrow: { + symbol: 'DAI', + amount: 1, + amountUSD: 89967, + }, + }, + details: [ + { + type: 'netValue', + value: '232,345 DAI', + }, + { + type: 'lendingRange', + value: 'active', + }, + { + type: 'earnings', + value: '232,345 DAI', + }, + { + type: 'apy', + value: '8.3%', + }, + { + type: '90dApy', + value: '4.15%', + }, + ], + automations: {}, + }, + { + positionId: 434, + type: ProductType.Earn, + network: NetworkNames.ethereumMainnet, + protocol: LendingProtocol.Maker, + lendingType: 'passive', + openDate: 1697574480, + tokens: { + supply: { + symbol: 'DAI', + amount: 232123, + amountUSD: 232123, + }, + }, + details: [ + { + type: 'netValue', + value: '232,345 DAI', + }, + { + type: 'earnings', + value: '232,345 DAI', + }, + { + type: 'apy', + value: '8.3%', + subvalue: '90d: Avg 4.15%', + }, + ], + automations: {}, + }, + { + positionId: 6254, + type: ProductType.Earn, + network: NetworkNames.ethereumMainnet, + protocol: LendingProtocol.Ajna, + lendingType: 'loop', + openDate: 1698514480, + tokens: { + supply: { + symbol: 'DAI', + amount: 232123, + amountUSD: 232123, + }, + }, + details: [ + { + type: 'netValue', + value: '232,345 DAI', + }, + { + type: 'earnings', + value: '232,345 DAI', + }, + { + type: 'apy', + value: '8.3%', + subvalue: '90d: Avg 4.15%', + }, + { + type: 'ltv', + value: '72%', + subvalue: '76%', + }, + ], + automations: {}, + }, + { + positionId: 123123, + type: ProductType.Earn, + network: NetworkNames.ethereumMainnet, + protocol: LendingProtocol.Ajna, + lendingType: 'loop', + openDate: 1678414480, + tokens: { + supply: { + symbol: 'DAI', + amount: 0, + amountUSD: 0, + }, + }, + details: [ + { + type: 'netValue', + value: '0 DAI', + }, + { + type: 'earnings', + value: '1,4 DAI', + }, + { + type: 'apy', + value: '8.3%', + subvalue: '90d: Avg 4.15%', + }, + { + type: 'ltv', + value: '72%', + subvalue: '76%', + }, + ], + automations: {}, + }, + { + positionId: 6543, + network: NetworkNames.ethereumMainnet, + protocol: LendingProtocol.AaveV3, + openDate: 1698514480, + availableToMigrate: true, + tokens: { + supply: { + symbol: 'DAI', + amount: 232123, + amountUSD: 232123, + }, + borrow: { + symbol: 'ETH', + amount: 232123, + amountUSD: 232123, + }, + }, + details: [ + { + type: 'suppliedToken', + value: 'DAI', + }, + { + type: 'suppliedTokenBalance', + value: '1.1M', + }, + { + type: 'borrowedToken', + value: 'ETH', + }, + { + type: 'borrowedTokenBalance', + value: '150', + }, + ], + automations: { + autoBuy: { + enabled: false, + }, + autoSell: { + enabled: false, + }, + takeProfit: { + enabled: false, + }, + stopLoss: { + enabled: false, + }, + }, + }, + ], + }, +} diff --git a/lambdas/src/portfolio-positions/types.ts b/lambdas/src/portfolio-positions/types.ts new file mode 100644 index 0000000000..bdb7905936 --- /dev/null +++ b/lambdas/src/portfolio-positions/types.ts @@ -0,0 +1,77 @@ +import { LendingProtocol, NetworkNames } from '../common/domain' + +export enum ProductType { + 'Multiply' = 'Multiply', + 'Earn' = 'Earn', + 'Borrow' = 'Borrow', +} + +export enum StrategyType { + Short = 'short', + Long = 'long', +} + +type AutomationType = { + enabled: boolean + price?: number +} + +export type DetailsType = + | 'netValue' + | 'netValueEarnActivePassive' + | 'pnl' + | 'liquidationPrice' + | 'ltv' + | 'multiple' + | 'collateralLocked' + | 'totalDebt' + | 'borrowRate' + | 'lendingRange' + | 'earnings' + | 'apy' + | '90dApy' + | 'suppliedToken' + | 'suppliedTokenBalance' + | 'borrowedToken' + | 'borrowedTokenBalance' + +export type PositionDetail = { + type: DetailsType + value: string + accent?: 'positive' | 'negative' + subvalue?: string +} + +export type PortfolioPosition = { + positionId: number + type?: ProductType + network: NetworkNames + protocol: LendingProtocol + strategyType?: StrategyType + lendingType?: 'active' | 'passive' | 'loop' | 'staking' | 'pool' // are these all types? + openDate: number // epoch based on block height timestamp + availableToMigrate?: boolean + tokens: { + supply: { + symbol: string + amount: number + amountUSD: number + } + borrow?: { + symbol: string + amount: number + amountUSD: number + } + } + details: PositionDetail[] + automations: { + stopLoss?: AutomationType + takeProfit?: AutomationType + autoBuy?: AutomationType + autoSell?: AutomationType + } +} + +export type PortfolioPositionsResponse = { + positions: PortfolioPosition[] +} diff --git a/lambdas/tsconfig.json b/lambdas/tsconfig.json new file mode 100644 index 0000000000..58bae8361b --- /dev/null +++ b/lambdas/tsconfig.json @@ -0,0 +1,67 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ES2022" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */, + "module": "CommonJS" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "lib": ["ES2022"] /* Specify library files to be included in the compilation. */, + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ + "declaration": false /* Generates corresponding '.d.ts' file. */, + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./dist/index.mjs" /* Concatenate and emit output to single file. */, + "outDir": "./dist" /* Redirect output structure to the directory. */, + "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + /* Advanced Options */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "**/*.spec.ts"] +} diff --git a/lambdas/yarn.lock b/lambdas/yarn.lock new file mode 100644 index 0000000000..8572691d2f --- /dev/null +++ b/lambdas/yarn.lock @@ -0,0 +1,13 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/aws-lambda@^8.10.76": + version "8.10.125" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.125.tgz#c2ba86f7d98fe1827a7b048e0d31a65a8b5aed8c" + integrity sha512-Vqw/WMlV4O1fJT6capim01v7VLDZkcX1n6Yhb52E7IfnMqYbNfwHfyDV8rRN42NLBtdDvfaqcCqs2K0fr5ljZw== + +typescript@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== diff --git a/package.json b/package.json index ff52249371..13721d4773 100644 --- a/package.json +++ b/package.json @@ -28,10 +28,11 @@ "typechain:generate": "yarn typechain:generate:web3 && yarn typechain:generate:ethers", "typechain:generate:web3": "typechain --target=web3-v1 'blockchain/abi/*.json'", "typechain:generate:ethers": "typechain --target=ethers-v5 'blockchain/abi/*.json'", - "postinstall": "rm -f node_modules/web3/index.d.ts && yarn prisma:generate && yarn typechain:generate && yarn xstate:typegen && yarn get-config-types", + "postinstall": "rm -f node_modules/web3/index.d.ts && yarn prisma:generate && yarn typechain:generate && yarn xstate:typegen && yarn get-config-types && yarn lambdas-dependencies", "xstate:typegen": "xstate typegen \"@(features|pages|components|utils)/**/*.ts?(x)\" ", "xstate:typegen:watch": "xstate typegen \"@(features|pages|components|utils)/**/*.ts?(x)\" --watch", - "update-product-hub": "npx ts-node scripts/update-product-hub.ts" + "update-product-hub": "npx ts-node scripts/update-product-hub.ts", + "lambdas-dependencies": "cd lambdas && yarn && cd .." }, "dependencies": { "@babel/runtime": "^7.21.0", @@ -166,22 +167,22 @@ "@types/react-text-mask": "^5.4.0", "@types/snowflake-sdk": "^1.6.7", "@types/socket.io-client": "^3.0.0", - "@typescript-eslint/eslint-plugin": "^5.51.0", - "@typescript-eslint/parser": "^5.51.0", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", "@xstate/cli": "^0.5.1", "@xstate/inspect": "^0.8.0", "@xstate/test": "^0.5.1", "circular-dependency-plugin": "^5.2.2", "eslint": "^7.10.0", "eslint-config-typestrict": "^1.0.0", - "eslint-plugin-deprecation": "^1.3.3", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-no-only-tests": "^2.4.0", - "eslint-plugin-react": "^7.22.0", + "eslint-plugin-deprecation": "^2.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-no-only-tests": "^3.1.0", + "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-simple-import-sort": "^5.0.2", - "eslint-plugin-sonarjs": "^0.5.0", - "eslint-plugin-unused-imports": "^0.1.2", + "eslint-plugin-simple-import-sort": "^10.0.0", + "eslint-plugin-sonarjs": "^0.23.0", + "eslint-plugin-unused-imports": "^3.0.0", "ethereum-types": "^3.3.3", "ethers": "5.7.0", "i18next-hmr": "^3.0.3", diff --git a/pages/[networkOrProduct]/aave/[version]/[...strategy].tsx b/pages/[networkOrProduct]/aave/[version]/[...strategy].tsx index 37b62eaefd..0425ea586c 100644 --- a/pages/[networkOrProduct]/aave/[version]/[...strategy].tsx +++ b/pages/[networkOrProduct]/aave/[version]/[...strategy].tsx @@ -13,8 +13,8 @@ import { WithTermsOfService } from 'features/termsOfService/TermsOfService' import { INTERNAL_LINKS } from 'helpers/applicationLinks' import type { LendingProtocol } from 'lendingProtocols' import type { GetServerSidePropsContext } from 'next' -import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import { useRouter } from 'next/router' +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import React from 'react' import { BackgroundLight } from 'theme/BackgroundLight' diff --git a/pages/[networkOrProduct]/aave/[version]/[vault].tsx b/pages/[networkOrProduct]/aave/[version]/[vault].tsx index 29d76527c0..57015ab341 100644 --- a/pages/[networkOrProduct]/aave/[version]/[vault].tsx +++ b/pages/[networkOrProduct]/aave/[version]/[vault].tsx @@ -20,12 +20,12 @@ import { useObservable } from 'helpers/observableHook' import type { AaveLendingProtocol } from 'lendingProtocols' import { checkIfAave } from 'lendingProtocols' import type { GetServerSidePropsContext } from 'next' +import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' -import { useRouter } from 'next/router' import React from 'react' -import { Grid } from 'theme-ui' import { BackgroundLight } from 'theme/BackgroundLight' +import { Grid } from 'theme-ui' export async function getServerSideProps(ctx: GetServerSidePropsContext) { const networkOrProduct = ctx.query.networkOrProduct as string diff --git a/pages/[networkOrProduct]/spark/[version]/[...strategy].tsx b/pages/[networkOrProduct]/spark/[version]/[...strategy].tsx index 5dcb1642ff..a9ebc662f6 100644 --- a/pages/[networkOrProduct]/spark/[version]/[...strategy].tsx +++ b/pages/[networkOrProduct]/spark/[version]/[...strategy].tsx @@ -13,8 +13,8 @@ import { WithTermsOfService } from 'features/termsOfService/TermsOfService' import { INTERNAL_LINKS } from 'helpers/applicationLinks' import type { LendingProtocol } from 'lendingProtocols' import type { GetServerSidePropsContext } from 'next' -import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import { useRouter } from 'next/router' +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import React from 'react' import { BackgroundLight } from 'theme/BackgroundLight' diff --git a/pages/[networkOrProduct]/spark/[version]/[vault].tsx b/pages/[networkOrProduct]/spark/[version]/[vault].tsx index 2a1545e36c..f12f4009c1 100644 --- a/pages/[networkOrProduct]/spark/[version]/[vault].tsx +++ b/pages/[networkOrProduct]/spark/[version]/[vault].tsx @@ -20,12 +20,12 @@ import { useObservable } from 'helpers/observableHook' import type { SparkLendingProtocol } from 'lendingProtocols' import { checkIfSpark } from 'lendingProtocols' import type { GetServerSidePropsContext } from 'next' +import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' -import { useRouter } from 'next/router' import React from 'react' -import { Grid } from 'theme-ui' import { BackgroundLight } from 'theme/BackgroundLight' +import { Grid } from 'theme-ui' export async function getServerSideProps(ctx: GetServerSidePropsContext) { const networkOrProduct = ctx.query.networkOrProduct as string diff --git a/pages/_app.tsx b/pages/_app.tsx index ba92208a6e..9164ad1aac 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -27,16 +27,16 @@ import { Web3OnBoardConnectorProvider } from 'features/web3OnBoard/web3-on-board import { INTERNAL_LINKS } from 'helpers/applicationLinks' import { ModalProvider } from 'helpers/modalHook' import { useLocalStorage } from 'helpers/useLocalStorage' -import { appWithTranslation } from 'next-i18next' -import nextI18NextConfig from 'next-i18next.config.js' import type { AppProps } from 'next/app' import Head from 'next/head' import { useRouter } from 'next/router' import Script from 'next/script' +import { appWithTranslation } from 'next-i18next' +import nextI18NextConfig from 'next-i18next.config.js' import React, { useEffect, useRef } from 'react' import { theme } from 'theme' -import { ThemeUIProvider } from 'theme-ui' import { web3OnboardStyles } from 'theme/web3OnboardStyles' +import { ThemeUIProvider } from 'theme-ui' import Web3 from 'web3' function getLibrary(provider: any, connector: AbstractConnector | undefined): Web3 { diff --git a/pages/about.tsx b/pages/about.tsx index 03367344b1..a4a0b4492a 100644 --- a/pages/about.tsx +++ b/pages/about.tsx @@ -11,8 +11,8 @@ import { sortBy } from 'lodash' import { useTranslation } from 'next-i18next' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import React from 'react' -import { Box, Grid, Heading, Image, Text } from 'theme-ui' import { arrow_right } from 'theme/icons' +import { Box, Grid, Heading, Image, Text } from 'theme-ui' function AboutPage({ members }: { members: TeamMember[] }) { const { t } = useTranslation() diff --git a/pages/api/rpcGateway.tsx b/pages/api/rpcGateway.tsx index 17f0a14dcc..e9514cb500 100644 --- a/pages/api/rpcGateway.tsx +++ b/pages/api/rpcGateway.tsx @@ -1,6 +1,6 @@ import { NetworkNames } from 'blockchain/networks' import { getRemoteConfigWithCache } from 'helpers/config' -import { type ConfigResponseType, configCacheTime } from 'helpers/config' +import { configCacheTime, type ConfigResponseType } from 'helpers/config' import type { NextApiRequest, NextApiResponse } from 'next' import getConfig from 'next/config' import type { AppConfigType } from 'types/config' diff --git a/pages/brand.tsx b/pages/brand.tsx index 177ce73240..5d5cd993f5 100644 --- a/pages/brand.tsx +++ b/pages/brand.tsx @@ -7,8 +7,8 @@ import { useScrollToTop } from 'helpers/useScrollToTop' import { useTranslation } from 'next-i18next' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import React from 'react' -import { Box, Grid, Heading, Image, Text } from 'theme-ui' import { arrow_right, close } from 'theme/icons' +import { Box, Grid, Heading, Image, Text } from 'theme-ui' export const getStaticProps = async ({ locale }: { locale: string }) => ({ props: { diff --git a/pages/earn/dsr/index.tsx b/pages/earn/dsr/index.tsx index e2a58fbf6c..8222cad787 100644 --- a/pages/earn/dsr/index.tsx +++ b/pages/earn/dsr/index.tsx @@ -3,8 +3,8 @@ import { WithWalletConnection } from 'components/connectWallet' import { AppLayout } from 'components/layouts/AppLayout' import { useAccount } from 'helpers/useAccount' import type { GetServerSidePropsContext } from 'next' -import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import { useRouter } from 'next/router' +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import React from 'react' export async function getServerSideProps(ctx: GetServerSidePropsContext) { diff --git a/pages/owner/[address]/index.tsx b/pages/owner/[address]/index.tsx index b4c9c09608..054bef559c 100644 --- a/pages/owner/[address]/index.tsx +++ b/pages/owner/[address]/index.tsx @@ -5,6 +5,7 @@ import { AppLayout } from 'components/layouts/AppLayout' import { WithTermsOfService } from 'features/termsOfService/TermsOfService' import { VaultsOverviewView } from 'features/vaultsOverview/VaultOverviewView' import { WithWalletAssociatedRisk } from 'features/walletAssociatedRisk/WalletAssociatedRisk' +import { getPortfolioLink } from 'helpers/get-portfolio-link' import type { GetServerSidePropsContext } from 'next' import { useTranslation } from 'next-i18next' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' @@ -34,7 +35,7 @@ function VaultsSummary({ address }: { address: string }) { token: `${address.slice(0, 7)}...`, }} description="seo.multiply.description" - url={`/owner/${address}`} + url={getPortfolioLink(address)} /> diff --git a/pages/portfolio/[address].tsx b/pages/portfolio/[address].tsx new file mode 100644 index 0000000000..649a864642 --- /dev/null +++ b/pages/portfolio/[address].tsx @@ -0,0 +1,100 @@ +import { PortfolioLayout } from 'components/layouts/PortfolioLayout' +import { PortfolioHeader } from 'components/portfolio/PortfolioHeader' +import { PortfolioOverview } from 'components/portfolio/PortfolioOverview' +import { PortfolioOverviewSkeleton } from 'components/portfolio/PortfolioOverviewSkeleton' +import { PortfolioPositionsView } from 'components/portfolio/positions/PortfolioPositionsView' +import { PortfolioWalletView } from 'components/portfolio/wallet/PortfolioWalletView' +import { TabBar } from 'components/TabBar' +import { usePortfolioClient } from 'helpers/clients/portfolio-client' +import { useRedirect } from 'helpers/useRedirect' +import type { GetServerSidePropsContext } from 'next' +import { useTranslation } from 'next-i18next' +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' +import React, { useEffect, useState } from 'react' +import { getAwsInfraHeader, getAwsInfraUrl } from 'server/helpers' +import { Box } from 'theme-ui' + +import type { PortfolioOverviewResponse } from 'lambdas/src/portfolio-overview/types' + +export async function getServerSideProps(ctx: GetServerSidePropsContext) { + const address = ctx.query.address + const awsInfraUrl = getAwsInfraUrl() + const awsInfraHeader = getAwsInfraHeader() + + return { + props: { + ...(await serverSideTranslations(ctx.locale ?? 'en', ['portfolio', 'common'])), + address, + awsInfraUrl, + awsInfraHeader, + }, + } +} + +export default function PortfolioView({ + address, + awsInfraUrl, + awsInfraHeader, +}: { + address: string + awsInfraUrl: string + awsInfraHeader: Record +}) { + const { t: tPortfolio } = useTranslation('portfolio') + const { replace } = useRedirect() + + const portfolioClient = usePortfolioClient(awsInfraUrl, awsInfraHeader) + + // fetch data + const [overviewData, setOverviewData] = useState() + useEffect(() => { + void portfolioClient.fetchPortfolioOverview(address).then((data) => { + setOverviewData(data) + }) + }, [address, portfolioClient]) + + // redirect + useEffect(() => { + if (!address) { + replace('/') + } + }, [address, replace]) + + return address ? ( + + + + {overviewData ? ( + + ) : ( + + )} + + ), + }, + { + value: 'wallet', + label: tPortfolio('wallet-tab'), + content: ( + + ), + }, + ]} + /> + + + ) : null +} diff --git a/pages/security.tsx b/pages/security.tsx index dfd918f7d4..efc4109626 100644 --- a/pages/security.tsx +++ b/pages/security.tsx @@ -8,8 +8,8 @@ import { useScrollToTop } from 'helpers/useScrollToTop' import { useTranslation } from 'next-i18next' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import React, { Fragment } from 'react' -import { Box, Grid, Heading, Image, Text } from 'theme-ui' import { arrow_right } from 'theme/icons' +import { Box, Grid, Heading, Image, Text } from 'theme-ui' export const getStaticProps = async ({ locale }: { locale: string }) => ({ props: { diff --git a/public/locales/en/portfolio.json b/public/locales/en/portfolio.json new file mode 100644 index 0000000000..72bfd0103b --- /dev/null +++ b/public/locales/en/portfolio.json @@ -0,0 +1,71 @@ +{ + "positions-tab": "Positions", + "wallet-tab": "Wallet", + "view-on-etherscan": "View on Etherscan", + "wallet-balance": "Wallet balance", + "view-assets": "View Assets", + "total-portfolio": "Portfolio", + "total-supplied": "Total Supplied", + "total-borrowed": "Total Borrowed", + "available-to-migrate": "Available to Migrate", + "coming-soon": "Coming soon", + "past-week": "{{percentage}}% Past Week", + "all-products": "All Products", + "borrow": "Borrow", + "multiply": "Multiply", + "earn": "Earn", + "migrate": "Migrate", + "net-value": "Net Value", + "show-empty-positions": { + "label": "Show empty positions", + "tooltip": "Positions valued at $0 are hidden by default. Toggle 'Show Empty Positions' to view or use them. You still own these and can utilize them without incurring new position costs." + }, + "automations": "Automations", + "days-of-earning": "{{days}} Days of Earning", + "view-position": "View Position", + "networks": "Networks", + "assets": "Assets", + "summary": "Summary", + "top-assets": "Top {{amount}} assets", + "token": "Token", + "price-24": "Price (24h)", + "balance": "Balance", + "total-assets": "Total assets", + "automation-details": { + "autoBuy": "Auto Buy", + "autoSell": "Auto Sell", + "takeProfit": "Take Profit", + "stopLoss": "Stop Loss" + }, + "position-details": { + "netValue": "Net Value", + "pnl": "PnL", + "liquidationPrice": "Liq. Price", + "ltv": "LTV", + "multiple": "Multiple", + "collateralLocked": "Coll. Locked", + "totalDebt": "Total Debt", + "borrowRate": "Borrow Rate", + "lendingRange": "Lending Range", + "earnings": "Earnings", + "apy": "Current APY", + "90dApy": "90D APY", + "suppliedToken": "Supplied", + "suppliedTokenBalance": "Balance of Supplied", + "borrowedToken": "Borrowed", + "borrowedTokenBalance": "Balance of Borrowed" + }, + "details-tooltips": { + "netValue": "Net Value is the current value of the collateral in your position minus the current debt expressed in USD.", + "netValueEarnActivePassive": "Net Value is the total of your initial deposit, plus earnings or additional deposits, minus fees.", + "liquidationPrice": "The current price of the collateral, based on the LTV of the position, that, if crossed, would liquidate your position.", + "ltv": "The LTV is the Loan to Value of your position, and represents the amount of debt you have, relative to your collateral, as a %. The LTV is used to determine your liquidation price, often expressed as Max LTV.", + "multiple": "Multiple indicates how much additional collateral exposure you have in this position, affecting potential gains and losses.", + "borrowRate": "Percentage reflecting Borrow (debt) APY minus Supply (collateral) APY. Positive values mean you are paying to borrow; negative means you're earning. Rates are variable.", + "lendingRange": "The range reflecting the price you’ve selected to lend your tokens, based on the existing distribution of price buckets.", + "apy": "Annualised rate this position is currently earning", + "90dApy": "The Annualised rate the position is earning based on the average of the last 90 days", + "suppliedTokenBalance": "The total amount of your supplied asset(s), expressed in USD.", + "borrowedTokenBalance": "The total amount of your borrowed asset(s), expressed in USD." + } +} diff --git a/server/helpers/get-aws-infra-header.ts b/server/helpers/get-aws-infra-header.ts new file mode 100644 index 0000000000..de24f93dcd --- /dev/null +++ b/server/helpers/get-aws-infra-header.ts @@ -0,0 +1,18 @@ +export function getAwsInfraHeader(): { 'x-api-key': string } | {} { + // AWS_API_GATEWAY_KEY header is needed on local development only + const isLocal = process.env.NODE_ENV === 'development' + const key = process.env.AWS_API_GATEWAY_KEY + if (isLocal) { + if (!key) { + throw new Error('Missing AWS_API_GATEWAY_KEY') + } + return { + 'x-api-key': `${key}`, + } + } else if (key) { + // AWS_API_GATEWAY_KEY should not be present on production + throw new Error('AWS_API_GATEWAY_KEY is leaking to production, pleasse remove it!') + } + + return {} +} diff --git a/server/helpers/get-aws-infra-url.ts b/server/helpers/get-aws-infra-url.ts new file mode 100644 index 0000000000..edb2e98fb6 --- /dev/null +++ b/server/helpers/get-aws-infra-url.ts @@ -0,0 +1,7 @@ +export function getAwsInfraUrl(): string { + const url = process.env.AWS_API_GATEWAY_URL + if (!url) { + throw new Error('Missing AWS_API_GATEWAY_URL') + } + return url +} diff --git a/server/helpers/index.ts b/server/helpers/index.ts new file mode 100644 index 0000000000..77f60a6aa5 --- /dev/null +++ b/server/helpers/index.ts @@ -0,0 +1,2 @@ +export { getAwsInfraHeader } from './get-aws-infra-header' +export { getAwsInfraUrl } from './get-aws-infra-url' diff --git a/theme/animations/adding-stop-loss-animation-static.tsx b/theme/animations/adding-stop-loss-animation-static.tsx index 8fcc4f49b8..8ce7cf775f 100644 --- a/theme/animations/adding-stop-loss-animation-static.tsx +++ b/theme/animations/adding-stop-loss-animation-static.tsx @@ -1,7 +1,7 @@ import React from 'react' import Lottie from 'react-lottie-light' -import { Box } from 'theme-ui' import addingStopLossAnimation from 'theme/animations/lottie/addingStopLossAnimation.json' +import { Box } from 'theme-ui' const addingStopLossAnimationOptions = { loop: true, diff --git a/theme/animations/open-vault-animation-static.tsx b/theme/animations/open-vault-animation-static.tsx index 452925da58..ae5d8c6dd5 100644 --- a/theme/animations/open-vault-animation-static.tsx +++ b/theme/animations/open-vault-animation-static.tsx @@ -1,7 +1,7 @@ import React from 'react' import Lottie from 'react-lottie-light' -import { Box } from 'theme-ui' import openVaultAnimation from 'theme/animations/lottie/openVaultAnimation.json' +import { Box } from 'theme-ui' const openVaultAnimationOptions = { loop: true, diff --git a/theme/icons/auto_buy.tsx b/theme/icons/auto_buy.tsx new file mode 100644 index 0000000000..fa54f27198 --- /dev/null +++ b/theme/icons/auto_buy.tsx @@ -0,0 +1,14 @@ +import React from 'react' +export const auto_buy = { + path: ( + <> + + + ), + viewBox: '0 0 18 18', +} diff --git a/theme/icons/auto_sell.tsx b/theme/icons/auto_sell.tsx new file mode 100644 index 0000000000..d4d9744c9b --- /dev/null +++ b/theme/icons/auto_sell.tsx @@ -0,0 +1,14 @@ +import React from 'react' +export const auto_sell = { + path: ( + <> + + + ), + viewBox: '0 0 18 18', +} diff --git a/theme/icons/index.ts b/theme/icons/index.ts index b077404611..fd9bfe1cd4 100644 --- a/theme/icons/index.ts +++ b/theme/icons/index.ts @@ -1,256 +1,262 @@ export { aave_cbETH_usdc } from './aave_cbETH_usdc' -export { aave_eth_usdc } from './aave_eth_usdc' -export { ajnaSparks } from './ajnaSparks' -export { aave_wbtc_usdc } from './aave_wbtc_usdc' export { aave_circle_color } from './aave_circle_color' +export { aave_eth_usdc } from './aave_eth_usdc' +export { aave_steth_eth } from './aave_steth_eth' export { aave_steth_usdc } from './aave_steth_usdc' +export { aave_wbtc_usdc } from './aave_wbtc_usdc' +export { ajnaSparks } from './ajnaSparks' export { allAssets } from './allAssets' -export { aave_steth_eth } from './aave_steth_eth' -export { btc_circle_mono } from './btc_circle_mono' -export { cbeth_circle_color } from './cbeth_circle_color' -export { btc_circle_color } from './btc_circle_color' -export { arrow_up_thin } from './arrow_up_thin' -export { arrow_up } from './arrow_up' -export { deprecated_icon } from './deprecated_icon' -export { borrow_transition } from './borrow_transition' -export { arrow_right_light } from './arrow_right_light' -export { bell } from './bell' -export { arrow_right } from './arrow_right' -export { bat_color } from './bat_color' -export { arrow_left } from './arrow_left' -export { bat_circle_color } from './bat_circle_color' -export { arrow_increase } from './arrow_increase' -export { bat } from './bat' -export { arrow_down } from './arrow_down' -export { bannerWallet } from './bannerWallet' -export { arrow_decrease } from './arrow_decrease' -export { bal_circle_color } from './bal_circle_color' -export { announcement } from './announcement' -export { bal_circle } from './bal_circle' -export { allProtocols } from './allProtocols' -export { augur_color } from './augur_color' -export { allNetworks } from './allNetworks' -export { augur_circle_color } from './augur_circle_color' export { allAssetsActive } from './allAssetsActive' +export { allNetworks } from './allNetworks' +export { allProtocols } from './allProtocols' +export { announcement } from './announcement' +export { arrow_decrease } from './arrow_decrease' +export { arrow_down } from './arrow_down' +export { arrow_increase } from './arrow_increase' +export { arrow_left } from './arrow_left' +export { arrow_right } from './arrow_right' +export { arrow_right_light } from './arrow_right_light' +export { arrow_up } from './arrow_up' +export { arrow_up_thin } from './arrow_up_thin' export { augur } from './augur' -export { chai } from './chai' +export { augur_circle_color } from './augur_circle_color' +export { augur_color } from './augur_color' +export { auto_buy } from './auto_buy' +export { auto_sell } from './auto_sell' +export { bal_circle } from './bal_circle' +export { bal_circle_color } from './bal_circle_color' +export { bannerWallet } from './bannerWallet' +export { bat } from './bat' +export { bat_circle_color } from './bat_circle_color' +export { bat_color } from './bat_color' +export { bell } from './bell' +export { borrow_transition } from './borrow_transition' +export { btc_circle_color } from './btc_circle_color' +export { btc_circle_mono } from './btc_circle_mono' export { caret_down } from './caret_down' +export { cbeth_circle_color } from './cbeth_circle_color' +export { cbeth_eth } from './cbeth_eth' export { cbeth_usdc } from './cbeth_usdc' -export { circle_close } from './circle_close' -export { copy } from './copy' -export { compound_color } from './compound_color' +export { chai } from './chai' +export { chai_circle_color } from './chai_circle_color' +export { chai_color } from './chai_color' +export { chainlink } from './chainlink' +export { chainlink_circle_color } from './chainlink_circle_color' +export { chainlink_color } from './chainlink_color' export { checkbox } from './checkbox' +export { checkmark } from './checkmark' +export { checkmark_square } from './checkmark_square' +export { chevron } from './chevron' +export { chevron_down } from './chevron_down' export { chevron_left } from './chevron_left' -export { compound_circle_color } from './compound_circle_color' -export { chainlink_color } from './chainlink_color' -export { chevron_up } from './chevron_up' -export { compound } from './compound' -export { chainlink_circle_color } from './chainlink_circle_color' -export { collateral } from './collateral' export { chevron_right } from './chevron_right' -export { chainlink } from './chainlink' -export { coins_cross } from './coins_cross' -export { chai_color } from './chai_color' -export { cbeth_eth } from './cbeth_eth' -export { coinbase_color } from './coinbase_color' -export { clock } from './clock' -export { chai_circle_color } from './chai_circle_color' -export { chevron } from './chevron' -export { clear_selection } from './clear_selection' -export { coinbase } from './coinbase' -export { checkmark_square } from './checkmark_square' -export { close_squared } from './close_squared' -export { circle_slider } from './circle_slider' +export { chevron_up } from './chevron_up' +export { circle_close } from './circle_close' export { circle_exchange } from './circle_exchange' +export { circle_slider } from './circle_slider' +export { clear_selection } from './clear_selection' +export { clock } from './clock' export { close } from './close' -export { checkmark } from './checkmark' -export { chevron_down } from './chevron_down' +export { close_squared } from './close_squared' +export { coinbase } from './coinbase' +export { coinbase_color } from './coinbase_color' +export { coins_cross } from './coins_cross' +export { collateral } from './collateral' +export { compound } from './compound' +export { compound_circle_color } from './compound_circle_color' +export { compound_color } from './compound_color' +export { copy } from './copy' export { dai } from './dai' -export { ether } from './ether' -export { gnosisSafe_user } from './gnosisSafe_user' -export { eth_usdc } from './eth_usdc' -export { gemini_color } from './gemini_color' -export { gemini_circle_color } from './gemini_circle_color' -export { gusd_circle_color } from './gusd_circle_color' +export { dai_circle_color } from './dai_circle_color' +export { dai_color } from './dai_color' +export { decrease } from './decrease' +export { deposit } from './deposit' +export { deprecated_icon } from './deprecated_icon' +export { digix_circle_color } from './digix_circle_color' +export { discord } from './discord' +export { dots_h } from './dots_h' +export { dots_v } from './dots_v' +export { duplicate } from './duplicate' +export { edit } from './edit' +export { error } from './error' +export { eth_circle_color } from './eth_circle_color' export { eth_circle_mono } from './eth_circle_mono' -export { gnosis_safe } from './gnosis_safe' +export { eth_usdc } from './eth_usdc' +export { ether } from './ether' +export { ether_circle_color } from './ether_circle_color' +export { ether_color } from './ether_color' +export { euro_circle_color } from './euro_circle_color' +export { exchange } from './exchange' +export { exclamationMark } from './exclamationMark' +export { eye } from './eye' +export { facebook } from './facebook' +export { frax_circle_color } from './frax_circle_color' export { gemini } from './gemini' -export { guniv3_dai_usdc1_circles_color } from './guniv3_dai_usdc1_circles_color' -export { eth_circle_color } from './eth_circle_color' +export { gemini_circle_color } from './gemini_circle_color' +export { gemini_color } from './gemini_color' +export { gho_circle_color } from './gho_circle_color' +export { github } from './github' export { gno_circle_color } from './gno_circle_color' -export { frax_circle_color } from './frax_circle_color' +export { gnosis_safe } from './gnosis_safe' +export { gnosisSafe_user } from './gnosisSafe_user' export { golem_circle_color } from './golem_circle_color' -export { error } from './error' -export { github } from './github' +export { guniv3_dai_usdc1_circles_color } from './guniv3_dai_usdc1_circles_color' +export { gusd_circle_color } from './gusd_circle_color' export { gusd_circle_mono } from './gusd_circle_mono' -export { facebook } from './facebook' -export { edit } from './edit' -export { gho_circle_color } from './gho_circle_color' -export { eye } from './eye' -export { uni_circle_mono } from './uni_circle_mono' -export { duplicate } from './duplicate' -export { uni_lp_circle_color } from './uni_lp_circle_color' -export { exclamationMark } from './exclamationMark' -export { uni_circle_color } from './uni_circle_color' -export { dots_v } from './dots_v' -export { zerox_color } from './zerox_color' -export { twitter } from './twitter' -export { exchange } from './exchange' -export { dots_h } from './dots_h' -export { zerox_circle_color } from './zeroX_circle_color' -export { tusd_color } from './tusd_color' -export { euro_circle_color } from './euro_circle_color' -export { discord } from './discord' -export { play_outline } from './play_outline' -export { ether_color } from './ether_color' -export { plus } from './plus' -export { digix_circle_color } from './digix_circle_color' -export { wallet_connect_color } from './wallet_connect_color' -export { wallet_connect } from './wallet_connect' -export { play } from './play' -export { ether_circle_color } from './ether_circle_color' -export { tusd_circle_color } from './tusd_circle_color' -export { deposit } from './deposit' -export { wallet } from './wallet' -export { zerox } from './zerox' -export { person } from './person' -export { send } from './send' -export { selectMultiplyActive } from './selectMultiplyActive' -export { youtube } from './youtube' -export { verified } from './verified' -export { pax_color } from './pax_color' -export { tusd } from './tusd' -export { selectMultiply } from './selectMultiply' -export { trezor_user } from './trezor_user' -export { decrease } from './decrease' -export { pax_circle_color } from './pax_circle_color' -export { yieldeth_circle_color } from './yieldeth_circle_color' -export { usdt_color } from './usdt_color' -export { selectEarnActive } from './selectEarnActive' -export { trezor } from './trezor' -export { dai_color } from './dai_color' -export { pax } from './pax' -export { yieldbtc_circle_color } from './yieldbtc_circle_color' -export { usdt_circle_color } from './usdt_circle_color' -export { selectEarn } from './selectEarn' -export { tooltip } from './tooltip' -export { paste } from './paste' -export { dai_circle_color } from './dai_circle_color' -export { yfi_circle_mono } from './yfi_circle_mono' -export { usdt } from './usdt' -export { selectBorrowActive } from './selectBorrowActive' -export { tick } from './tick' -export { partnership } from './partnership' -export { yfi_circle_color } from './yfi_circle_color' -export { telegram } from './telegram' -export { open_in_new_tab } from './open_in_new_tab' -export { yen_circle_color } from './yen_circle_color' -export { usdp_circle_color } from './usdp_circle_color' -export { omisego_color } from './omisego_color' -export { univ2_eth_usdt_circles_color } from './univ2_eth_usdt_circles_color' -export { wyre } from './wyre' -export { usdc_circle_color } from './usdc_circle_color' -export { selectBorrow } from './selectBorrow' -export { wbtc_color } from './wbtc_color' -export { univ2_dai_usdt_circles_color } from './univ2_dai_usdt_circles_color' -export { omisego_circle_color } from './omisego_circle_color' -export { usdc } from './usdc' -export { searchIcon } from './searchIcon' -export { wbtc_circle_color } from './wbtc_circle_color' -export { univ2_dai_usdc_circles_color } from './univ2_dai_usdc_circles_color' -export { usd_circle_color } from './usd_circle_color' -export { tbtc_circle_color } from './tbtc_circle_color' -export { omisego } from './omisego' -export { wbtc } from './wbtc' -export { notification } from './notification' -export { warning } from './warning' -export { support_plus } from './support_plus' -export { walletLink_user } from './walletLink_user' -export { support_minus } from './support_minus' -export { new_beacon } from './new_beacon' -export { walletConnect_user } from './walletConnect_user' -export { uni_lp_circle_mono } from './uni_lp_circle_mono' -export { univ2_usdc_eth_circles_color } from './univ2_usdc_eth_circles_color' -export { stop_loss_active } from './stop_loss_active' -export { sdai_circle_color } from './sdai_circle_color' -export { star } from './star' -export { sign_out } from './sign_out' -export { slippage_limit } from './slippage_limit' -export { myetherwallet_user } from './myetherwallet_user' -export { wbtc_usdc } from './wbtc_usdc' -export { sai_color } from './sai_color' -export { sign_transaction } from './sign_transaction' -export { sparkSparks } from './sparkSparks' -export { stop } from './stop' -export { share } from './share' -export { wsteth_circle_color } from './wsteth_circle_color' -export { sai_circle_color } from './sai_circle_color' -export { status_color } from './status_color' -export { spark_circle_color } from './spark_circle_color' -export { status } from './status' -export { settings } from './settings' -export { wld_circle_color } from './wld_circle_color' -export { multiply_transition } from './multiply_transition' -export { sai } from './sai' -export { steth_usdc } from './steth_usdc' -export { someWallet_user } from './someWallet_user' -export { star_circle_mono } from './star_circle_mono' -export { weth_circle_color } from './weth_circle_color' -export { moonpay } from './moonpay' -export { steth_eth } from './steth_eth' -export { star_circle_color } from './star_circle_color' -export { lrc_circle_color } from './lrc_circle_color' -export { white_paper } from './white_paper' -export { latamex } from './latamex' -export { ledger } from './ledger' -export { steth_circle_color } from './steth_circle_color' -export { reth_usdc } from './reth_usdc' -export { kyber_circle_color } from './kyber_circle_color' -export { mobile_menu_close } from './mobile_menu_close' -export { kyber } from './kyber' -export { lrc } from './lrc' -export { landing_card_dai } from './landing_card_dai' -export { reth_eth } from './reth_eth' +export { home } from './home' export { increase } from './increase' +export { knc_circle_color } from './knc_circle_color' +export { kyber } from './kyber' +export { kyber_circle_color } from './kyber_circle_color' export { kyber_color } from './kyber_color' -export { home } from './home' -export { loudspeaker } from './loudspeaker' +export { landing_card_dai } from './landing_card_dai' export { landing_card_faq } from './landing_card_faq' -export { knc_circle_color } from './knc_circle_color' +export { latamex } from './latamex' +export { ledger } from './ledger' +export { ledger_user } from './ledger_user' +export { link } from './link' +export { link_circle_color } from './link_circle_color' +export { link_circle_mono } from './link_circle_mono' +export { liquidation } from './liquidation' +export { lock } from './lock' export { lock_open } from './lock_open' -export { mana_color } from './mana_color' -export { press } from './press' -export { reth_circle_color } from './reth_circle_color' -export { mkr_circle_color } from './mkr_circle_color' -export { minus } from './minus' -export { maker_color } from './maker_color' -export { portis_user } from './portis_user' -export { maker_circle_color } from './maker_circle_color' -export { mana_circle_mono } from './mana_circle_mono' -export { metamask_user } from './metamask_user' +export { loudspeaker } from './loudspeaker' +export { lrc } from './lrc' +export { lrc_circle_color } from './lrc_circle_color' +export { lrc_color } from './lrc_color' +export { lusd_circle_color } from './lusd_circle_color' export { maker } from './maker' -export { mana_circle_color } from './mana_circle_color' -export { metamask_color } from './metamask_color' -export { plus_header } from './plus_header' -export { question } from './question' +export { maker_circle_color } from './maker_circle_color' +export { maker_color } from './maker_color' export { mana } from './mana' -export { metamask } from './metamask' -export { qrcode } from './qrcode' -export { link_circle_color } from './link_circle_color' +export { mana_circle_color } from './mana_circle_color' +export { mana_circle_mono } from './mana_circle_mono' +export { mana_color } from './mana_color' +export { matic_circle_color } from './matic_circle_color' export { matic_circle_mono } from './matic_circle_mono' export { medium } from './medium' -export { renbtc_circle_color } from './renbtc_circle_color' -export { promoCardStar } from './promoCardStar' export { menu } from './menu' -export { link_circle_mono } from './link_circle_mono' -export { liquidation } from './liquidation' -export { matic_circle_color } from './matic_circle_color' -export { link } from './link' -export { refresh } from './refresh' -export { lrc_color } from './lrc_color' -export { ledger_user } from './ledger_user' -export { lusd_circle_color } from './lusd_circle_color' +export { metamask } from './metamask' +export { metamask_color } from './metamask_color' +export { metamask_user } from './metamask_user' +export { minus } from './minus' +export { mkr_circle_color } from './mkr_circle_color' +export { mobile_menu_close } from './mobile_menu_close' +export { moonpay } from './moonpay' +export { multiply_transition } from './multiply_transition' +export { myetherwallet_user } from './myetherwallet_user' +export { new_beacon } from './new_beacon' +export { notification } from './notification' +export { omisego } from './omisego' +export { omisego_circle_color } from './omisego_circle_color' +export { omisego_color } from './omisego_color' +export { open_in_new_tab } from './open_in_new_tab' +export { partnership } from './partnership' +export { paste } from './paste' +export { pax } from './pax' +export { pax_circle_color } from './pax_circle_color' +export { pax_color } from './pax_color' +export { person } from './person' +export { play } from './play' +export { play_outline } from './play_outline' +export { plus } from './plus' +export { plus_header } from './plus_header' +export { portfolio_product_dropdown_icon } from './portfolio_product_dropdown_icon' +export { portfolio_sort_dropdown_icon } from './portfolio_sort_dropdown_icon' +export { portis_user } from './portis_user' +export { press } from './press' +export { promoCardStar } from './promoCardStar' +export { qrcode } from './qrcode' +export { question } from './question' +export { question_mark } from './question_mark' export { question_o } from './question_o' export { reddit } from './reddit' -export { question_mark } from './question_mark' -export { lock } from './lock' +export { refresh } from './refresh' +export { renbtc_circle_color } from './renbtc_circle_color' +export { reth_circle_color } from './reth_circle_color' +export { reth_eth } from './reth_eth' +export { reth_usdc } from './reth_usdc' +export { sai } from './sai' +export { sai_circle_color } from './sai_circle_color' +export { sai_color } from './sai_color' +export { sdai_circle_color } from './sdai_circle_color' +export { searchIcon } from './searchIcon' +export { selectBorrow } from './selectBorrow' +export { selectBorrowActive } from './selectBorrowActive' +export { selectEarn } from './selectEarn' +export { selectEarnActive } from './selectEarnActive' +export { selectMultiply } from './selectMultiply' +export { selectMultiplyActive } from './selectMultiplyActive' +export { send } from './send' +export { settings } from './settings' +export { share } from './share' +export { sign_out } from './sign_out' +export { sign_transaction } from './sign_transaction' +export { slippage_limit } from './slippage_limit' +export { someWallet_user } from './someWallet_user' +export { spark_circle_color } from './spark_circle_color' +export { sparkSparks } from './sparkSparks' +export { star } from './star' +export { star_circle_color } from './star_circle_color' +export { star_circle_mono } from './star_circle_mono' +export { status } from './status' +export { status_color } from './status_color' +export { steth_circle_color } from './steth_circle_color' +export { steth_eth } from './steth_eth' +export { steth_usdc } from './steth_usdc' +export { stop } from './stop' +export { stop_loss } from './stop_loss' +export { stop_loss_active } from './stop_loss_active' +export { support_minus } from './support_minus' +export { support_plus } from './support_plus' +export { take_profit } from './take_profit' +export { tbtc_circle_color } from './tbtc_circle_color' +export { telegram } from './telegram' +export { tick } from './tick' +export { tooltip } from './tooltip' +export { trezor } from './trezor' +export { trezor_user } from './trezor_user' +export { tusd } from './tusd' +export { tusd_circle_color } from './tusd_circle_color' +export { tusd_color } from './tusd_color' +export { twitter } from './twitter' +export { uni_circle_color } from './uni_circle_color' +export { uni_circle_mono } from './uni_circle_mono' +export { uni_lp_circle_color } from './uni_lp_circle_color' +export { uni_lp_circle_mono } from './uni_lp_circle_mono' +export { univ2_dai_usdc_circles_color } from './univ2_dai_usdc_circles_color' +export { univ2_dai_usdt_circles_color } from './univ2_dai_usdt_circles_color' +export { univ2_eth_usdt_circles_color } from './univ2_eth_usdt_circles_color' +export { univ2_usdc_eth_circles_color } from './univ2_usdc_eth_circles_color' +export { usd_circle_color } from './usd_circle_color' +export { usdc } from './usdc' +export { usdc_circle_color } from './usdc_circle_color' +export { usdp_circle_color } from './usdp_circle_color' +export { usdt } from './usdt' +export { usdt_circle_color } from './usdt_circle_color' +export { usdt_color } from './usdt_color' +export { verified } from './verified' +export { wallet } from './wallet' +export { wallet_connect } from './wallet_connect' +export { wallet_connect_color } from './wallet_connect_color' +export { walletConnect_user } from './walletConnect_user' +export { walletLink_user } from './walletLink_user' +export { warning } from './warning' +export { wbtc } from './wbtc' +export { wbtc_circle_color } from './wbtc_circle_color' +export { wbtc_color } from './wbtc_color' +export { wbtc_usdc } from './wbtc_usdc' +export { weth_circle_color } from './weth_circle_color' +export { white_paper } from './white_paper' +export { wld_circle_color } from './wld_circle_color' +export { wsteth_circle_color } from './wsteth_circle_color' +export { wyre } from './wyre' +export { yen_circle_color } from './yen_circle_color' +export { yfi_circle_color } from './yfi_circle_color' +export { yfi_circle_mono } from './yfi_circle_mono' +export { yieldbtc_circle_color } from './yieldbtc_circle_color' +export { yieldeth_circle_color } from './yieldeth_circle_color' +export { youtube } from './youtube' +export { zerox } from './zerox' +export { zerox_circle_color } from './zeroX_circle_color' +export { zerox_color } from './zerox_color' diff --git a/theme/icons/portfolio_product_dropdown_icon.tsx b/theme/icons/portfolio_product_dropdown_icon.tsx new file mode 100644 index 0000000000..5aa5a39922 --- /dev/null +++ b/theme/icons/portfolio_product_dropdown_icon.tsx @@ -0,0 +1,13 @@ +import React from 'react' +export const portfolio_product_dropdown_icon = { + path: ( + <> + + + + + + + ), + viewBox: '0 0 24 24', +} diff --git a/theme/icons/portfolio_sort_dropdown_icon.tsx b/theme/icons/portfolio_sort_dropdown_icon.tsx new file mode 100644 index 0000000000..5333f5d5fa --- /dev/null +++ b/theme/icons/portfolio_sort_dropdown_icon.tsx @@ -0,0 +1,21 @@ +import React from 'react' +export const portfolio_sort_dropdown_icon = { + path: ( + <> + + + + + + ), + viewBox: '0 0 24 24', +} diff --git a/theme/icons/stop_loss.tsx b/theme/icons/stop_loss.tsx new file mode 100644 index 0000000000..6272059b55 --- /dev/null +++ b/theme/icons/stop_loss.tsx @@ -0,0 +1,14 @@ +import React from 'react' +export const stop_loss = { + path: ( + <> + + + ), + viewBox: '0 0 18 18', +} diff --git a/theme/icons/take_profit.tsx b/theme/icons/take_profit.tsx new file mode 100644 index 0000000000..9dee5be105 --- /dev/null +++ b/theme/icons/take_profit.tsx @@ -0,0 +1,14 @@ +import React from 'react' +export const take_profit = { + path: ( + <> + + + ), + viewBox: '0 0 18 18', +} diff --git a/theme/index.tsx b/theme/index.tsx index f94637d337..ab62ec6289 100644 --- a/theme/index.tsx +++ b/theme/index.tsx @@ -313,6 +313,10 @@ export const theme = themeTypeSafe({ maxWidth: '1408px', px: '16px', }, + portfolio: { + maxWidth: '1408px', + px: '16px', + }, }, cards: { primary: { @@ -785,6 +789,28 @@ export const theme = themeTypeSafe({ cursor: 'not-allowed', }, }, + tag: { + px: '12px', + py: '4px', + color: 'neutral80', + fontFamily: 'body', + fontSize: 1, + fontWeight: 'semiBold', + lineHeight: '20px', + backgroundColor: 'transparent', + textAlign: 'center', + border: '1px solid', + borderColor: 'neutral20', + borderRadius: 'large', + bg: 'neutral10', + cursor: 'pointer', + '&:hover': { + color: 'interactive100', + backgroundColor: 'interactive10', + borderColor: 'interactive10', + }, + transition: 'color 200ms, border-color 200ms, background-color 200ms', + }, }, links: { unStyled: { @@ -1019,6 +1045,11 @@ export const theme = themeTypeSafe({ borderRadius: '2em', gap: '0px', }, + portfolio: { + gap: [3, null, 4, '48px'], + gridTemplateColumns: ['1fr', '3fr minmax(380px, 1fr)'], + alignItems: 'flex-start', + }, }, styles: { root: { @@ -1118,6 +1149,45 @@ export const theme = themeTypeSafe({ height: '1px', width: '100%', }, + tagDefault: { + variant: 'text.paragraph4', + borderRadius: 'round', + px: 3, + py: 1, + display: 'block', + whiteSpace: 'nowrap', + alignSelf: 'baseline', + }, + tagPrimary: { + variant: 'boxes.tagDefault', + bg: 'primary100', + color: 'neutral10', + }, + tagSecondary: { + variant: 'boxes.tagDefault', + bg: 'secondary10', + color: 'primary30', + }, + tagWarning: { + variant: 'boxes.tagDefault', + bg: 'warning10', + color: 'warning100', + }, + tagCritical: { + variant: 'boxes.tagDefault', + bg: 'critical10', + color: 'critical100', + }, + tagSuccess: { + variant: 'boxes.tagDefault', + bg: 'success10', + color: 'success100', + }, + tagInteractive: { + variant: 'boxes.tagDefault', + bg: 'interactive10', + color: 'interactive100', + }, }, }) diff --git a/ts_modules/i18next.d.ts b/ts_modules/i18next.d.ts index 63f345857c..632a685076 100644 --- a/ts_modules/i18next.d.ts +++ b/ts_modules/i18next.d.ts @@ -6,7 +6,8 @@ import type { InitOptions as OriginalInitOptions, TFunction as OriginalTFunction, } from 'i18next' -import type engLocales from 'public/locales/en/common.json' +import type engCommonLocales from 'public/locales/en/common.json' +import type engPortfolioLocales from 'public/locales/en/portfolio.json' import type { ReportNamespaces } from 'react-i18next'; type AcceptAnyString = T | (string & Record); @@ -18,8 +19,9 @@ type PathsToProps = T extends V ? "" : { type Dot = "" extends U ? T : `${T}.${U}` -type LanguageDotNotationKeys = AcceptAnyString> -type TranslationType = (key: LanguageDotNotationKeys, translationData?: Record) => string & string[] +type CommonLanguageDotNotationKeys = AcceptAnyString> +type PortfolioLanguageDotNotationKeys = AcceptAnyString> +type TranslationType = (key: CommonLanguageDotNotationKeys | PortfolioLanguageDotNotationKeys, translationData?: Record) => string & string[] declare module 'next-i18next' { export function useTranslation(): { t: TranslationType diff --git a/tsconfig.json b/tsconfig.json index c35f3a647f..a2cb5f6a31 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,11 +23,19 @@ "jsx": "preserve", "incremental": true }, - "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx", "runtimeConfig.js", "next-i18next.config.js", "middleware.ts"], - "exclude": ["node_modules", "types", "coverage"], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx", + "runtimeConfig.js", + "next-i18next.config.js", + "middleware.ts" + ], + "exclude": ["node_modules", "types", "coverage", "infra"], "ts-node": { "compilerOptions": { "module": "commonjs" - }, + } } } diff --git a/tsconfig.test.json b/tsconfig.test.json index e113b1c930..c1064ab9de 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -6,5 +6,5 @@ "lib": ["dom", "dom.iterable", "esnext"], "jsx": "react" }, - "exclude": [], + "exclude": ["node_modules", "types", "coverage", "infra"] } diff --git a/yarn.lock b/yarn.lock index 0a73212126..6083110a63 100644 --- a/yarn.lock +++ b/yarn.lock @@ -924,6 +924,18 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== +"@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + "@eslint/eslintrc@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" @@ -3949,15 +3961,10 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/json-schema@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" - integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== - -"@types/json-schema@^7.0.9": - version "7.0.10" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.10.tgz#9b05b7896166cd00e9cbd59864853abf65d9ac23" - integrity sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A== +"@types/json-schema@^7.0.12": + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" + integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== "@types/json5@^0.0.29": version "0.0.29" @@ -4202,10 +4209,10 @@ dependencies: "@types/node" "*" -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== +"@types/semver@^7.5.0": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" + integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== "@types/serve-static@*": version "1.13.3" @@ -4300,177 +4307,90 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^2.3.0": - version "2.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz#312a37e80542a764d96e8ad88a105316cdcd7b05" - integrity sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg== - dependencies: - "@typescript-eslint/experimental-utils" "2.30.0" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - tsutils "^3.17.1" - -"@typescript-eslint/eslint-plugin@^5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz#da3f2819633061ced84bb82c53bba45a6fe9963a" - integrity sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ== - dependencies: - "@typescript-eslint/scope-manager" "5.51.0" - "@typescript-eslint/type-utils" "5.51.0" - "@typescript-eslint/utils" "5.51.0" +"@typescript-eslint/eslint-plugin@^6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz#d8ce497dc0ed42066e195c8ecc40d45c7b1254f4" + integrity sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.9.1" + "@typescript-eslint/type-utils" "6.9.1" + "@typescript-eslint/utils" "6.9.1" + "@typescript-eslint/visitor-keys" "6.9.1" debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@2.30.0": - version "2.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz#9845e868c01f3aed66472c561d4b6bac44809dd0" - integrity sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.30.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/experimental-utils@^5.0.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.49.0.tgz#7962b4611eb0c8be0e330d6caf4da7f8261c8203" - integrity sha512-veLpCJLYn44Fru7mSvi2doxQMzMCOFSDYdMUQhAzaH1vFYq2RVNpecZ8d18Wh6UMv07yahXkiv/aShWE48iE9Q== - dependencies: - "@typescript-eslint/utils" "5.49.0" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.51.0.tgz#2d74626652096d966ef107f44b9479f02f51f271" - integrity sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA== +"@typescript-eslint/parser@^6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.9.1.tgz#4f685f672f8b9580beb38d5fb99d52fc3e34f7a3" + integrity sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg== dependencies: - "@typescript-eslint/scope-manager" "5.51.0" - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/typescript-estree" "5.51.0" + "@typescript-eslint/scope-manager" "6.9.1" + "@typescript-eslint/types" "6.9.1" + "@typescript-eslint/typescript-estree" "6.9.1" + "@typescript-eslint/visitor-keys" "6.9.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz#81b5d899cdae446c26ddf18bd47a2f5484a8af3e" - integrity sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ== - dependencies: - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/visitor-keys" "5.49.0" - -"@typescript-eslint/scope-manager@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz#ad3e3c2ecf762d9a4196c0fbfe19b142ac498990" - integrity sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ== +"@typescript-eslint/scope-manager@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz#e96afeb9a68ad1cd816dba233351f61e13956b75" + integrity sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg== dependencies: - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/visitor-keys" "5.51.0" + "@typescript-eslint/types" "6.9.1" + "@typescript-eslint/visitor-keys" "6.9.1" -"@typescript-eslint/type-utils@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz#7af48005531700b62a20963501d47dfb27095988" - integrity sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ== +"@typescript-eslint/type-utils@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz#efd5db20ed35a74d3c7d8fba51b830ecba09ce32" + integrity sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg== dependencies: - "@typescript-eslint/typescript-estree" "5.51.0" - "@typescript-eslint/utils" "5.51.0" + "@typescript-eslint/typescript-estree" "6.9.1" + "@typescript-eslint/utils" "6.9.1" debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.49.0.tgz#ad66766cb36ca1c89fcb6ac8b87ec2e6dac435c3" - integrity sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg== + ts-api-utils "^1.0.1" -"@typescript-eslint/types@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.51.0.tgz#e7c1622f46c7eea7e12bbf1edfb496d4dec37c90" - integrity sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw== - -"@typescript-eslint/typescript-estree@2.30.0": - version "2.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz#1b8e848b55144270255ffbfe4c63291f8f766615" - integrity sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^6.3.0" - tsutils "^3.17.1" - -"@typescript-eslint/typescript-estree@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz#ebd6294c0ea97891fce6af536048181e23d729c8" - integrity sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA== - dependencies: - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/visitor-keys" "5.49.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" +"@typescript-eslint/types@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.9.1.tgz#a6cfc20db0fcedcb2f397ea728ef583e0ee72459" + integrity sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ== -"@typescript-eslint/typescript-estree@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz#0ec8170d7247a892c2b21845b06c11eb0718f8de" - integrity sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA== +"@typescript-eslint/typescript-estree@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz#8c77910a49a04f0607ba94d78772da07dab275ad" + integrity sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw== dependencies: - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/visitor-keys" "5.51.0" + "@typescript-eslint/types" "6.9.1" + "@typescript-eslint/visitor-keys" "6.9.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.49.0.tgz#1c07923bc55ff7834dfcde487fff8d8624a87b32" - integrity sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.49.0" - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/typescript-estree" "5.49.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/utils@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.51.0.tgz#074f4fabd5b12afe9c8aa6fdee881c050f8b4d47" - integrity sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.51.0" - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/typescript-estree" "5.51.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/visitor-keys@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz#2561c4da3f235f5c852759bf6c5faec7524f90fe" - integrity sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg== - dependencies: - "@typescript-eslint/types" "5.49.0" - eslint-visitor-keys "^3.3.0" +"@typescript-eslint/utils@6.9.1", "@typescript-eslint/utils@^6.0.0": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.9.1.tgz#763da41281ef0d16974517b5f0d02d85897a1c1e" + integrity sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.9.1" + "@typescript-eslint/types" "6.9.1" + "@typescript-eslint/typescript-estree" "6.9.1" + semver "^7.5.4" -"@typescript-eslint/visitor-keys@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz#c0147dd9a36c0de758aaebd5b48cae1ec59eba87" - integrity sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ== +"@typescript-eslint/visitor-keys@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz#6753a9225a0ba00459b15d6456b9c2780b66707d" + integrity sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw== dependencies: - "@typescript-eslint/types" "5.51.0" - eslint-visitor-keys "^3.3.0" + "@typescript-eslint/types" "6.9.1" + eslint-visitor-keys "^3.4.1" "@walletconnect/browser-utils@^1.8.0": version "1.8.0" @@ -5668,7 +5588,7 @@ acorn-walk@^8.0.2, acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@7.1.1, acorn@8.5.0, acorn@^7.1.1, acorn@^7.4.0, acorn@^8.0.4, acorn@^8.1.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.8.1, acorn@^8.8.2: +acorn@7.1.1, acorn@8.5.0, acorn@^7.4.0, acorn@^8.0.4, acorn@^8.1.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.8.1, acorn@^8.8.2: version "8.5.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== @@ -5844,7 +5764,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.0.2: +array-includes@^3.0.2, array-includes@^3.1.7: version "3.1.7" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== @@ -5855,15 +5775,6 @@ array-includes@^3.0.2: get-intrinsic "^1.2.1" is-string "^1.0.7" -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" - array-includes@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" @@ -5891,37 +5802,27 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz#bc229aef98f6bd0533a2bc61ff95209875526c9b" - integrity sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw== +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.1" -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" - integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - function-bind "^1.1.1" - array.prototype.flatmap@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" @@ -5932,6 +5833,16 @@ array.prototype.flatmap@^1.3.1: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + array.prototype.reduce@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" @@ -5943,17 +5854,16 @@ array.prototype.reduce@^1.0.6: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== +array.prototype.tosorted@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== dependencies: - array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" arraybuffer.prototype.slice@^1.0.2: version "1.0.2" @@ -6069,6 +5979,13 @@ async@^3.2.1, async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -6837,7 +6754,7 @@ chalk@3.0.0, chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -6859,11 +6776,6 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -6951,18 +6863,6 @@ cli-color@^2.0.3: memoizee "^0.4.15" timers-ext "^0.1.7" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -7361,17 +7261,6 @@ cross-fetch@^3.1.4, cross-fetch@^3.1.6: dependencies: node-fetch "^2.6.11" -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -7622,6 +7511,15 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delay@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" @@ -7982,7 +7880,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: +es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: version "1.17.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== @@ -8039,51 +7937,6 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.19.0, es-abstract@^1.20.4: unbox-primitive "^1.0.2" which-typed-array "^1.1.9" -es-abstract@^1.21.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" - es-abstract@^1.22.1: version "1.22.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" @@ -8149,6 +8002,26 @@ es-get-iterator@^1.1.2: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" +es-iterator-helpers@^1.0.12: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" @@ -8289,7 +8162,7 @@ eslint-config-typestrict@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-config-typestrict/-/eslint-config-typestrict-1.0.0.tgz#fdb9876c1ea72a1fc743b964464cb0b730b60f11" integrity sha512-mC3wdJwrYp9O27w4oDU9q0xKdqivSBXSltc31hk8zsiSyDgOwadSEvFPeRjS8uxl9qKUhgS+8MAcX/SJ52fWpA== -eslint-import-resolver-node@^0.3.7: +eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== @@ -8305,42 +8178,42 @@ eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" -eslint-plugin-deprecation@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-1.3.3.tgz#065b5d36ff220afe139f2b19af57454a13464731" - integrity sha512-Bbkv6ZN2cCthVXz/oZKPwsSY5S/CbgTLRG4Q2s2gpPpgNsT0uJ0dB5oLNiWzFYY8AgKX4ULxXFG1l/rDav9QFA== +eslint-plugin-deprecation@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-2.0.0.tgz#9804707a4c19f3a53615c6babc0ced3d429d69cf" + integrity sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ== dependencies: - "@typescript-eslint/experimental-utils" "^5.0.0" + "@typescript-eslint/utils" "^6.0.0" tslib "^2.3.1" tsutils "^3.21.0" -eslint-plugin-import@^2.28.1: - version "2.28.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" - integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== +eslint-plugin-import@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" + integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== dependencies: - array-includes "^3.1.6" - array.prototype.findlastindex "^1.2.2" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + 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.7" + eslint-import-resolver-node "^0.3.9" eslint-module-utils "^2.8.0" - has "^1.0.3" - is-core-module "^2.13.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.6" - object.groupby "^1.0.0" - object.values "^1.1.6" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" semver "^6.3.1" tsconfig-paths "^3.14.2" -eslint-plugin-no-only-tests@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.4.0.tgz#7d565434aa7d16ccc7eea957c391d98f827332ca" - integrity sha512-azP9PwQYfGtXJjW273nIxQH9Ygr+5/UyeW2wEjYoDtVYPI+WPKwbj0+qcAKYUXFZLRumq4HKkFaoDBAwBoXImQ== +eslint-plugin-no-only-tests@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz#f38e4935c6c6c4842bf158b64aaa20c366fe171b" + integrity sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw== eslint-plugin-no-relative-import-paths@^1.5.2: version "1.5.2" @@ -8352,43 +8225,44 @@ eslint-plugin-react-hooks@^4.6.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@^7.22.0: - version "7.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" - integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== +eslint-plugin-react@^7.33.2: + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: - array-includes "^3.1.1" - array.prototype.flatmap "^1.2.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" - has "^1.0.3" + es-iterator-helpers "^1.0.12" + estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" - object.entries "^1.1.2" - object.fromentries "^2.0.2" - object.values "^1.1.1" - prop-types "^15.7.2" - resolve "^1.18.1" - string.prototype.matchall "^4.0.2" - -eslint-plugin-simple-import-sort@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-5.0.3.tgz#9ae258ddada6efffc55e47a134afbd279eb31fc6" - integrity sha512-1rf3AWiHeWNCQdAq0iXNnlccnH1UDnelGgrPbjBBHE8d2hXVtOudcmy0vTF4hri3iJ0MKz8jBhmH6lJ0ZWZLHQ== + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" -eslint-plugin-sonarjs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.5.0.tgz#ce17b2daba65a874c2862213a9e38e8986ad7d7d" - integrity sha512-XW5MnzlRjhXpIdbULC/qAdJYHWw3rRLws/DyawdlPU/IdVr9AmRK1r2LaCvabwKOAW2XYYSo3kDX58E4MrB7PQ== +eslint-plugin-simple-import-sort@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351" + integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw== -eslint-plugin-unused-imports@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-0.1.2.tgz#478a1a298f91152102f05acc0857804a949c0498" - integrity sha512-uribBu/L3/+XFGY3ticZTcWxkcrhISphjrfiKkZ/gxFa3u0EIPfc4MNtwrk6gcg7Mhs+InDxXoUxd5HEZtaw3w== +eslint-plugin-sonarjs@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.23.0.tgz#0265bad801ea210951672ee3cafbcf5d456ada96" + integrity sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg== + +eslint-plugin-unused-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz#d25175b0072ff16a91892c3aa72a09ca3a9e69e7" + integrity sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw== dependencies: - "@typescript-eslint/eslint-plugin" "^2.3.0" - eslint "^6.3.0" eslint-rule-composer "^0.3.0" - requireindex "~1.1.0" - typescript "^3.6.3" eslint-rule-composer@^0.3.0: version "0.3.0" @@ -8403,28 +8277,6 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" - integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== - dependencies: - eslint-visitor-keys "^1.1.0" - eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -8432,13 +8284,6 @@ eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" @@ -8449,58 +8294,15 @@ eslint-visitor-keys@^1.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== - eslint-visitor-keys@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^6.3.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - 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" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" +eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^7.10.0: version "7.10.0" @@ -8545,15 +8347,6 @@ eslint@^7.10.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - espree@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" @@ -8568,13 +8361,6 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" - integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== - dependencies: - estraverse "^5.0.0" - esquery@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" @@ -8582,13 +8368,6 @@ esquery@^1.2.0: dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -8596,21 +8375,21 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= -estraverse@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" - integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== - estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== +estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + estree-walker@^2, estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" @@ -8973,15 +8752,6 @@ extend@^3.0.2, extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extract-files@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" @@ -9077,13 +8847,6 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -9284,6 +9047,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" @@ -9532,10 +9300,10 @@ graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== graphql-request@^3.4.0: version "3.4.0" @@ -9634,6 +9402,13 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + hdkey@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-2.0.1.tgz#0a211d0c510bfc44fa3ec9d44b13b634641cad74" @@ -9836,7 +9611,7 @@ i18next@^23.5.1: dependencies: "@babel/runtime" "^7.22.5" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -9877,6 +9652,11 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -9934,39 +9714,11 @@ inline-style-prefixer@^6.0.0: css-in-js-utils "^3.1.0" fast-loops "^1.1.3" -inquirer@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - int64-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-1.0.1.tgz#c78d841b444cadf036cd04f8683696c740f15dca" integrity sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw== -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== - dependencies: - es-abstract "^1.17.0-next.1" - has "^1.0.3" - side-channel "^1.0.2" - internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" @@ -10023,6 +9775,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -10062,6 +9821,13 @@ is-core-module@^2.13.0: dependencies: has "^1.0.3" +is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -10079,6 +9845,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -10099,7 +9872,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== @@ -10165,11 +9938,6 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - is-promise@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" @@ -10371,6 +10139,17 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + jayson@^3.4.4: version "3.7.0" resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.7.0.tgz#b735b12d06d348639ae8230d7a1e2916cb078f25" @@ -11159,14 +10938,6 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -11175,6 +10946,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + lie@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" @@ -11847,11 +11626,6 @@ multipipe@^1.0.2: duplexer2 "^0.1.2" object-assign "^4.1.0" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@2.14.0: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -11901,11 +11675,6 @@ nanoid@^4.0.0: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.1.tgz#398d7ccfdbf9faf2231b2ca7e8fff5dbca6a509b" integrity sha512-udKGtCCUafD3nQtJg9wBhRP3KMbPglUsgV5JVsXhvyBs/oefqb4sqMEhKBBgqZncYowu58p1prsZQBYvAj/Gww== -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -11967,11 +11736,6 @@ nextjs-sitemap-generator@^1.3.1: dependencies: date-fns "^2.9.0" -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -12166,7 +11930,7 @@ object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.0.3: +object.entries@^1.0.3, object.entries@^1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== @@ -12175,25 +11939,6 @@ object.entries@^1.0.3: define-properties "^1.2.0" es-abstract "^1.22.1" -object.entries@^1.1.2: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - object.fromentries@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" @@ -12203,6 +11948,15 @@ object.fromentries@^2.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + object.getownpropertydescriptors@^2.0.2: version "2.1.7" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" @@ -12214,17 +11968,25 @@ object.getownpropertydescriptors@^2.0.2: es-abstract "^1.22.1" safe-array-concat "^1.0.0" -object.groupby@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.0.tgz#cb29259cf90f37e7bac6437686c1ea8c916d12a9" - integrity sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw== +object.groupby@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - es-abstract "^1.21.2" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" -object.values@^1.0.3: +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.0.3, object.values@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== @@ -12233,16 +11995,6 @@ object.values@^1.0.3: define-properties "^1.2.0" es-abstract "^1.22.1" -object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - object.values@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" @@ -12290,13 +12042,6 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -12317,7 +12062,7 @@ opener@^1.5.2: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -optionator@^0.8.1, optionator@^0.8.3: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -12346,11 +12091,6 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -12486,11 +12226,6 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -12850,7 +12585,7 @@ prop-types@^15.5.8: object-assign "^4.1.1" react-is "^16.8.1" -prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -13352,6 +13087,18 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -13367,14 +13114,6 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== -regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" @@ -13393,21 +13132,11 @@ regexp.prototype.flags@^1.5.1: define-properties "^1.2.0" set-function-name "^2.0.0" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0, regexpp@^3.1.0: +regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -13457,11 +13186,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -requireindex@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -13499,7 +13223,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@1.22.4, resolve@^1.12.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4: +resolve@1.22.4, resolve@^1.12.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4, resolve@^2.0.0-next.4: version "1.22.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== @@ -13522,14 +13246,6 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -13647,13 +13363,6 @@ rtl-css-js@^1.14.0: dependencies: "@babel/runtime" "^7.1.2" -run-async@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== - dependencies: - is-promise "^2.1.0" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -13675,13 +13384,6 @@ rxjs@^6.0.0, rxjs@^6.2.0: dependencies: tslib "^1.9.0" -rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - rxjs@^6.6.3: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -13869,17 +13571,12 @@ semver@4.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= -semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== - semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -13894,13 +13591,6 @@ semver@^7.2.1: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - semver@^7.3.8: version "7.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" @@ -13974,7 +13664,7 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-name@^2.0.0: +set-function-name@^2.0.0, set-function-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== @@ -14006,13 +13696,6 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -14020,24 +13703,11 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== - dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" - side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -14047,11 +13717,6 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - signal-exit@^3.0.3: version "3.0.6" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" @@ -14479,17 +14144,20 @@ string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== +string.prototype.matchall@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" string.prototype.padend@^3.0.0: version "3.1.5" @@ -14677,11 +14345,6 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-json-comments@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" - integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== - sturdy-websocket@^0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/sturdy-websocket/-/sturdy-websocket-0.1.12.tgz#84bb779f948b585a695f76961dc7d1c4a5e87629" @@ -14954,7 +14617,7 @@ through2@~0.4.1: readable-stream "~1.0.17" xtend "~2.1.1" -through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -15008,13 +14671,6 @@ tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tmp@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -15103,6 +14759,11 @@ triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + ts-command-line-args@^2.2.0: version "2.4.2" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz#b4815b23c35f8a0159d4e69e01012d95690bc448" @@ -15173,13 +14834,6 @@ tslib@1.14.1, tslib@2.2.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3, tslib@^2.0. resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== - dependencies: - tslib "^1.8.1" - tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -15328,11 +14982,6 @@ typeforce@^1.18.0: resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== -typescript@^3.6.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== - typescript@^4.9.5: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" @@ -16052,6 +15701,24 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + which-collection@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" @@ -16067,7 +15734,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2: +which-typed-array@^1.1.11, which-typed-array@^1.1.2: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== @@ -16090,13 +15757,6 @@ which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"