From 0e22ed15d51a4550abc0e049ed307efda9f60be4 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 20:54:02 +0000 Subject: [PATCH] temp+fix(11481): android system alert respects dark mode themes (#11552) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** In android our system alerts do not respect our dark mode themes as they should. KNOWN BUG: When switching from light mode to dark mode the changes to Android system alerts do not happen. The user is forced to close the app and reopen and the alerts will be in dark mode. However switching from dark to light mode is fine. Would love feedback on how to solve this issue I've created an issue for this bug [here](https://github.com/MetaMask/metamask-mobile/issues/11553) ## **Related issues** Fixes: [#11481](https://github.com/MetaMask/metamask-mobile/issues/11481) ## **Manual testing steps** 1. Make sure you're using an Android device, rebuild or reinstall a fresh app to make sure the changes are there. 2. Goto Android system settings and select light mode 3. Goto the MetaMask wallet home page 4. Click on the QR code on the top right 5. Scan an invalid QR code 6. See that the system alert is white background with black text 7. Go to the Android settings and change it to dark mode 8. Go back to the MetaMask app and scan the invalid QR code again, you should see a dark alert with white text. If not force close the app and reopen and the changes will take place ## **Screenshots/Recordings** NA ### **Before** | Dark Mode (broken) | Light Mode (not broken) |:---:|:---:| |![Screenshot_1727810220](https://github.com/user-attachments/assets/c0d3dd99-6939-4199-918f-d127b1bd6dd7)|![Screenshot_1727809386](https://github.com/user-attachments/assets/7a1e40fb-236d-4de4-811d-7c6d3155691e)|| ### **After** | Dark Mode | Light Mode | |:---:|:---:| |![darkmode](https://github.com/user-attachments/assets/543b0c4d-6e69-48c2-b965-2764378f6f03)]|![Screenshot_1727809386](https://github.com/user-attachments/assets/7a1e40fb-236d-4de4-811d-7c6d3155691e)| ## **Pre-merge author checklist** - [x] I’ve followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- .depcheckrc.yml | 2 - .github/CODEOWNERS | 29 - .github/scripts/bitrise/.yarnrc | 1 - .github/scripts/package.json | 32 - .github/scripts/tsconfig.json | 3 - .github/scripts/yarn.lock | 1318 ---------- .github/workflows/add-release-label.yml | 4 +- .github/workflows/check-pr-labels.yml | 3 +- .../check-template-and-add-labels.yml | 3 +- .github/workflows/ci.yml | 74 +- .github/workflows/close-bug-report.yml | 3 +- .github/workflows/crowdin_action.yml | 2 + .github/workflows/docker.yml | 7 +- .github/workflows/fitness-functions.yml | 3 +- .github/workflows/run-bitrise-e2e-check.yml | 3 +- .js.env.example | 2 - .storybook/main.js | 1 - .storybook/storybook.requires.js | 10 +- CHANGELOG.md | 90 + Gemfile | 10 + ios/Gemfile.lock => Gemfile.lock | 0 README.md | 11 +- android/app/build.gradle | 4 +- android/app/google-services-example.json | 11 +- app/actions/onboarding/index.js | 20 + app/actions/onboarding/index.ts | 28 - .../__snapshots__/TagBase.test.tsx.snap | 111 +- .../CellSelectWithMenu.test.tsx.snap | 355 ++- .../KeyValueLabel/KeyValueLabel.styles.tsx | 11 - .../KeyValueLabel/KeyValueLabel.tsx | 64 - .../KeyValueRoot/KeyValueRoot.styles.tsx | 13 - .../KeyValueRow/KeyValueRoot/KeyValueRoot.tsx | 37 - .../KeyValueRow/KeyValueRow.stories.tsx | 97 - .../KeyValueRow/KeyValueRow.styles.ts | 12 - .../KeyValueRow/KeyValueRow.test.tsx | 104 - .../KeyValueRow/KeyValueRow.tsx | 93 - .../KeyValueRow/KeyValueRow.types.ts | 157 -- .../KeyValueRow/KeyValueRow.utils.ts | 8 - .../KeyValueSection.styles.tsx | 10 - .../KeyValueSection/KeyValueSection.tsx | 34 - .../__snapshots__/KeyValueRow.test.tsx.snap | 609 ----- .../components-temp/KeyValueRow/index.tsx | 8 - .../ListItemMultiSelectButton.test.tsx.snap | 11 +- .../Cell/__snapshots__/Cell.test.tsx.snap | 798 +++--- .../CellMultiSelect.test.tsx.snap | 430 ++- .../__snapshots__/CellSelect.test.tsx.snap | 368 ++- .../List/ListItem/ListItem.constants.ts | 4 - .../List/ListItem/ListItem.stories.tsx | 30 - .../List/ListItem/ListItem.styles.ts | 15 +- .../List/ListItem/ListItem.test.tsx | 54 +- .../components/List/ListItem/ListItem.tsx | 40 +- .../List/ListItem/ListItem.types.ts | 18 +- .../__snapshots__/ListItem.test.tsx.snap | 77 +- .../ListItemMultiSelect.styles.ts | 1 + .../ListItemMultiSelect.test.tsx.snap | 62 +- .../ListItemSelect/ListItemSelect.styles.ts | 3 +- .../ListItemSelect.test.tsx.snap | 16 +- .../Pickers/PickerAccount/PickerAccount.tsx | 2 +- .../__snapshots__/PickerAccount.test.tsx.snap | 10 +- .../Pickers/PickerBase/PickerBase.tsx | 2 +- .../__snapshots__/PickerBase.test.tsx.snap | 2 +- .../__snapshots__/SelectButton.test.tsx.snap | 311 ++- .../SelectButtonBase.test.tsx.snap | 311 ++- .../__snapshots__/SelectOption.test.tsx.snap | 360 ++- .../Select/SelectValue/SelectValue.styles.ts | 1 - .../__snapshots__/SelectValue.test.tsx.snap | 312 ++- .../{ModalDragger.tsx => ModalDragger.js} | 14 +- .../{SelectorButton.tsx => SelectorButton.js} | 20 +- .../Base/{Summary.tsx => Summary.js} | 69 +- app/components/Nav/Main/MainNavigator.js | 19 +- app/components/Nav/Main/RootRPCMethodsUI.js | 2 - app/components/Nav/Main/index.js | 30 +- .../AccountSelector.test.tsx | 31 +- .../AccountSelector.test.tsx.snap | 2302 ++++++++--------- .../UI/AddCustomCollectible/index.tsx | 20 +- .../__snapshots__/index.test.tsx.snap | 3 +- app/components/UI/AddCustomToken/index.js | 30 +- .../UI/AddressCopy/AddressCopy.styles.ts | 10 +- app/components/UI/AddressCopy/AddressCopy.tsx | 2 +- .../UI/ApprovalTagUrl/ApprovalTagUrl.tsx | 12 +- app/components/UI/AssetList/index.js | 2 + .../AssetOverview/Balance/Balance.styles.tsx | 4 +- .../UI/AssetOverview/Balance/Balance.tsx | 9 +- .../Balance/__snapshots__/index.test.tsx.snap | 128 +- .../ChartNavigationButton.styles.tsx | 3 +- .../ChartNavigationButton.tsx | 7 +- .../UI/AssetOverview/Price/Price.styles.tsx | 13 +- .../UI/AssetOverview/Price/Price.tsx | 23 +- .../AssetOverview/PriceChart/PriceChart.tsx | 4 +- .../StakingEarnings.styles.tsx | 3 +- .../StakingEarnings.test.tsx.snap | 61 +- .../AssetOverview/StakingEarnings/index.tsx | 5 +- .../MarketDetailsList/MarketDetailsList.tsx | 8 +- .../MarketDetailsList.test.tsx.snap | 62 +- .../TokenDetails/TokenDetails.styles.tsx | 4 +- .../TokenDetailsList/TokenDetailsList.tsx | 5 +- .../TokenDetailsList.test.tsx.snap | 62 +- .../__snapshots__/TokenDetails.test.tsx.snap | 124 +- .../__snapshots__/AssetOverview.test.tsx.snap | 143 +- app/components/UI/AssetSearch/index.tsx | 6 +- .../BasicFunctionalityModal.tsx | 21 +- .../{index.tsx => index.js} | 42 +- .../UI/BottomModal/BottomModal.test.tsx | 19 - app/components/UI/BottomModal/BottomModal.tsx | 42 - .../__snapshots__/BottomModal.test.tsx.snap | 124 - app/components/UI/BottomModal/index.tsx | 1 - .../UI/ComponentErrorBoundary/index.js | 58 + .../UI/ComponentErrorBoundary/index.tsx | 57 - .../UI/ConfirmAddAsset/ConfirmAddAsset.tsx | 12 +- app/components/UI/ConnectHeader/index.js | 61 + app/components/UI/ConnectHeader/index.tsx | 57 - .../UI/FadeView/{index.tsx => index.js} | 51 +- .../{index.android.tsx => index.android.js} | 34 +- .../MultiAssetListItems.tsx | 4 +- app/components/UI/Navbar/index.js | 8 +- .../NetworkVerificationInfo.tsx | 36 +- app/components/UI/Notification/List/index.tsx | 8 +- .../{index.tsx => index.js} | 25 +- .../UI/OnboardingScreenWithBg/index.js | 64 + .../UI/OnboardingScreenWithBg/index.tsx | 75 - .../PermissionsSummary.styles.ts | 36 +- .../PermissionsSummary.test.tsx | 13 - .../PermissionsSummary/PermissionsSummary.tsx | 310 +-- .../PermissionsSummary.types.ts | 4 +- .../PermissionsSummary.test.tsx.snap | 1475 +++++------ .../__snapshots__/Settings.test.tsx.snap | 1308 +++++----- .../UI/SearchTokenAutocomplete/index.tsx | 3 +- .../Views/InputView/StakeInputView.test.tsx | 10 +- .../Stake/Views/InputView/StakeInputView.tsx | 11 +- .../StakeInputView.test.tsx.snap | 1 - .../components/EstimatedAnnualRewardsCard.tsx | 5 +- .../LearnMoreModal/LearnMoreModal.styles.ts | 35 - .../LearnMoreModal/LearnMoreModal.test.tsx | 44 - .../LearnMoreModal.test.tsx.snap | 726 ------ .../Stake/components/LearnMoreModal/index.tsx | 115 - .../StakingBalance/StakingBalance.styles.ts | 34 - .../StakingBalance/StakingBalance.test.tsx | 50 - .../StakingBalance/StakingBalance.tsx | 159 -- .../StakingBalance/StakingBalance.types.ts | 52 - .../ClaimBanner/ClaimBanner.styles.ts | 10 - .../ClaimBanner/ClaimBanner.tsx | 61 - .../UnstakeBanner/UnstakeBanner.tsx | 34 - .../UnstakeBanner/utils/index.test.ts | 106 - .../UnstakeBanner/utils/index.ts | 56 - .../StakingButtons/StakingButtons.styles.tsx | 15 - .../StakingButtons/StakingButtons.tsx | 54 - .../StakingCta/StakingCta.styles.tsx | 18 - .../StakingCta/StakingCta.test.tsx | 21 - .../StakingBalance/StakingCta/StakingCta.tsx | 53 - .../__snapshots__/StakingCta.test.tsx.snap | 114 - .../StakingBalance.test.tsx.snap | 924 ------- .../components/StakingBalance/mockData.ts | 75 - .../components/StakingBalance/utils/index.ts | 44 - .../components/images/LearnMoreEthBanner.png | Bin 115999 -> 0 bytes app/components/UI/Stake/constants/index.ts | 3 - app/components/UI/Stake/routes/index.tsx | 38 - .../Stake/utils/bignumber/bignumber.test.ts | 137 - .../UI/Stake/utils/bignumber/index.ts | 37 - app/components/UI/Stake/utils/value/index.ts | 109 - .../UI/Stake/utils/value/value.test.ts | 1905 -------------- .../Swaps/components/{Ratio.tsx => Ratio.js} | 41 +- .../UI/SwitchCustomNetwork/index.js | 36 +- .../UI/SwitchCustomNetwork/index.test.tsx | 16 - app/components/UI/Tokens/index.tsx | 2 +- app/components/UI/TransactionHeader/index.js | 12 +- .../UI/WalletAccount/WalletAccount.styles.ts | 2 +- .../__snapshots__/WalletAccount.test.tsx.snap | 22 +- .../Views/AccountConnect/AccountConnect.tsx | 26 +- .../AccountConnect/AccountConnect.types.ts | 1 - .../AccountConnectMultiSelector.styles.ts | 16 +- .../AccountConnectMultiSelector.tsx | 25 +- .../AccountConnectMultiSelector.types.ts | 1 - .../AccountPermissions/AccountPermissions.tsx | 19 +- .../AccountPermissionsConnected.tsx | 14 +- .../__snapshots__/AddAsset.test.tsx.snap | 4 +- .../Views/Asset/ActivityHeader.styles.tsx | 15 +- app/components/Views/Asset/ActivityHeader.tsx | 8 +- .../__snapshots__/index.test.tsx.snap | 641 ++--- .../NetworkConnectMultiSelector.styles.ts | 14 +- .../NetworkConnectMultiSelector.tsx | 3 +- .../NetworkConnectMultiSelector.types.ts | 1 - .../NetworkSelector.test.tsx.snap | 568 ++-- .../Details/Fields/NetworkFeeField.test.tsx | 20 +- .../Views/Notifications/OptIn/index.test.tsx | 90 +- .../Views/Notifications/OptIn/index.tsx | 20 +- app/components/Views/Notifications/index.tsx | 6 +- app/components/Views/Notifications/styles.ts | 1 - .../__snapshots__/index.test.tsx.snap | 729 +----- .../Views/OnboardingCarousel/index.js | 273 ++ .../Views/OnboardingCarousel/index.test.tsx | 43 +- .../Views/OnboardingCarousel/index.tsx | 302 --- .../PickComponent/{index.tsx => index.js} | 64 +- .../__snapshots__/index.test.tsx.snap | 4 +- .../Views/Settings/AdvancedSettings/index.js | 53 +- .../__snapshots__/index.test.tsx.snap | 89 - .../AutoDetectNFTSettings/index.constants.ts | 2 - .../AutoDetectNFTSettings/index.styles.ts | 29 - .../AutoDetectNFTSettings/index.test.tsx | 158 -- .../Settings/AutoDetectNFTSettings/index.tsx | 83 - .../__snapshots__/index.test.tsx.snap | 91 - .../index.constants.ts | 1 - .../AutoDetectTokensSettings/index.styles.ts | 29 - .../AutoDetectTokensSettings/index.test.tsx | 68 - .../AutoDetectTokensSettings/index.tsx | 64 - .../NotificationsSettings/index.test.tsx | 160 +- .../Settings/NotificationsSettings/index.tsx | 15 +- .../PermissionsManager.tsx | 6 +- .../SecuritySettings/SecuritySettings.tsx | 73 +- .../SecuritySettings.test.tsx.snap | 134 +- app/components/Views/Settings/index.tsx | 4 +- .../test/SnapPermissions.test.tsx | 17 +- .../Wallet/__snapshots__/index.test.tsx.snap | 22 +- app/components/Views/Wallet/index.tsx | 6 +- .../confirmations/Confirm/Confirm.test.tsx | 14 - .../Views/confirmations/Confirm/Confirm.tsx | 31 - .../__snapshots__/Confirm.test.tsx.snap | 279 -- .../Views/confirmations/Confirm/index.tsx | 1 - .../Views/confirmations/Confirm/style.tsx | 19 - .../AddNickname/types.ts | 4 +- .../components/Confirm/Footer/Footer.test.tsx | 38 - .../components/Confirm/Footer/Footer.tsx | 37 - .../Footer/__snapshots__/Footer.test.tsx.snap | 130 - .../components/Confirm/Footer/index.ts | 1 - .../components/Confirm/Footer/style.ts | 27 - .../components/Confirm/Title/Title.test.tsx | 14 - .../components/Confirm/Title/Title.tsx | 36 - .../Title/__snapshots__/Title.test.tsx.snap | 24 - .../components/Confirm/Title/index.ts | 1 - .../components/Confirm/Title/style.ts | 19 - .../components/SignatureRequest/Root/Root.tsx | 10 +- .../hooks/useConfirmationRedesignEnabled.ts | 21 - app/constants/navigation/Routes.ts | 6 +- app/constants/time.ts | 10 - app/core/Analytics/MetaMetrics.events.ts | 8 - app/core/BackgroundBridge/BackgroundBridge.js | 2 +- .../ParseManager/parseDeeplink.ts | 11 +- app/core/Engine.test.js | 34 +- app/core/Engine.ts | 424 +-- app/core/EngineService/EngineService.ts | 10 +- app/core/NotificationManager.js | 17 +- app/core/NotificationsManager.test.ts | 40 +- app/core/Performance/Performance.test.ts | 28 +- app/core/Performance/Performance.ts | 12 +- .../KeyringSnapPermissions.test.ts | 153 -- app/core/SnapKeyring/SnapKeyring.test.ts | 133 - app/core/SnapKeyring/SnapKeyring.ts | 102 - app/core/SnapKeyring/index.ts | 1 - .../SnapKeyring/keyringSnapsPermissions.ts | 103 - app/core/SnapKeyring/types.ts | 42 - app/core/Snaps/SnapBridge.ts | 4 +- app/core/Snaps/SnapsMethodMiddleware.ts | 40 +- app/core/Snaps/permissions/permissions.ts | 1 - app/core/Snaps/types.ts | 4 - app/core/Snaps/utils.ts | 19 - app/core/__mocks__/MockedEngine.ts | 29 +- app/declarations/index.d.ts | 2 - app/lib/snaps/SnapsExecutionWebView.tsx | 7 +- app/reducers/index.ts | 1 + app/selectors/addressBookController.test.ts | 8 +- app/selectors/addressBookController.ts | 4 +- app/selectors/types.ts | 4 +- app/store/migrations/029.ts | 4 +- app/util/address/index.test.ts | 89 +- app/util/address/index.ts | 17 +- .../{browserScripts.ts => browserScripts.js} | 12 +- app/util/{bytes.ts => bytes.js} | 5 +- app/util/checkAddress.test.ts | 16 +- app/util/checkAddress.ts | 4 +- app/util/date/index.js | 25 - app/util/date/index.test.ts | 56 - .../TrackOnboarding/trackOnboarding.ts | 5 +- app/util/networks/index.js | 2 +- .../notifications/androidChannels.test.ts | 50 - app/util/notifications/androidChannels.ts | 33 - app/util/notifications/hooks/index.test.ts | 90 +- app/util/notifications/hooks/index.ts | 96 +- app/util/notifications/index.ts | 4 +- app/util/notifications/methods/common.ts | 11 - .../notifications/pushPermissions.test.ts | 113 + app/util/notifications/pushPermissions.ts | 123 + .../services/NotificationService.test.ts | 138 - .../services/NotificationService.ts | 234 -- app/util/notifications/services/index.ts | 1 - .../settings/storage/constants.ts | 3 +- .../settings/storage/contants.test.ts | 4 +- .../setupAndroidChannels.test.ts | 25 + .../notifications/setupAndroidChannels.ts | 12 + .../notifications/types/notification/index.ts | 13 + .../smart-publish-hook.test.ts | 798 +++--- .../smart-transactions/smart-publish-hook.ts | 71 +- app/util/test/accountsControllerTestUtils.ts | 28 - app/util/test/confirm-data-helpers.ts | 35 - app/util/test/initial-background-state.json | 28 +- app/util/test/keyringControllerTestUtils.ts | 37 - app/util/validators/{index.ts => index.js} | 10 +- bitrise.yml | 32 +- docs/readme/environment.md | 2 +- e2e/helpers.js | 2 +- e2e/pages/AddCustomTokenView.js | 103 + e2e/pages/ConfirmAddAsset.js | 35 + e2e/pages/ContractNickNameView.js | 44 + e2e/pages/EnableDeviceNotificationsAlert.js | 36 - e2e/pages/ImportTokensView.js | 43 + e2e/pages/Onboarding/DefaultNetworkView.js | 29 + e2e/pages/Onboarding/MetaMetricsOptInView.js | 9 + e2e/pages/TokenOverview.js | 4 +- .../wallet/ImportNFTFlow/ImportNFTView.js | 31 - .../wallet/ImportTokenFlow/ConfirmAddAsset.js | 42 - .../ImportTokenFlow/ImportTokensView.js | 71 - e2e/selectors/AddCustomTokenView.selectors.js | 12 + e2e/selectors/ImportTokenView.selectors.js | 13 + .../PerformanceRegression.selectors.js | 4 - .../wallet/ImportNFTView.selectors.js | 8 - .../wallet/ImportTokenView.selectors.js | 28 - e2e/specs/assets/import-tokens.spec.js | 22 +- e2e/specs/assets/nft-details.spec.js | 8 +- .../add-edit-custom-eth-mainnet.failing.js | 115 + .../quarantine/contract-nickname.failing.js | 207 ++ e2e/specs/quarantine/import-nft.failing.js | 20 +- .../swap-token-chart.spec.js} | 9 +- e2e/specs/wallet/send-ERC-token.spec.js | 21 +- e2e/utils/Matchers.js | 13 +- e2e/viewHelper.js | 25 +- index.js | 16 + ios/Gemfile | 11 +- ios/MetaMask.xcodeproj/project.pbxproj | 36 +- ios/Podfile | 6 +- ios/Podfile.lock | 99 +- jest.config.js | 2 - locales/languages/en.json | 76 +- package.json | 59 +- ...smart-transactions-controller+11.0.0.patch | 15 + scripts/detox-setup.sh | 12 + scripts/docker/Dockerfile | 9 +- scripts/setup.mjs | 307 +-- sonar-project.properties | 2 +- storybook/decorators/withNavigation.tsx | 41 +- storybook/storyLoader.js | 24 +- .../ColdStartToOnboardingScreen.feature | 2 +- .../AddCustomImportTokensScreen.js | 22 +- .../Onboarding/OnboardingCarousel.js | 12 - wdio/screen-objects/TokenOverviewScreen.js | 4 +- .../testIDs/Screens/AddCustomToken.testIds.js | 11 + .../testIDs/Screens/AssetSearch.testIds.js | 3 + ...eDeviceNotificationsChecksAlert.testIds.js | 6 - .../Screens/NFTImportScreen.testIds.js | 7 + .../Screens/TokenOverviewScreen.testIds.js | 3 + .../app-launch-times.steps.js | 19 +- yarn.lock | 967 +++---- 349 files changed, 9355 insertions(+), 20583 deletions(-) delete mode 100644 .github/scripts/bitrise/.yarnrc delete mode 100644 .github/scripts/package.json delete mode 100644 .github/scripts/tsconfig.json delete mode 100644 .github/scripts/yarn.lock create mode 100644 Gemfile rename ios/Gemfile.lock => Gemfile.lock (100%) create mode 100644 app/actions/onboarding/index.js delete mode 100644 app/actions/onboarding/index.ts delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueLabel/KeyValueLabel.styles.tsx delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueLabel/KeyValueLabel.tsx delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueRoot/KeyValueRoot.styles.tsx delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueRoot/KeyValueRoot.tsx delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueRow.stories.tsx delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueRow.styles.ts delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueRow.test.tsx delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueRow.tsx delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueRow.types.ts delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueRow.utils.ts delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueSection/KeyValueSection.styles.tsx delete mode 100644 app/component-library/components-temp/KeyValueRow/KeyValueSection/KeyValueSection.tsx delete mode 100644 app/component-library/components-temp/KeyValueRow/__snapshots__/KeyValueRow.test.tsx.snap delete mode 100644 app/component-library/components-temp/KeyValueRow/index.tsx rename app/components/Base/{ModalDragger.tsx => ModalDragger.js} (80%) rename app/components/Base/{SelectorButton.tsx => SelectorButton.js} (65%) rename app/components/Base/{Summary.tsx => Summary.js} (58%) rename app/components/UI/BlockingActionModal/{index.tsx => index.js} (80%) delete mode 100644 app/components/UI/BottomModal/BottomModal.test.tsx delete mode 100644 app/components/UI/BottomModal/BottomModal.tsx delete mode 100644 app/components/UI/BottomModal/__snapshots__/BottomModal.test.tsx.snap delete mode 100644 app/components/UI/BottomModal/index.tsx create mode 100644 app/components/UI/ComponentErrorBoundary/index.js delete mode 100644 app/components/UI/ComponentErrorBoundary/index.tsx create mode 100644 app/components/UI/ConnectHeader/index.js delete mode 100644 app/components/UI/ConnectHeader/index.tsx rename app/components/UI/FadeView/{index.tsx => index.js} (62%) rename app/components/UI/GenericButton/{index.android.tsx => index.android.js} (74%) rename app/components/UI/OnboardingProgress/{index.tsx => index.js} (84%) create mode 100644 app/components/UI/OnboardingScreenWithBg/index.js delete mode 100644 app/components/UI/OnboardingScreenWithBg/index.tsx delete mode 100644 app/components/UI/Stake/components/LearnMoreModal/LearnMoreModal.styles.ts delete mode 100644 app/components/UI/Stake/components/LearnMoreModal/LearnMoreModal.test.tsx delete mode 100644 app/components/UI/Stake/components/LearnMoreModal/__snapshots__/LearnMoreModal.test.tsx.snap delete mode 100644 app/components/UI/Stake/components/LearnMoreModal/index.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingBalance.styles.ts delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingBalance.test.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingBalance.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingBalance.types.ts delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingBanners/ClaimBanner/ClaimBanner.styles.ts delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingBanners/ClaimBanner/ClaimBanner.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingBanners/UnstakeBanner/UnstakeBanner.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingBanners/UnstakeBanner/utils/index.test.ts delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingBanners/UnstakeBanner/utils/index.ts delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingButtons/StakingButtons.styles.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingButtons/StakingButtons.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingCta/StakingCta.styles.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingCta/StakingCta.test.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingCta/StakingCta.tsx delete mode 100644 app/components/UI/Stake/components/StakingBalance/StakingCta/__snapshots__/StakingCta.test.tsx.snap delete mode 100644 app/components/UI/Stake/components/StakingBalance/__snapshots__/StakingBalance.test.tsx.snap delete mode 100644 app/components/UI/Stake/components/StakingBalance/mockData.ts delete mode 100644 app/components/UI/Stake/components/StakingBalance/utils/index.ts delete mode 100644 app/components/UI/Stake/components/images/LearnMoreEthBanner.png delete mode 100644 app/components/UI/Stake/routes/index.tsx delete mode 100644 app/components/UI/Stake/utils/bignumber/bignumber.test.ts delete mode 100644 app/components/UI/Stake/utils/bignumber/index.ts delete mode 100644 app/components/UI/Stake/utils/value/index.ts delete mode 100644 app/components/UI/Stake/utils/value/value.test.ts rename app/components/UI/Swaps/components/{Ratio.tsx => Ratio.js} (73%) create mode 100644 app/components/Views/OnboardingCarousel/index.js delete mode 100644 app/components/Views/OnboardingCarousel/index.tsx rename app/components/Views/PickComponent/{index.tsx => index.js} (65%) delete mode 100644 app/components/Views/Settings/AutoDetectNFTSettings/__snapshots__/index.test.tsx.snap delete mode 100644 app/components/Views/Settings/AutoDetectNFTSettings/index.constants.ts delete mode 100644 app/components/Views/Settings/AutoDetectNFTSettings/index.styles.ts delete mode 100644 app/components/Views/Settings/AutoDetectNFTSettings/index.test.tsx delete mode 100644 app/components/Views/Settings/AutoDetectNFTSettings/index.tsx delete mode 100644 app/components/Views/Settings/AutoDetectTokensSettings/__snapshots__/index.test.tsx.snap delete mode 100644 app/components/Views/Settings/AutoDetectTokensSettings/index.constants.ts delete mode 100644 app/components/Views/Settings/AutoDetectTokensSettings/index.styles.ts delete mode 100644 app/components/Views/Settings/AutoDetectTokensSettings/index.test.tsx delete mode 100644 app/components/Views/Settings/AutoDetectTokensSettings/index.tsx delete mode 100644 app/components/Views/confirmations/Confirm/Confirm.test.tsx delete mode 100644 app/components/Views/confirmations/Confirm/Confirm.tsx delete mode 100644 app/components/Views/confirmations/Confirm/__snapshots__/Confirm.test.tsx.snap delete mode 100644 app/components/Views/confirmations/Confirm/index.tsx delete mode 100644 app/components/Views/confirmations/Confirm/style.tsx delete mode 100644 app/components/Views/confirmations/components/Confirm/Footer/Footer.test.tsx delete mode 100644 app/components/Views/confirmations/components/Confirm/Footer/Footer.tsx delete mode 100644 app/components/Views/confirmations/components/Confirm/Footer/__snapshots__/Footer.test.tsx.snap delete mode 100644 app/components/Views/confirmations/components/Confirm/Footer/index.ts delete mode 100644 app/components/Views/confirmations/components/Confirm/Footer/style.ts delete mode 100644 app/components/Views/confirmations/components/Confirm/Title/Title.test.tsx delete mode 100644 app/components/Views/confirmations/components/Confirm/Title/Title.tsx delete mode 100644 app/components/Views/confirmations/components/Confirm/Title/__snapshots__/Title.test.tsx.snap delete mode 100644 app/components/Views/confirmations/components/Confirm/Title/index.ts delete mode 100644 app/components/Views/confirmations/components/Confirm/Title/style.ts delete mode 100644 app/components/Views/confirmations/hooks/useConfirmationRedesignEnabled.ts delete mode 100644 app/constants/time.ts delete mode 100644 app/core/SnapKeyring/KeyringSnapPermissions.test.ts delete mode 100644 app/core/SnapKeyring/SnapKeyring.test.ts delete mode 100644 app/core/SnapKeyring/SnapKeyring.ts delete mode 100644 app/core/SnapKeyring/index.ts delete mode 100644 app/core/SnapKeyring/keyringSnapsPermissions.ts delete mode 100644 app/core/SnapKeyring/types.ts delete mode 100644 app/core/Snaps/types.ts delete mode 100644 app/core/Snaps/utils.ts rename app/util/{browserScripts.ts => browserScripts.js} (91%) rename app/util/{bytes.ts => bytes.js} (72%) delete mode 100644 app/util/notifications/androidChannels.test.ts delete mode 100644 app/util/notifications/androidChannels.ts create mode 100644 app/util/notifications/pushPermissions.test.ts create mode 100644 app/util/notifications/pushPermissions.ts delete mode 100644 app/util/notifications/services/NotificationService.test.ts delete mode 100644 app/util/notifications/services/NotificationService.ts delete mode 100644 app/util/notifications/services/index.ts create mode 100644 app/util/notifications/setupAndroidChannels.test.ts create mode 100644 app/util/notifications/setupAndroidChannels.ts delete mode 100644 app/util/test/confirm-data-helpers.ts delete mode 100644 app/util/test/keyringControllerTestUtils.ts rename app/util/validators/{index.ts => index.js} (75%) create mode 100644 e2e/pages/AddCustomTokenView.js create mode 100644 e2e/pages/ConfirmAddAsset.js create mode 100644 e2e/pages/ContractNickNameView.js delete mode 100644 e2e/pages/EnableDeviceNotificationsAlert.js create mode 100644 e2e/pages/ImportTokensView.js create mode 100644 e2e/pages/Onboarding/DefaultNetworkView.js delete mode 100644 e2e/pages/wallet/ImportNFTFlow/ImportNFTView.js delete mode 100644 e2e/pages/wallet/ImportTokenFlow/ConfirmAddAsset.js delete mode 100644 e2e/pages/wallet/ImportTokenFlow/ImportTokensView.js create mode 100644 e2e/selectors/AddCustomTokenView.selectors.js create mode 100644 e2e/selectors/ImportTokenView.selectors.js delete mode 100644 e2e/selectors/PerformanceRegression.selectors.js delete mode 100644 e2e/selectors/wallet/ImportNFTView.selectors.js delete mode 100644 e2e/selectors/wallet/ImportTokenView.selectors.js create mode 100644 e2e/specs/quarantine/add-edit-custom-eth-mainnet.failing.js create mode 100644 e2e/specs/quarantine/contract-nickname.failing.js rename e2e/specs/{quarantine/swap-token-chart.failing.js => swaps/swap-token-chart.spec.js} (95%) create mode 100644 patches/@metamask+smart-transactions-controller+11.0.0.patch create mode 100755 scripts/detox-setup.sh create mode 100644 wdio/screen-objects/testIDs/Screens/AddCustomToken.testIds.js create mode 100644 wdio/screen-objects/testIDs/Screens/AssetSearch.testIds.js delete mode 100644 wdio/screen-objects/testIDs/Screens/EnableDeviceNotificationsChecksAlert.testIds.js create mode 100644 wdio/screen-objects/testIDs/Screens/NFTImportScreen.testIds.js diff --git a/.depcheckrc.yml b/.depcheckrc.yml index e8fe7a446ec7..5a506bc7a51e 100644 --- a/.depcheckrc.yml +++ b/.depcheckrc.yml @@ -4,8 +4,6 @@ ignores: - 'webpack-cli' - '@react-native-community/datetimepicker' - '@react-native-community/slider' - - 'patch-package' - - '@lavamoat/allow-scripts' # This is used on the patch for TokenRatesController of Assets controllers, for we to be able to use the last version of it - cockatiel diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 536976ae7515..ef0325cdc08a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -63,32 +63,3 @@ patches/react-native+0.*.patch @MetaMask/supply-chain # Staking Team app/components/UI/Stake @MetaMask/metamask-staking - -# Assets Team -app/components/hooks/useIsOriginalNativeTokenSymbol @MetaMask/metamask-assets -app/components/hooks/useTokenBalancesController @MetaMask/metamask-assets -app/components/hooks/useTokenBalance.tsx @MetaMask/metamask-assets -app/components/hooks/useSafeChains.ts @MetaMask/metamask-assets -app/components/UI/AssetOverview @MetaMask/metamask-assets -app/components/UI/Collectibles @MetaMask/metamask-assets -app/components/UI/CollectibleContractElement @MetaMask/metamask-assets -app/components/UI/CollectivelContractInformation @MetaMask/metamask-assets -app/components/UI/CollectibleContractOverview @MetaMask/metamask-assets -app/components/UI/CollectibleContracts @MetaMask/metamask-assets -app/components/UI/CollectibleDetectionModal @MetaMask/metamask-assets -app/components/UI/CollectibleMedia @MetaMask/metamask-assets -app/components/UI/CollectibleModal @MetaMask/metamask-assets -app/components/UI/CollectibleOverview @MetaMask/metamask-assets -app/components/UI/ConfirmAddAsset @MetaMask/metamask-assets -app/components/UI/Tokens @MetaMask/metamask-assets -app/components/Views/AddAsset @MetaMask/metamask-assets -app/components/Views/Asset @MetaMask/metamask-assets -app/components/Views/AssetDetails @MetaMask/metamask-assets -app/components/Views/AssetHideConfirmation @MetaMask/metamask-assets -app/components/Views/AssetOptions @MetaMask/metamask-assets -app/components/Views/Collectible @MetaMask/metamask-assets -app/components/Views/CollectibleView @MetaMask/metamask-assets -app/components/Views/DetectedTokens @MetaMask/metamask-assets -app/components/Views/NFTAutoDetectionModal @MetaMask/metamask-assets -app/components/Views/NftDetails @MetaMask/metamask-assets -app/reducers/collectibles @MetaMask/metamask-assets diff --git a/.github/scripts/bitrise/.yarnrc b/.github/scripts/bitrise/.yarnrc deleted file mode 100644 index 5455c6c5d38c..000000000000 --- a/.github/scripts/bitrise/.yarnrc +++ /dev/null @@ -1 +0,0 @@ -ignore-scripts true diff --git a/.github/scripts/package.json b/.github/scripts/package.json deleted file mode 100644 index e2bf8d85b079..000000000000 --- a/.github/scripts/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@metamask/mobile-ci-scripts", - "private": true, - "scripts": { - "add-release-label-to-pr-and-linked-issues": "ts-node ./add-release-label-to-pr-and-linked-issues.ts", - "fitness-functions": "ts-node ./fitness-functions/index.ts", - "check-pr-has-required-labels": "ts-node ./check-pr-has-required-labels.ts", - "close-release-bug-report-issue": "ts-node ./close-release-bug-report-issue.ts", - "check-template-and-add-labels": "ts-node ./check-template-and-add-labels.ts", - "run-bitrise-e2e-check": "ts-node ./bitrise/run-bitrise-e2e-check.ts" - }, - "dependencies": { - "@actions/core": "^1.10.1", - "@actions/github": "^6.0.0", - "axios": "^1.7.4", - "simple-git": "^3.25.0" - }, - "devDependencies": { - "@lavamoat/allow-scripts": "^3.2.0", - "@lavamoat/preinstall-always-fail": "^2.1.0", - "@types/node": "^20.16.2", - "ts-node": "^10.5.0", - "typescript": "~5.4.5" - }, - "packageManager": "yarn@1.22.22", - "lavamoat": { - "allowScripts": { - "@lavamoat/preinstall-always-fail": false, - "ts-node>@swc/core": false - } - } -} diff --git a/.github/scripts/tsconfig.json b/.github/scripts/tsconfig.json deleted file mode 100644 index 4082f16a5d91..000000000000 --- a/.github/scripts/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../tsconfig.json" -} diff --git a/.github/scripts/yarn.lock b/.github/scripts/yarn.lock deleted file mode 100644 index 0a66131a3c41..000000000000 --- a/.github/scripts/yarn.lock +++ /dev/null @@ -1,1318 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@actions/core@^1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.1.tgz#61108e7ac40acae95ee36da074fa5850ca4ced8a" - integrity sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g== - dependencies: - "@actions/http-client" "^2.0.1" - uuid "^8.3.2" - -"@actions/github@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@actions/github/-/github-6.0.0.tgz#65883433f9d81521b782a64cc1fd45eef2191ea7" - integrity sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g== - dependencies: - "@actions/http-client" "^2.2.0" - "@octokit/core" "^5.0.1" - "@octokit/plugin-paginate-rest" "^9.0.0" - "@octokit/plugin-rest-endpoint-methods" "^10.0.0" - -"@actions/http-client@^2.0.1", "@actions/http-client@^2.2.0": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.3.tgz#31fc0b25c0e665754ed39a9f19a8611fc6dab674" - integrity sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA== - dependencies: - tunnel "^0.0.6" - undici "^5.25.4" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@fastify/busboy@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" - integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@kwsites/file-exists@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" - integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw== - dependencies: - debug "^4.1.1" - -"@kwsites/promise-deferred@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" - integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== - -"@lavamoat/aa@^4.3.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@lavamoat/aa/-/aa-4.3.0.tgz#eabc756f3838971e05321335035ae11f2b1aaf8a" - integrity sha512-Kwf64RpLDvWCzHdG1IEItGf0JfMH9DyjBhIAj1NNJQzmKIaFE/DCc6INKJu7iVqp7aVdKaVB3aJlV4/lKOmJDg== - dependencies: - resolve "1.22.8" - -"@lavamoat/allow-scripts@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lavamoat/allow-scripts/-/allow-scripts-3.2.0.tgz#bbd0f0039cf28670f0911b71af2c7554e0400872" - integrity sha512-UQmyNgOY4OLsHqv8YrRTvsf61NSp1rCO+NXAQNWxtG+qyrvPYqo5rfj3PdmwUOlwAHebPSVfc4Yz7+Eg+DRxkg== - dependencies: - "@lavamoat/aa" "^4.3.0" - "@npmcli/run-script" "8.1.0" - bin-links "4.0.4" - npm-normalize-package-bin "3.0.1" - yargs "17.7.2" - -"@lavamoat/preinstall-always-fail@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@lavamoat/preinstall-always-fail/-/preinstall-always-fail-2.1.0.tgz#048d71940d83d424e2ef625a8b81c4dc6d64645c" - integrity sha512-9xSsxxryPMyBWxfV+Ver7FZhvC1PhE1wDCsYFwsiqZzmeWH8e7Y7gWRFJqPw4M8WNbfeuPhKbLdCK3GsPz9gKg== - -"@npmcli/agent@^2.0.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.2.tgz#967604918e62f620a648c7975461c9c9e74fc5d5" - integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== - dependencies: - agent-base "^7.1.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.1" - lru-cache "^10.0.1" - socks-proxy-agent "^8.0.3" - -"@npmcli/fs@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" - integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== - dependencies: - semver "^7.3.5" - -"@npmcli/git@^5.0.0": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.8.tgz#8ba3ff8724192d9ccb2735a2aa5380a992c5d3d1" - integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== - dependencies: - "@npmcli/promise-spawn" "^7.0.0" - ini "^4.1.3" - lru-cache "^10.0.1" - npm-pick-manifest "^9.0.0" - proc-log "^4.0.0" - promise-inflight "^1.0.1" - promise-retry "^2.0.1" - semver "^7.3.5" - which "^4.0.0" - -"@npmcli/node-gyp@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" - integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== - -"@npmcli/package-json@^5.0.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.2.0.tgz#a1429d3111c10044c7efbfb0fce9f2c501f4cfad" - integrity sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ== - dependencies: - "@npmcli/git" "^5.0.0" - glob "^10.2.2" - hosted-git-info "^7.0.0" - json-parse-even-better-errors "^3.0.0" - normalize-package-data "^6.0.0" - proc-log "^4.0.0" - semver "^7.5.3" - -"@npmcli/promise-spawn@^7.0.0": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz#1d53d34ffeb5d151bfa8ec661bcccda8bbdfd532" - integrity sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ== - dependencies: - which "^4.0.0" - -"@npmcli/run-script@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-8.1.0.tgz#a563e5e29b1ca4e648a6b1bbbfe7220b4bfe39fc" - integrity sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== - dependencies: - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/package-json" "^5.0.0" - "@npmcli/promise-spawn" "^7.0.0" - node-gyp "^10.0.0" - proc-log "^4.0.0" - which "^4.0.0" - -"@octokit/auth-token@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" - integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== - -"@octokit/core@^5.0.1": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" - integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== - dependencies: - "@octokit/auth-token" "^4.0.0" - "@octokit/graphql" "^7.1.0" - "@octokit/request" "^8.3.1" - "@octokit/request-error" "^5.1.0" - "@octokit/types" "^13.0.0" - before-after-hook "^2.2.0" - universal-user-agent "^6.0.0" - -"@octokit/endpoint@^9.0.1": - version "9.0.5" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" - integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== - dependencies: - "@octokit/types" "^13.1.0" - universal-user-agent "^6.0.0" - -"@octokit/graphql@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" - integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== - dependencies: - "@octokit/request" "^8.3.0" - "@octokit/types" "^13.0.0" - universal-user-agent "^6.0.0" - -"@octokit/openapi-types@^20.0.0": - version "20.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" - integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== - -"@octokit/openapi-types@^22.2.0": - version "22.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" - integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== - -"@octokit/plugin-paginate-rest@^9.0.0": - version "9.2.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz#2e2a2f0f52c9a4b1da1a3aa17dabe3c459b9e401" - integrity sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw== - dependencies: - "@octokit/types" "^12.6.0" - -"@octokit/plugin-rest-endpoint-methods@^10.0.0": - version "10.4.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz#41ba478a558b9f554793075b2e20cd2ef973be17" - integrity sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg== - dependencies: - "@octokit/types" "^12.6.0" - -"@octokit/request-error@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" - integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== - dependencies: - "@octokit/types" "^13.1.0" - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request@^8.3.0", "@octokit/request@^8.3.1": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" - integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== - dependencies: - "@octokit/endpoint" "^9.0.1" - "@octokit/request-error" "^5.1.0" - "@octokit/types" "^13.1.0" - universal-user-agent "^6.0.0" - -"@octokit/types@^12.6.0": - version "12.6.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2" - integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw== - dependencies: - "@octokit/openapi-types" "^20.0.0" - -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0": - version "13.5.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.5.0.tgz#4796e56b7b267ebc7c921dcec262b3d5bfb18883" - integrity sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ== - dependencies: - "@octokit/openapi-types" "^22.2.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/node@^20.16.2": - version "20.16.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.2.tgz#9e388f503a5af306e8c63319334887390966a11e" - integrity sha512-91s/n4qUPV/wg8eE9KHYW1kouTfDk2FPGjXbBMfRWP/2vg1rCXNQL1OCabwGs0XSdukuK+MwCDXE30QpSeMUhQ== - dependencies: - undici-types "~6.19.2" - -abbrev@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" - integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== - -acorn-walk@^8.1.1: - version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.4.1: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== - -agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.5.tgz#21eed340eb5daf47d29b6e002424b3e88c8c54b1" - integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -before-after-hook@^2.2.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" - integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== - -bin-links@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" - integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== - dependencies: - cmd-shim "^6.0.0" - npm-normalize-package-bin "^3.0.0" - read-cmd-shim "^4.0.0" - write-file-atomic "^5.0.0" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -cacache@^18.0.0: - version "18.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.4.tgz#4601d7578dadb59c66044e157d02a3314682d6a5" - integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" - lru-cache "^10.0.1" - minipass "^7.0.3" - minipass-collect "^2.0.1" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -cmd-shim@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.3.tgz#c491e9656594ba17ac83c4bd931590a9d6e26033" - integrity sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@4, debug@^4.1.1, debug@^4.3.4, debug@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -deprecation@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== - -follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-minipass@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" - integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== - dependencies: - minipass "^7.0.3" - -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== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -glob@^10.2.2, glob@^10.3.10: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -graceful-fs@^4.2.6: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hosted-git-info@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" - integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== - dependencies: - lru-cache "^10.0.1" - -http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-proxy-agent@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" - integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - -https-proxy-agent@^7.0.1: - version "7.0.5" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" - integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== - dependencies: - agent-base "^7.0.2" - debug "4" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -ini@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" - integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== - -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" - -is-core-module@^2.13.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" - integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== - dependencies: - hasown "^2.0.2" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isexe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" - integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - -json-parse-even-better-errors@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" - integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== - -lru-cache@^10.0.1, lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -make-fetch-happen@^13.0.0: - version "13.0.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" - integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== - dependencies: - "@npmcli/agent" "^2.0.0" - cacache "^18.0.0" - http-cache-semantics "^4.1.1" - is-lambda "^1.0.1" - minipass "^7.0.2" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - proc-log "^4.2.0" - promise-retry "^2.0.1" - ssri "^10.0.0" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minipass-collect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" - integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== - dependencies: - minipass "^7.0.3" - -minipass-fetch@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" - integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== - dependencies: - minipass "^7.0.3" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -minizlib@^2.1.1, minizlib@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -negotiator@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -node-gyp@^10.0.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.2.0.tgz#80101c4aa4f7ab225f13fcc8daaaac4eb1a8dd86" - integrity sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw== - dependencies: - env-paths "^2.2.0" - exponential-backoff "^3.1.1" - glob "^10.3.10" - graceful-fs "^4.2.6" - make-fetch-happen "^13.0.0" - nopt "^7.0.0" - proc-log "^4.1.0" - semver "^7.3.5" - tar "^6.2.1" - which "^4.0.0" - -nopt@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" - integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== - dependencies: - abbrev "^2.0.0" - -normalize-package-data@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" - integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== - dependencies: - hosted-git-info "^7.0.0" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - -npm-install-checks@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" - integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== - dependencies: - semver "^7.1.1" - -npm-normalize-package-bin@3.0.1, npm-normalize-package-bin@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" - integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== - -npm-package-arg@^11.0.0: - version "11.0.3" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.3.tgz#dae0c21199a99feca39ee4bfb074df3adac87e2d" - integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== - dependencies: - hosted-git-info "^7.0.0" - proc-log "^4.0.0" - semver "^7.3.5" - validate-npm-package-name "^5.0.0" - -npm-pick-manifest@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz#83562afde52b0b07cb6244361788d319ce7e8636" - integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== - dependencies: - npm-install-checks "^6.0.0" - npm-normalize-package-bin "^3.0.0" - npm-package-arg "^11.0.0" - semver "^7.3.5" - -once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" - integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -read-cmd-shim@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" - integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve@1.22.8: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^7.1.1, semver@^7.3.5, semver@^7.5.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -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== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-git@^3.25.0: - version "3.25.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.25.0.tgz#3666e76d6831f0583dc380645945b97e0ac4aab6" - integrity sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw== - dependencies: - "@kwsites/file-exists" "^1.1.1" - "@kwsites/promise-deferred" "^1.1.1" - debug "^4.3.5" - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@^8.0.3: - version "8.0.4" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" - integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== - dependencies: - agent-base "^7.1.1" - debug "^4.3.4" - socks "^2.8.3" - -socks@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== - dependencies: - ip-address "^9.0.5" - smart-buffer "^4.2.0" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.20" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" - integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== - -sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - -ssri@^10.0.0: - version "10.0.6" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" - integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== - dependencies: - minipass "^7.0.3" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tar@^6.1.11, tar@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -ts-node@^10.5.0: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - 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" - -tunnel@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - -typescript@~5.4.5: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -undici@^5.25.4: - version "5.28.4" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" - integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== - dependencies: - "@fastify/busboy" "^2.0.0" - -unique-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" - integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== - dependencies: - unique-slug "^4.0.0" - -unique-slug@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" - integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== - dependencies: - imurmurhash "^0.1.4" - -universal-user-agent@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" - integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -validate-npm-package-license@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate-npm-package-name@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" - integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" - integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== - dependencies: - isexe "^3.1.1" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/.github/workflows/add-release-label.yml b/.github/workflows/add-release-label.yml index a5a4daa71037..b56d691ae993 100644 --- a/.github/workflows/add-release-label.yml +++ b/.github/workflows/add-release-label.yml @@ -21,17 +21,16 @@ jobs: uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' + cache: yarn - name: Install dependencies run: yarn --immutable - working-directory: '.github/scripts' - name: Get the next semver version id: get-next-semver-version env: FORCE_NEXT_SEMVER_VERSION: ${{ vars.FORCE_NEXT_SEMVER_VERSION }} run: ./scripts/get-next-semver-version.sh "$FORCE_NEXT_SEMVER_VERSION" - working-directory: '.github/scripts' - name: Add release label to PR and linked issues id: add-release-label-to-pr-and-linked-issues @@ -39,4 +38,3 @@ jobs: RELEASE_LABEL_TOKEN: ${{ secrets.RELEASE_LABEL_TOKEN }} NEXT_SEMVER_VERSION: ${{ env.NEXT_SEMVER_VERSION }} run: yarn run add-release-label-to-pr-and-linked-issues - working-directory: '.github/scripts' diff --git a/.github/workflows/check-pr-labels.yml b/.github/workflows/check-pr-labels.yml index e17447c27116..6e0bf98762a0 100644 --- a/.github/workflows/check-pr-labels.yml +++ b/.github/workflows/check-pr-labels.yml @@ -26,14 +26,13 @@ jobs: uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' + cache: yarn - name: Install dependencies run: yarn --immutable - working-directory: '.github/scripts' - name: Check PR has required labels id: check-pr-has-required-labels env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: yarn run check-pr-has-required-labels - working-directory: '.github/scripts' diff --git a/.github/workflows/check-template-and-add-labels.yml b/.github/workflows/check-template-and-add-labels.yml index a01f1b6d5b7f..e5311b70d22e 100644 --- a/.github/workflows/check-template-and-add-labels.yml +++ b/.github/workflows/check-template-and-add-labels.yml @@ -19,14 +19,13 @@ jobs: uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' + cache: yarn - name: Install dependencies run: yarn --immutable - working-directory: '.github/scripts' - name: Check template and add labels id: check-template-and-add-labels env: LABEL_TOKEN: ${{ secrets.LABEL_TOKEN }} run: npm run check-template-and-add-labels - working-directory: '.github/scripts' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 64bd5bea831b..f13a32ae47f6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,22 +5,16 @@ on: pull_request: merge_group: types: [checks_requested] - + jobs: - check-diff: - runs-on: macos-latest + setup: + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' cache: yarn - - uses: ruby/setup-ruby@a6e6f86333f0a2523ece813039b8b4be04560854 #v1 - with: - ruby-version: '3.1.5' - bundler-cache: true - env: - BUNDLE_GEMFILE: ios/Gemfile - name: Determine whether the current PR is a draft id: set-is-draft if: github.event_name == 'pull_request' && github.event.pull_request.number @@ -33,7 +27,7 @@ jobs: run: printf '%s\n\n%s' '@metamask:registry=https://npm.pkg.github.com' "//npm.pkg.github.com/:_authToken=${PACKAGE_READ_TOKEN}" > .npmrc env: PACKAGE_READ_TOKEN: ${{ secrets.PACKAGE_READ_TOKEN }} - - run: yarn setup + - run: yarn setup --node - name: Require clean working directory shell: bash run: | @@ -45,6 +39,7 @@ jobs: fi dedupe: runs-on: ubuntu-20.04 + needs: setup steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 @@ -63,6 +58,7 @@ jobs: fi scripts: runs-on: ubuntu-20.04 + needs: setup strategy: matrix: scripts: @@ -90,6 +86,7 @@ jobs: fi unit-tests: runs-on: ubuntu-20.04 + needs: setup strategy: matrix: shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] @@ -159,6 +156,7 @@ jobs: js-bundle-size-check: runs-on: ubuntu-20.04 + needs: setup steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 @@ -222,10 +220,6 @@ jobs: uses: actions/checkout@v3 - name: SonarCloud Quality Gate Status id: sonar-status - env: - REPO: ${{ github.repository }} - ISSUE_NUMBER: ${{ github.event.issue.number || github.event.pull_request.number }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # Skip step if event is a PR if [[ "${{ github.event_name }}" != "pull_request" ]]; then @@ -233,40 +227,31 @@ jobs: exit 0 fi - # Bypass step if skip-sonar-cloud label is found - LABEL=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \ - "https://api.github.com/repos/$REPO/issues/$ISSUE_NUMBER/labels" | \ - jq -r '.[] | select(.name=="skip-sonar-cloud") | .name') + sleep 30 - if [[ "$LABEL" == "skip-sonar-cloud" ]]; then - echo "skip-sonar-cloud label found. Skipping SonarCloud Quality Gate check." - else - sleep 30 - - PROJECT_KEY="metamask-mobile" - PR_NUMBER="${{ github.event.pull_request.number }}" - SONAR_TOKEN="${{ secrets.SONAR_TOKEN }}" + PROJECT_KEY="metamask-mobile" + PR_NUMBER="${{ github.event.pull_request.number }}" + SONAR_TOKEN="${{ secrets.SONAR_TOKEN }}" - if [ -z "$PR_NUMBER" ]; then - echo "No pull request number found. Failing the check." - exit 1 - fi + if [ -z "$PR_NUMBER" ]; then + echo "No pull request number found. Failing the check." + exit 1 + fi - RESPONSE=$(curl -s -u "$SONAR_TOKEN:" \ - "https://sonarcloud.io/api/qualitygates/project_status?projectKey=$PROJECT_KEY&pullRequest=$PR_NUMBER") - echo "SonarCloud API Response: $RESPONSE" + RESPONSE=$(curl -s -u "$SONAR_TOKEN:" \ + "https://sonarcloud.io/api/qualitygates/project_status?projectKey=$PROJECT_KEY&pullRequest=$PR_NUMBER") + echo "SonarCloud API Response: $RESPONSE" - STATUS=$(echo "$RESPONSE" | jq -r '.projectStatus.status') + STATUS=$(echo "$RESPONSE" | jq -r '.projectStatus.status') - if [[ "$STATUS" == "ERROR" ]]; then - echo "Quality Gate failed." - exit 1 - elif [[ "$STATUS" == "OK" ]]; then - echo "Quality Gate passed." - else - echo "Could not determine Quality Gate status." - exit 1 - fi + if [[ "$STATUS" == "ERROR" ]]; then + echo "Quality Gate failed." + exit 1 + elif [[ "$STATUS" == "OK" ]]; then + echo "Quality Gate passed." + else + echo "Could not determine Quality Gate status." + exit 1 fi check-workflows: name: Check workflows @@ -285,11 +270,12 @@ jobs: runs-on: ubuntu-20.04 needs: [ - check-diff, + setup, dedupe, scripts, unit-tests, check-workflows, + sonar-cloud, js-bundle-size-check, sonar-cloud-quality-gate-status, ] diff --git a/.github/workflows/close-bug-report.yml b/.github/workflows/close-bug-report.yml index a80004cae140..981824ed3008 100644 --- a/.github/workflows/close-bug-report.yml +++ b/.github/workflows/close-bug-report.yml @@ -21,10 +21,10 @@ jobs: uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' + cache: yarn - name: Install dependencies run: yarn --immutable - working-directory: '.github/scripts' - name: Close release bug report issue id: close-release-bug-report-issue @@ -32,4 +32,3 @@ jobs: BUG_REPORT_REPO: mobile-planning BUG_REPORT_TOKEN: ${{ secrets.BUG_REPORT_TOKEN }} run: yarn run close-release-bug-report-issue - working-directory: '.github/scripts' diff --git a/.github/workflows/crowdin_action.yml b/.github/workflows/crowdin_action.yml index eba1ac691548..2582db7e5a76 100644 --- a/.github/workflows/crowdin_action.yml +++ b/.github/workflows/crowdin_action.yml @@ -10,6 +10,8 @@ on: - main schedule: - cron: "0 */12 * * *" + merge_group: + types: [checks_requested] jobs: synchronize-with-crowdin: diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a95001cb1c63..f577c5ba7553 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -4,20 +4,21 @@ on: branches: main pull_request: + jobs: docker: runs-on: ubuntu-latest steps: - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3 + uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db # v3 + uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db # v3 - uses: actions/checkout@v3 - name: Build and load - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5 + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5 with: context: . file: scripts/docker/Dockerfile diff --git a/.github/workflows/fitness-functions.yml b/.github/workflows/fitness-functions.yml index 6e621537271a..454b9ce8bc41 100644 --- a/.github/workflows/fitness-functions.yml +++ b/.github/workflows/fitness-functions.yml @@ -18,10 +18,10 @@ jobs: uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' + cache: yarn - name: Install dependencies run: yarn --immutable - working-directory: '.github/scripts' - name: Run fitness functions env: @@ -33,4 +33,3 @@ jobs: # then saved to a file called "diff". git diff "$(git merge-base "origin/$BASE_REF" HEAD)" HEAD -- . > ./diff yarn run fitness-functions -- "ci" "./diff" - working-directory: '.github/scripts' diff --git a/.github/workflows/run-bitrise-e2e-check.yml b/.github/workflows/run-bitrise-e2e-check.yml index ac1016e9d864..23274a35f5ea 100644 --- a/.github/workflows/run-bitrise-e2e-check.yml +++ b/.github/workflows/run-bitrise-e2e-check.yml @@ -43,10 +43,10 @@ jobs: uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' + cache: yarn - name: Install dependencies run: yarn --immutable - working-directory: '.github/scripts' - name: Check Bitrise E2E Status env: @@ -56,4 +56,3 @@ jobs: # The status check created under this workflow may be bucketed under another check suite in Github actions. This is a result of workflows with the same triggers. # For example, the status check may show as `CLA Signature Bot / Bitrise E2E Status`. This is a bug on Github's UI. https://github.com/orgs/community/discussions/24616 run: yarn run run-bitrise-e2e-check - working-directory: '.github/scripts' diff --git a/.js.env.example b/.js.env.example index 68e8316f034e..768f29a7f829 100644 --- a/.js.env.example +++ b/.js.env.example @@ -92,5 +92,3 @@ export MM_ENABLE_SETTINGS_PAGE_DEV_OPTIONS="true" # Multichain Feature flag export MULTICHAIN_V1="" -#Multichain feature flag specific to UI changes -export MM_MULTICHAIN_V1_ENABLED="" diff --git a/.storybook/main.js b/.storybook/main.js index fd51e44c137d..64a3f3cf602b 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -3,7 +3,6 @@ module.exports = { '../app/component-library/components/**/*.stories.?(ts|tsx|js|jsx)', '../app/component-library/base-components/**/*.stories.?(ts|tsx|js|jsx)', '../app/component-library/components-temp/TagColored/**/*.stories.?(ts|tsx|js|jsx)', - '../app/component-library/components-temp/KeyValueRow/**/*.stories.?(ts|tsx|js|jsx)', ], addons: ['@storybook/addon-ondevice-controls'], framework: '@storybook/react-native', diff --git a/.storybook/storybook.requires.js b/.storybook/storybook.requires.js index 3b26602e64de..ae2e8f2d55b6 100644 --- a/.storybook/storybook.requires.js +++ b/.storybook/storybook.requires.js @@ -30,13 +30,6 @@ global.STORIES = [ importPathMatcher: "^\\.[\\\\/](?:app\\/component-library\\/components-temp\\/TagColored(?:\\/(?!\\.)(?:(?:(?!(?:^|\\/)\\.).)*?)\\/|\\/|$)(?!\\.)(?=.)[^/]*?\\.stories\\.(?:ts|tsx|js|jsx)?)$", }, - { - titlePrefix: "", - directory: "./app/component-library/components-temp/KeyValueRow", - files: "**/*.stories.?(ts|tsx|js|jsx)", - importPathMatcher: - "^\\.[\\\\/](?:app\\/component-library\\/components-temp\\/KeyValueRow(?:\\/(?!\\.)(?:(?:(?!(?:^|\\/)\\.).)*?)\\/|\\/|$)(?!\\.)(?=.)[^/]*?\\.stories\\.(?:ts|tsx|js|jsx)?)$", - }, ]; import "@storybook/addon-ondevice-controls/register"; @@ -122,7 +115,8 @@ const getStories = () => { "./app/component-library/components/Toast/Toast.stories.tsx": require("../app/component-library/components/Toast/Toast.stories.tsx"), "./app/component-library/base-components/TagBase/TagBase.stories.tsx": require("../app/component-library/base-components/TagBase/TagBase.stories.tsx"), "./app/component-library/components-temp/TagColored/TagColored.stories.tsx": require("../app/component-library/components-temp/TagColored/TagColored.stories.tsx"), - "./app/component-library/components-temp/KeyValueRow/KeyValueRow.stories.tsx": require("../app/component-library/components-temp/KeyValueRow/KeyValueRow.stories.tsx"), + "./app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.stories.tsx": require("../app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.stories.tsx"), + }; }; diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b50b2835a36..97b9b7095f6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,96 @@ ## Current Main Branch +## 7.32.0 - Sep 19, 2024 + +### Added + +- [#10294](https://github.com/MetaMask/metamask-mobile/pull/10294): feat: create redux slice for featureFlags (#10294) +- [#11314](https://github.com/MetaMask/metamask-mobile/pull/11314): feat: reject connection properly (#11314) +- [#11132](https://github.com/MetaMask/metamask-mobile/pull/11132): feat: Add performance tracing infrastructure (#11132) +- [#10061](https://github.com/MetaMask/metamask-mobile/pull/10061): feat: new receive flow (#10061) +- [#11174](https://github.com/MetaMask/metamask-mobile/pull/11174): feat(2796): behind feature flag permission settings multichain 2of2 (#11174) +- [#11019](https://github.com/MetaMask/metamask-mobile/pull/11019): feat(2793): mocked UI screen displaying multichain dapp permission summary 2of2 (#11019) +- [#10988](https://github.com/MetaMask/metamask-mobile/pull/10988): feat(2808): add a mocked UI checkbox list that will later allow adding the ability to edit network permission (#10988) +- [#11168](https://github.com/MetaMask/metamask-mobile/pull/11168): feat: add pooled staking input flow screen (#11168) +- [#10964](https://github.com/MetaMask/metamask-mobile/pull/10964): feat: build your earnings component stub in eth token details (#10964) +- [#11051](https://github.com/MetaMask/metamask-mobile/pull/11051): feat: add brand evo font files (#11051) +- [#11285](https://github.com/MetaMask/metamask-mobile/pull/11285): feat: notifications add analytics (#11285) +- [#10755](https://github.com/MetaMask/metamask-mobile/pull/10755): feat: ledger account selection screen add hd options to sync with extension (#10755) +- [#11195](https://github.com/MetaMask/metamask-mobile/pull/11195): feat: add AppState dependency to load notifications (#11195) +- [#11175](https://github.com/MetaMask/metamask-mobile/pull/11175): feat: add product announcements toggle (#11175) + +### Changed +- [#11148](https://github.com/MetaMask/metamask-mobile/pull/11148): chore: remove animation and add new splash screen (#11148) +- [#11306](https://github.com/MetaMask/metamask-mobile/pull/11306): chore: update @sentry/react-native to version 5.33.0 (#11306) +- [#11144](https://github.com/MetaMask/metamask-mobile/pull/11144): test: E2E Mocking Setup For Detox Tests (#11144) +- [#11212](https://github.com/MetaMask/metamask-mobile/pull/11212): chore: Update CI workflow triggers to support release branches (#11212) +- [#11243](https://github.com/MetaMask/metamask-mobile/pull/11243): chore(js-ts): Convert ModalNavbarTitle to TypeScript (#11243) +- [#11213](https://github.com/MetaMask/metamask-mobile/pull/11213): test: Appium separate and optimize app launch time measurements (#11213) +- [#11264](https://github.com/MetaMask/metamask-mobile/pull/11264): chore: remove triggers for actions not needed during the merge-queue CI (#11264) +- [#11222](https://github.com/MetaMask/metamask-mobile/pull/11222): chore: add bitrise document link to the bitrise failed comment (#11222) +- [#11145](https://github.com/MetaMask/metamask-mobile/pull/11145): chore: update performance for new allocation (#11145) +- [#11184](https://github.com/MetaMask/metamask-mobile/pull/11184): test: remove notifications launch arg in E2E (#11184) +- [#11186](https://github.com/MetaMask/metamask-mobile/pull/11186): ci: prevent detox E2E lock failure (#11186) +- [#11141](https://github.com/MetaMask/metamask-mobile/pull/11141): chore: update express for all the packages (#11141) +- [#11124](https://github.com/MetaMask/metamask-mobile/pull/11124): docs: Update Appium documentation (#11124) +- [#10865](https://github.com/MetaMask/metamask-mobile/pull/10865): chore: update eslint v^8.44 (#10865) +- [#11096](https://github.com/MetaMask/metamask-mobile/pull/11096): test: detox black list gas api endpoint (#11096) +- [#11246](https://github.com/MetaMask/metamask-mobile/pull/11246): chore: Remove `eth-sign` (#11246) +- [#11220](https://github.com/MetaMask/metamask-mobile/pull/11220): chore: Update package @blockaid/ppom_release to version 1.5.3 (#11220) +- [#11244](https://github.com/MetaMask/metamask-mobile/pull/11244): chore(js-ts): Convert useInterval.js to TypeScript (#11244) +- [#11089](https://github.com/MetaMask/metamask-mobile/pull/11089): chore: add staking team to codeowners file (#11089) +- [#11049](https://github.com/MetaMask/metamask-mobile/pull/11049): chore: update balance design (#11049) +- [#11011](https://github.com/MetaMask/metamask-mobile/pull/11011): chore: Capture currency change in MetaMetrics (#11011) +- [#10468](https://github.com/MetaMask/metamask-mobile/pull/10468): chore: Capture custom rpc url in `trackEvent` (#10468) +- [#11207](https://github.com/MetaMask/metamask-mobile/pull/11207): chore(deps): Bump `@metamask/base-controller` from `^6.0.0` to `^7.0.0` (#11207) +- [#11235](https://github.com/MetaMask/metamask-mobile/pull/11235): ci: avoid running release pipeline on every commit to the release branch (#11235) +- [#11094](https://github.com/MetaMask/metamask-mobile/pull/11094): chore: chore/7.31.0-Changelog (#11094) +- [#10788](https://github.com/MetaMask/metamask-mobile/pull/10788): chore: Add `@metamask/selected-network-controller` & integrate (#10788) +- [#11122](https://github.com/MetaMask/metamask-mobile/pull/11122): test: e2e for auto-lock (#11122) +- [#11143](https://github.com/MetaMask/metamask-mobile/pull/11143): chore: bump react native webview to 14.0.3 version (#11143) +- [#11284](https://github.com/MetaMask/metamask-mobile/pull/11284): chore: add notifications state awareness inapp badge (#11284) +- [#11209](https://github.com/MetaMask/metamask-mobile/pull/11209): chore(runway): cherry-pick fix: freeze during swap with approval (#11209) +- [#11157](https://github.com/MetaMask/metamask-mobile/pull/11157): chore(runway): cherry-pick chore: bump send for all the packages (#11157) +- [#11082](https://github.com/MetaMask/metamask-mobile/pull/11082): chore: bump network controller 20.0.0 (#11082) +- [#11095](https://github.com/MetaMask/metamask-mobile/pull/11095): chore(runway): cherry-pick fix: Intermittent Display Issue of Fiat Currency on Main Wallet View (#11095) +- [#11181](https://github.com/MetaMask/metamask-mobile/pull/11181): chore(runway): cherry-pick fix: fix check token balance is zero (#11181) +- [#11208](https://github.com/MetaMask/metamask-mobile/pull/11208): chore(runway): cherry-pick chore: update performance for new allocation (#11208) +- [#10821](https://github.com/MetaMask/metamask-mobile/pull/10821): chore(deps): bump `accounts-controller` to v18.1.0 and `keyring-api` to v8.1.0 (#10821) + +### Fixed +- [#11117](https://github.com/MetaMask/metamask-mobile/pull/11117): fix: add feat flag (#11117) +- [#11084](https://github.com/MetaMask/metamask-mobile/pull/11084): fix: locks api spec version for api spec tests (#11084) +- [#11310](https://github.com/MetaMask/metamask-mobile/pull/11310): fix: quick fix on feature flag & notification state (#11310) +- [#11200](https://github.com/MetaMask/metamask-mobile/pull/11200): fix: add feature flag on profile sync (#11200) +- [#11302](https://github.com/MetaMask/metamask-mobile/pull/11302): fix: cp & resolve merge conflict (#11302) +- [#11130](https://github.com/MetaMask/metamask-mobile/pull/11130): fix(action): add a workaround for known bots (#11130) +- [#11173](https://github.com/MetaMask/metamask-mobile/pull/11173): fix: dset version (#11173) +- [#10899](https://github.com/MetaMask/metamask-mobile/pull/10899): fix: Android crash when svgs use the " html entity (#10899) +- [#11126](https://github.com/MetaMask/metamask-mobile/pull/11126): fix: Skip sonar cloud gate in step instead (#11126) +- [#11121](https://github.com/MetaMask/metamask-mobile/pull/11121): fix: Add new job to verify ""All jobs pass"" job for required PR check (#11121) +- [#11266](https://github.com/MetaMask/metamask-mobile/pull/11266): fix: notification permission flow (#11266) +- [#11252](https://github.com/MetaMask/metamask-mobile/pull/11252): fix: notification permission request message (#11252) +- [#11155](https://github.com/MetaMask/metamask-mobile/pull/11155): fix: android crashing on date formating Intl usage. (#11155) +- [#11137](https://github.com/MetaMask/metamask-mobile/pull/11137): fix: notifications bugs (#11137) +- [#11110](https://github.com/MetaMask/metamask-mobile/pull/11110): fix: accounts notifications switch (#11110) +- [#11146](https://github.com/MetaMask/metamask-mobile/pull/11146): fix: update nativesdk with improved concurrency handling (#11146) +- [#11165](https://github.com/MetaMask/metamask-mobile/pull/11165): fix: freeze during swap with approval (#11165) +- [#11161](https://github.com/MetaMask/metamask-mobile/pull/11161): fix: blockaid loader on confirmation pages (#11161) +- [#10989](https://github.com/MetaMask/metamask-mobile/pull/10989): fix: closing of gas info tooltip (#10989) +- [#10348](https://github.com/MetaMask/metamask-mobile/pull/10348): fix: confirmations UI adjustments (#10348) +- [#10842](https://github.com/MetaMask/metamask-mobile/pull/10842): fix: app crash due to minimal input must be string error (#10842) +- [#11112](https://github.com/MetaMask/metamask-mobile/pull/11112): fix: update token details monetization button (#11112) +- [#11172](https://github.com/MetaMask/metamask-mobile/pull/11172): fix: fix check token balance is zero (#11172) +- [#11087](https://github.com/MetaMask/metamask-mobile/pull/11087): fix: Intermittent Display Issue of Fiat Currency on Main Wallet View (#11087) +- [#11176](https://github.com/MetaMask/metamask-mobile/pull/11176): fix: switch from bundled to url EE (#11176) +- [#11281](https://github.com/MetaMask/metamask-mobile/pull/11281): fix: Fix the styling issue of link in SearchingForDeviceStep component (#11281) +- [#11265](https://github.com/MetaMask/metamask-mobile/pull/11265): fix: notification account syncing (#11265) +- [#11218](https://github.com/MetaMask/metamask-mobile/pull/11218): fix: close icon on notifications list screen (#11218) +- [#11193](https://github.com/MetaMask/metamask-mobile/pull/11193): fix: ItemMenu crash using dayjs (#11193) +- [#11098](https://github.com/MetaMask/metamask-mobile/pull/11098): fix: badge count and ui polishing (#11098) + + ## 7.31.0 - Sep 6, 2024 ### Added - [#10747](https://github.com/MetaMask/metamask-mobile/pull/10747): feat: 2805 grant permission to network with missmatching rpc url (#10747) diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000000..3c02108f3cea --- /dev/null +++ b/Gemfile @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +# Recommended to use http://rbenv.org/ to install and use this version +ruby '>= 3.1.5' + +# Allow minor version updates up to but excluding 2.0.0 +gem 'cocoapods', '~> 1.12' + +# Allow all version updates up to but excluding 7.1.0 +gem 'activesupport', '>= 6.1.7.3', '< 7.1.0' diff --git a/ios/Gemfile.lock b/Gemfile.lock similarity index 100% rename from ios/Gemfile.lock rename to Gemfile.lock diff --git a/README.md b/README.md index 2c4a6de04453..64eff4aa1df6 100644 --- a/README.md +++ b/README.md @@ -41,20 +41,15 @@ cd metamask-mobile **Firebase Messaging Setup** -Before running the app, keep in mind that MetaMask uses FCM (Firebase Cloud Message) to empower communications. Based on this, as an external contributor you would preferably need to provide your own FREE Firebase project config file with a matching client for package name `io.metamask`, and update your `google-services.json` file in the `android/app` directory as well your `.env` files (`.ios.env`, `.js.env`, `.android.env`), adding `GOOGLE_SERVICES_B64` variable depending on the environment you are running the app (ios/android). +Before running the app, keep in mind that MetaMask uses FCM (Firebase Cloud Message) to empower communications. Based on this, would be preferable that you provide your own Firebase project config file and update your `google-services.json` file in the `android/app` directory as well your .env files (ios.env, js.env, android.env), adding GOOGLE_SERVICES_B64 variable depending on the environment you are running the app (ios/android). -The value you should provide to `GOOGLE_SERVICES_B64` is the base64 encoded version of your Firebase project config file, which can be generated as follows: +ATTENTION: In case you don't provide your own Firebase project config file, you can make usage of a mock file at `android/app/google-services-example.json`, following the steps below from the root of the project: ```bash base64 -i ./android/app/google-services-example.json ``` -Copy the result to your clipboard and paste it in the `GOOGLE_SERVICES_B64` variable in the `.env` file you are running the app. - -> [!CAUTION] -> In case you don't provide your own Firebase project config file, you will face the error `No matching client found for package name 'io.metamask'`. - -You can make usage of a mock file at `android/app/google-services-example.json`, following the same steps above from the root of the project. +Copy the result to your clipboard and paste it in the GOOGLE_SERVICES_B64 variable in the .env file you are running the app. In case of any doubt, please follow the instructions in the link below to get your Firebase project config file. diff --git a/android/app/build.gradle b/android/app/build.gradle index 2363b3c882e3..c103d97dbf1d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -173,8 +173,8 @@ android { applicationId "io.metamask" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1432 - versionName "7.31.0" + versionCode 1441 + versionName "7.32.0" testBuildType System.getProperty('testBuildType', 'debug') missingDimensionStrategy 'react-native-camera', 'general' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/android/app/google-services-example.json b/android/app/google-services-example.json index f7765f0ad2ac..56d9bd48e3c1 100644 --- a/android/app/google-services-example.json +++ b/android/app/google-services-example.json @@ -7,20 +7,15 @@ }, "client": [ { - "api_key": [ - { - "current_key": "" - } - ], "client_info": { "mobilesdk_app_id": "1:123456789000:android:f1bf012572b04063", - "client_id": "android:io.metamask", + "client_id": "android:com.google.samples.quickstart.admobexample", "client_type": 1, "android_client_info": { - "package_name": "io.metamask", + "package_name": "com.google.samples.quickstart.admobexample", "certificate_hash": [] } - } + }, } ], "configuration_version": "1" diff --git a/app/actions/onboarding/index.js b/app/actions/onboarding/index.js new file mode 100644 index 000000000000..244cac54e162 --- /dev/null +++ b/app/actions/onboarding/index.js @@ -0,0 +1,20 @@ +/** + * Saves an onboarding analytics event in state + * + * @param {object} event - Event object + */ +export function saveOnboardingEvent(event) { + return { + type: 'SAVE_EVENT', + event, + }; +} + +/** + * Erases any event stored in state + */ +export function clearOnboardingEvents() { + return { + type: 'CLEAR_EVENTS', + }; +} diff --git a/app/actions/onboarding/index.ts b/app/actions/onboarding/index.ts deleted file mode 100644 index 9866cf8d17b5..000000000000 --- a/app/actions/onboarding/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { IMetaMetricsEvent } from '../../core/Analytics'; - -export const SAVE_EVENT = 'SAVE_EVENT'; -export const CLEAR_EVENTS = 'CLEAR_EVENTS'; - -interface SaveEventAction { - type: typeof SAVE_EVENT; - event: [IMetaMetricsEvent]; -} - -interface ClearEventsAction { - type: typeof CLEAR_EVENTS; -} - -export type OnboardingActionTypes = SaveEventAction | ClearEventsAction; - -export function saveOnboardingEvent(eventArgs: [IMetaMetricsEvent]): SaveEventAction { - return { - type: SAVE_EVENT, - event: eventArgs, - }; -} - -export function clearOnboardingEvents(): ClearEventsAction { - return { - type: CLEAR_EVENTS, - }; -} \ No newline at end of file diff --git a/app/component-library/base-components/TagBase/__snapshots__/TagBase.test.tsx.snap b/app/component-library/base-components/TagBase/__snapshots__/TagBase.test.tsx.snap index a3be1a262ef2..3959ad454591 100644 --- a/app/component-library/base-components/TagBase/__snapshots__/TagBase.test.tsx.snap +++ b/app/component-library/base-components/TagBase/__snapshots__/TagBase.test.tsx.snap @@ -7,12 +7,14 @@ exports[`TagBase should render TagBase 1`] = ` onLayout={[Function]} style={ { + "alignItems": "center", "alignSelf": "flex-start", "backgroundColor": "#ffffff", "borderColor": "#bbc0c5", "borderRadius": 999, "borderWidth": 0, "color": "#141618", + "flexDirection": "row", "padding": 16, "paddingHorizontal": 8, "paddingVertical": 2, @@ -20,72 +22,63 @@ exports[`TagBase should render TagBase 1`] = ` } testID="tagbase" > - - - + - + - Sample TagBase Children - - + Sample TagBase Children + + - + - + } + width={20} + /> `; diff --git a/app/component-library/components-temp/CellSelectWithMenu/__snapshots__/CellSelectWithMenu.test.tsx.snap b/app/component-library/components-temp/CellSelectWithMenu/__snapshots__/CellSelectWithMenu.test.tsx.snap index 3e2ad44c55f9..5b97c76e34c9 100644 --- a/app/component-library/components-temp/CellSelectWithMenu/__snapshots__/CellSelectWithMenu.test.tsx.snap +++ b/app/component-library/components-temp/CellSelectWithMenu/__snapshots__/CellSelectWithMenu.test.tsx.snap @@ -44,7 +44,6 @@ exports[`CellSelectWithMenu should render with default settings correctly 1`] = - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.33873792024529126, + 0.9408807689542256, + -0.9408807689542256, + 0.33873792024529126, + 50.8847515111068, + 5.120153954341607, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + + Orangefox.eth + + @@ -211,78 +248,32 @@ exports[`CellSelectWithMenu should render with default settings correctly 1`] = numberOfLines={1} style={ { - "color": "#141618", + "color": "#6a737d", "fontFamily": "EuclidCircularB-Regular", - "fontSize": 16, + "fontSize": 14, "fontWeight": "400", "letterSpacing": 0, - "lineHeight": 24, + "lineHeight": 22, } } - testID="cellbase-avatar-title" > - Orangefox.eth + 0x2990079bcdEe240329a520d2444386FC119da21a - - - 0x2990079bcdEe240329a520d2444386FC119da21a - - - - + width={10} + /> + diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueLabel/KeyValueLabel.styles.tsx b/app/component-library/components-temp/KeyValueRow/KeyValueLabel/KeyValueLabel.styles.tsx deleted file mode 100644 index ae5c4860b71c..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueLabel/KeyValueLabel.styles.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { StyleSheet } from 'react-native'; - -const styleSheet = () => - StyleSheet.create({ - labelContainer: { - flexDirection: 'row', - alignItems: 'center', - }, - }); - -export default styleSheet; diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueLabel/KeyValueLabel.tsx b/app/component-library/components-temp/KeyValueRow/KeyValueLabel/KeyValueLabel.tsx deleted file mode 100644 index aefa71eecbc4..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueLabel/KeyValueLabel.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import ButtonIcon from '../../../../component-library/components/Buttons/ButtonIcon'; -import Label from '../../../../component-library/components/Form/Label'; -import { - IconColor, - IconName, -} from '../../../../component-library/components/Icons/Icon'; -import { - TextVariant, - TextColor, -} from '../../../../component-library/components/Texts/Text'; -import { useStyles } from '../../../../component-library/hooks'; -import useTooltipModal from '../../../../components/hooks/useTooltipModal'; -import React from 'react'; -import { View } from 'react-native'; -import { KeyValueRowLabelProps, TooltipSizes } from '../KeyValueRow.types'; -import styleSheet from './KeyValueLabel.styles'; - -/** - * A label and tooltip component. - * - * @param {Object} props - Component props. - * @param {TextVariant} [props.variant] - Optional text variant. Defaults to TextVariant.BodyMDMedium. - * @param {TextVariant} [props.color] - Optional text color. Defaults to TextColor.Default. - * @param {TextVariant} [props.tooltip] - Optional tooltip to render to the right of the label text. - * - * @returns {JSX.Element} The rendered KeyValueRowLabel component. - */ -const KeyValueRowLabel = ({ - label, - variant = TextVariant.BodyMDMedium, - color = TextColor.Default, - tooltip, -}: KeyValueRowLabelProps) => { - const { styles } = useStyles(styleSheet, {}); - - const { openTooltipModal } = useTooltipModal(); - - const hasTooltip = tooltip?.title && tooltip?.text; - - const onNavigateToTooltipModal = () => { - if (!hasTooltip) return; - openTooltipModal(tooltip.title, tooltip.text); - }; - - return ( - - - {hasTooltip && ( - - )} - - ); -}; - -export default KeyValueRowLabel; diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueRoot/KeyValueRoot.styles.tsx b/app/component-library/components-temp/KeyValueRow/KeyValueRoot/KeyValueRoot.styles.tsx deleted file mode 100644 index a3de4af351f3..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueRoot/KeyValueRoot.styles.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StyleSheet } from 'react-native'; - -const styleSheet = () => - StyleSheet.create({ - rootContainer: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - overflow: 'hidden', - }, - }); - -export default styleSheet; diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueRoot/KeyValueRoot.tsx b/app/component-library/components-temp/KeyValueRow/KeyValueRoot/KeyValueRoot.tsx deleted file mode 100644 index e308488648a2..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueRoot/KeyValueRoot.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { useStyles } from '../../../hooks'; -import React from 'react'; -import { View } from 'react-native'; -import { KeyValueRowRootProps } from '../KeyValueRow.types'; -import styleSheet from './KeyValueRoot.styles'; - -/** - * The main container for the KeyValueRow component. - * When creating custom KeyValueRow components, this must be the outermost component wrapping the two components. - * - * e.g. - * ``` - * - * - * - * - * ``` - * - * @component - * @param {Object} props - Component props. - * @param {Array} props.children - The two children. - * @param {ViewProps} [props.style] - Optional styling - * - * @returns {JSX.Element} The rendered Root component. - */ -const KeyValueRowRoot = ({ - children, - style: customStyles, -}: KeyValueRowRootProps) => { - const { styles: defaultStyles } = useStyles(styleSheet, {}); - - const styles = [defaultStyles.rootContainer, customStyles]; - - return {children}; -}; - -export default KeyValueRowRoot; diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueRow.stories.tsx b/app/component-library/components-temp/KeyValueRow/KeyValueRow.stories.tsx deleted file mode 100644 index e5a440b32763..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueRow.stories.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import React from 'react'; -import { withNavigation } from '../../../../storybook/decorators'; -import { View, StyleSheet } from 'react-native'; -import KeyValueRowComponent, { - KeyValueRowFieldIconSides, - TooltipSizes, -} from './index'; -import Text, { TextColor, TextVariant } from '../../components/Texts/Text'; -import Title from '../../../components/Base/Title'; -import { IconColor, IconName, IconSize } from '../../components/Icons/Icon'; - -const KeyValueRowMeta = { - title: 'Components Temp / KeyValueRow', - component: KeyValueRowComponent, - decorators: [withNavigation], -}; - -export default KeyValueRowMeta; - -const styles = StyleSheet.create({ - container: { - padding: 16, - }, - listItem: { - marginVertical: 16, - gap: 16, - }, -}); - -export const KeyValueRow = { - render: () => ( - - KeyValueRow Component - - Prebuilt component displayed below but KeyValueRow stubs are available - to create new KeyValueRow variants. - - - - - - - - - ), -}; diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueRow.styles.ts b/app/component-library/components-temp/KeyValueRow/KeyValueRow.styles.ts deleted file mode 100644 index 33999c44819b..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueRow.styles.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { StyleSheet } from 'react-native'; - -const styleSheet = () => - StyleSheet.create({ - flexRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 8, - }, - }); - -export default styleSheet; diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueRow.test.tsx b/app/component-library/components-temp/KeyValueRow/KeyValueRow.test.tsx deleted file mode 100644 index a9b00ece7e86..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueRow.test.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react-native'; -import KeyValueRow from './KeyValueRow'; -import { IconName } from '../../components/Icons/Icon'; - -jest.mock('@react-navigation/native', () => { - const actualNav = jest.requireActual('@react-navigation/native'); - return { - ...actualNav, - useNavigation: () => ({ - navigate: jest.fn(), - }), - }; -}); - -describe('KeyValueRow', () => { - describe('Prebuilt Component', () => { - describe('KeyValueRow', () => { - it('should render when there is only text', () => { - const { toJSON } = render( - , - ); - - expect(toJSON()).toMatchSnapshot(); - }); - - it('should render text with tooltips', () => { - const { toJSON } = render( - , - ); - - expect(toJSON()).toMatchSnapshot(); - }); - - it('should render text with icons', () => { - const { toJSON } = render( - , - ); - - expect(toJSON()).toMatchSnapshot(); - }); - - it('should render text with icons and tooltips', () => { - const { toJSON } = render( - , - ); - - expect(toJSON()).toMatchSnapshot(); - }); - }); - }); -}); diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueRow.tsx b/app/component-library/components-temp/KeyValueRow/KeyValueRow.tsx deleted file mode 100644 index 18c6300b1cfa..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueRow.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { useStyles } from '../../hooks'; -import React from 'react'; -import stylesheet from './KeyValueRow.styles'; -import { - KeyValueRowProps, - KeyValueRowFieldIconSides, - KeyValueRowSectionAlignments, -} from './KeyValueRow.types'; -import Icon from '../../components/Icons/Icon'; -import { View } from 'react-native'; -import { areKeyValueRowPropsEqual } from './KeyValueRow.utils'; -import KeyValueSection from './KeyValueSection/KeyValueSection'; -import KeyValueRowLabel from './KeyValueLabel/KeyValueLabel'; -import KeyValueRowRoot from './KeyValueRoot/KeyValueRoot'; - -/** - * Prebuilt convenience component to format and render a key/value KeyValueRowLabel pair. - * The KeyValueRowLabel component has props to display a tooltip and icon. - * - * Examples are in the Storybook: [StorybookLink](./KeyValueRow.stories.tsx) - * - * @param {Object} props - Component props - * @param {KeyValueRowField} props.field - Represents the left side of the key value row pair - * @param {KeyValueRowField} props.value - Represents the right side of the key value row pair - * @param {ViewProps} [props.style] - Optional styling - * - * @returns {JSX.Element} The rendered KeyValueRow component. - */ -const KeyValueRow = React.memo(({ field, value, style }: KeyValueRowProps) => { - const { styles } = useStyles(stylesheet, {}); - - // Field (left side) - const fieldIcon = field?.icon; - const shouldShowFieldIcon = fieldIcon?.name; - - // Value (right side) - const valueIcon = value?.icon; - const shouldShowValueIcon = valueIcon?.name; - - return ( - - - - {shouldShowFieldIcon && - (fieldIcon.side === KeyValueRowFieldIconSides.LEFT || - fieldIcon.side === KeyValueRowFieldIconSides.BOTH || - !fieldIcon?.side) && } - - {shouldShowFieldIcon && - (fieldIcon?.side === KeyValueRowFieldIconSides.RIGHT || - fieldIcon?.side === KeyValueRowFieldIconSides.BOTH) && ( - - )} - - - - - {shouldShowValueIcon && - (valueIcon?.side === KeyValueRowFieldIconSides.LEFT || - valueIcon?.side === KeyValueRowFieldIconSides.BOTH || - !valueIcon?.side) && } - - {shouldShowValueIcon && - (valueIcon?.side === KeyValueRowFieldIconSides.RIGHT || - valueIcon?.side === KeyValueRowFieldIconSides.BOTH) && ( - - )} - - - - ); -}, areKeyValueRowPropsEqual); - -/** - * Exported sub-components to provide a base for new KeyValueRow variants. - */ -export const KeyValueRowStubs = { - Root: KeyValueRowRoot, - Section: KeyValueSection, - Label: KeyValueRowLabel, -}; - -export default KeyValueRow; diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueRow.types.ts b/app/component-library/components-temp/KeyValueRow/KeyValueRow.types.ts deleted file mode 100644 index 0e9c864d3095..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueRow.types.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { - IconProps, - IconSize, -} from '../../../component-library/components/Icons/Icon'; -import { ButtonIconSizes } from '../../components/Buttons/ButtonIcon'; -import { ReactNode } from 'react'; -import { TextProps } from '../../components/Texts/Text/Text.types'; -import { ViewProps } from 'react-native'; - -/** - * The optional tooltip tha can be displayed within a KeyValueRowField or KeyValueRowLabel. - * - * @see KeyValueRowField - * @see KeyValueRowLabel - */ -interface KeyValueRowTooltip { - /** - * The title displayed at the top of the tooltip. - */ - title: string; - /** - * The text displayed within the tooltip body. - */ - text: string; - /** - * Optional size of the tooltip icon. - * @default TooltipSizes.Md - */ - size?: ButtonIconSizes; -} - -/** - * Used to position icon in KeyValueRowField - * - * @see KeyValueRowField - */ -export enum KeyValueRowFieldIconSides { - LEFT = 'LEFT', - RIGHT = 'RIGHT', - BOTH = 'BOTH', -} - -/** - * Represents a field displayed within KeyValueRowProps. - * - * @see KeyValueRowProps - */ -interface KeyValueRowField { - /** - * The text to display. - */ - text: string; - /** - * Optional text variant. - * @default TextVariant.BodyMDMedium - */ - variant?: TextProps['variant']; - /** - * Optional text color. - * @default TextColor.Default - */ - color?: TextProps['color']; - /** - * Optional icon to display. If undefined, no icon is displayed. - */ - icon?: IconProps & { side?: KeyValueRowFieldIconSides }; - /** - * Optional tooltip to display. If undefined, no tooltip is displayed. - */ - tooltip?: KeyValueRowTooltip; -} - -export const IconSizes = IconSize; - -export const TooltipSizes = ButtonIconSizes; - -/** - * The KeyValueRowLabel prop interface. - * - * @see KeyValueRowLabel in ./KeyValueRow.tsx - */ -export interface KeyValueRowLabelProps { - /** - * Text to display. - */ - label: string; - /** - * Optional text variant. - * @default TextVariant.BodyMDMedium - */ - variant?: TextProps['variant']; - /** - * Optional text color. - * @default TextColor.Default - */ - color?: TextProps['color']; - /** - * Optional tooltip. If undefined, the tooltip won't be displayed. - */ - tooltip?: KeyValueRowTooltip; -} - -/** - * Represents the main container for the KeyValueRow component. - */ -export interface KeyValueRowRootProps { - /** - * Must have exactly two children. Adding more will lead to an undesired outcome. - */ - children: [ReactNode, ReactNode]; - /** - * Optional styles. Useful for controlling padding and margins. - */ - style?: ViewProps['style']; -} - -/** - * Represents the valid KeyValueSection alignments. - */ -export enum KeyValueRowSectionAlignments { - LEFT = 'flex-start', - RIGHT = 'flex-end', -} - -/** - * The KeyValueSection component props. - */ -export interface KeyValueSectionProps { - /** - * Child components. - */ - children: ReactNode; - /** - * Optional content alignment. - * @default KeyValueRowSectionAlignments.RIGHT - */ - align?: KeyValueRowSectionAlignments; -} - -/** - * The KeyValueRow component props. - */ -export interface KeyValueRowProps { - /** - * The "key" portion of the KeyValueRow (left side). - * Using the variable name field because key is reserved. - */ - field: KeyValueRowField; - /** - * The "value" portion of the KeyValueRow (right side). - */ - value: KeyValueRowField; - /** - * Optional styles. E.g. specifying padding or margins. - */ - style?: ViewProps['style']; -} diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueRow.utils.ts b/app/component-library/components-temp/KeyValueRow/KeyValueRow.utils.ts deleted file mode 100644 index bf4c38843e43..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueRow.utils.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { KeyValueRowProps } from './KeyValueRow.types'; - -export const areKeyValueRowPropsEqual = ( - prevProps: KeyValueRowProps, - newProps: KeyValueRowProps, -) => - JSON.stringify(prevProps.field) === JSON.stringify(newProps.field) && - JSON.stringify(prevProps.value) === JSON.stringify(newProps.value); diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueSection/KeyValueSection.styles.tsx b/app/component-library/components-temp/KeyValueRow/KeyValueSection/KeyValueSection.styles.tsx deleted file mode 100644 index f8d8adf679d5..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueSection/KeyValueSection.styles.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { StyleSheet } from 'react-native'; - -const styleSheet = () => - StyleSheet.create({ - keyValueSectionContainer: { - flex: 1, - }, - }); - -export default styleSheet; diff --git a/app/component-library/components-temp/KeyValueRow/KeyValueSection/KeyValueSection.tsx b/app/component-library/components-temp/KeyValueRow/KeyValueSection/KeyValueSection.tsx deleted file mode 100644 index 7c01d2b438a6..000000000000 --- a/app/component-library/components-temp/KeyValueRow/KeyValueSection/KeyValueSection.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import { useStyles } from '../../../hooks'; -import { View } from 'react-native'; -import { - KeyValueRowSectionAlignments, - KeyValueSectionProps, -} from '../KeyValueRow.types'; -import stylesSheet from './KeyValueSection.styles'; - -/** - * A container representing either the left or right side of the KeyValueRow. - * For desired results, use only two components within the . - * - * @component - * @param {Object} props - Component props. - * @param {ReactNode} props.children - The child components. - * @param {KeyValueRowSectionAlignments} [props.align] - The alignment of the KeyValueSection. Defaults to KeyValueRowSectionAlignments.RIGHT - * - * @returns {JSX.Element} The rendered KeyValueSection component. - */ -const KeyValueSection = ({ - children, - align = KeyValueRowSectionAlignments.LEFT, -}: KeyValueSectionProps) => { - const { styles } = useStyles(stylesSheet, {}); - - return ( - - {children} - - ); -}; - -export default KeyValueSection; diff --git a/app/component-library/components-temp/KeyValueRow/__snapshots__/KeyValueRow.test.tsx.snap b/app/component-library/components-temp/KeyValueRow/__snapshots__/KeyValueRow.test.tsx.snap deleted file mode 100644 index c83d3a4fd5fa..000000000000 --- a/app/component-library/components-temp/KeyValueRow/__snapshots__/KeyValueRow.test.tsx.snap +++ /dev/null @@ -1,609 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`KeyValueRow Prebuilt Component KeyValueRow should render text with icons 1`] = ` - - - - - - - Key Text - - - - - - - - - - Value Text - - - - - -`; - -exports[`KeyValueRow Prebuilt Component KeyValueRow should render text with icons and tooltips 1`] = ` - - - - - - - Key Text - - - - - - - - - - - - - Value Text - - - - - - - - -`; - -exports[`KeyValueRow Prebuilt Component KeyValueRow should render text with tooltips 1`] = ` - - - - - - Key Text - - - - - - - - - - - - Value Text - - - - - - - - -`; - -exports[`KeyValueRow Prebuilt Component KeyValueRow should render when there is only text 1`] = ` - - - - - - Sample Key Text - - - - - - - - - Sample Value Text - - - - - -`; diff --git a/app/component-library/components-temp/KeyValueRow/index.tsx b/app/component-library/components-temp/KeyValueRow/index.tsx deleted file mode 100644 index ee4a0c188257..000000000000 --- a/app/component-library/components-temp/KeyValueRow/index.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export { KeyValueRowStubs, default } from './KeyValueRow'; -export { - KeyValueRowSectionAlignments, - KeyValueRowFieldIconSides, - TooltipSizes, - IconSizes, -} from './KeyValueRow.types'; -export type * from './KeyValueRow.types'; diff --git a/app/component-library/components-temp/ListItemMultiSelectButton/__snapshots__/ListItemMultiSelectButton.test.tsx.snap b/app/component-library/components-temp/ListItemMultiSelectButton/__snapshots__/ListItemMultiSelectButton.test.tsx.snap index 0baaf1dd60bb..278ed889370e 100644 --- a/app/component-library/components-temp/ListItemMultiSelectButton/__snapshots__/ListItemMultiSelectButton.test.tsx.snap +++ b/app/component-library/components-temp/ListItemMultiSelectButton/__snapshots__/ListItemMultiSelectButton.test.tsx.snap @@ -40,16 +40,7 @@ exports[`ListItemMultiSelectButton should render correctly with default props 1` } } > - - - + diff --git a/app/component-library/components/Cells/Cell/__snapshots__/Cell.test.tsx.snap b/app/component-library/components/Cells/Cell/__snapshots__/Cell.test.tsx.snap index a3d36f307ddc..310992b6f65e 100644 --- a/app/component-library/components/Cells/Cell/__snapshots__/Cell.test.tsx.snap +++ b/app/component-library/components/Cells/Cell/__snapshots__/Cell.test.tsx.snap @@ -270,6 +270,7 @@ exports[`Cell should render CellMultiSelect given the type MultiSelect 1`] = ` disabled={false} style={ { + "alignItems": "flex-start", "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, @@ -283,252 +284,275 @@ exports[`Cell should render CellMultiSelect given the type MultiSelect 1`] = ` accessible={true} style={ { + "alignItems": "center", + "flexDirection": "row", "padding": 0, } } > - - - - + + + - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.33873792024529126, + 0.9408807689542256, + -0.9408807689542256, + 0.33873792024529126, + 50.8847515111068, + 5.120153954341607, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + - + - Orangefox.eth - - + 0x2990079bcdEe240329a520d2444386FC119da21a + + - 0x2990079bcdEe240329a520d2444386FC119da21a - + } + > + Updated 1 sec ago + + - Updated 1 sec ago + Imported - - - Imported - - @@ -584,6 +578,7 @@ exports[`Cell should render CellSelect given the type Select 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -594,14 +589,15 @@ exports[`Cell should render CellSelect given the type Select 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.33873792024529126, + 0.9408807689542256, + -0.9408807689542256, + 0.33873792024529126, + 50.8847515111068, + 5.120153954341607, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + - + - Orangefox.eth - - + 0x2990079bcdEe240329a520d2444386FC119da21a + + - 0x2990079bcdEe240329a520d2444386FC119da21a - + } + > + Updated 1 sec ago + + - Updated 1 sec ago + Imported - - - Imported - - diff --git a/app/component-library/components/Cells/Cell/variants/CellMultiSelect/__snapshots__/CellMultiSelect.test.tsx.snap b/app/component-library/components/Cells/Cell/variants/CellMultiSelect/__snapshots__/CellMultiSelect.test.tsx.snap index ab5aef4d21f9..81a2ddfbd117 100644 --- a/app/component-library/components/Cells/Cell/variants/CellMultiSelect/__snapshots__/CellMultiSelect.test.tsx.snap +++ b/app/component-library/components/Cells/Cell/variants/CellMultiSelect/__snapshots__/CellMultiSelect.test.tsx.snap @@ -5,6 +5,7 @@ exports[`CellMultiSelect should render default settings correctly 1`] = ` disabled={false} style={ { + "alignItems": "flex-start", "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, @@ -18,252 +19,275 @@ exports[`CellMultiSelect should render default settings correctly 1`] = ` accessible={true} style={ { + "alignItems": "center", + "flexDirection": "row", "padding": 0, } } > - - - - + + + - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.33873792024529126, + 0.9408807689542256, + -0.9408807689542256, + 0.33873792024529126, + 50.8847515111068, + 5.120153954341607, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + - + - Orangefox.eth - - + 0x2990079bcdEe240329a520d2444386FC119da21a + + - 0x2990079bcdEe240329a520d2444386FC119da21a - + } + > + Updated 1 sec ago + + - Updated 1 sec ago + Imported - - - Imported - - diff --git a/app/component-library/components/Cells/Cell/variants/CellSelect/__snapshots__/CellSelect.test.tsx.snap b/app/component-library/components/Cells/Cell/variants/CellSelect/__snapshots__/CellSelect.test.tsx.snap index 615ce5c97847..abdabeda711d 100644 --- a/app/component-library/components/Cells/Cell/variants/CellSelect/__snapshots__/CellSelect.test.tsx.snap +++ b/app/component-library/components/Cells/Cell/variants/CellSelect/__snapshots__/CellSelect.test.tsx.snap @@ -8,6 +8,7 @@ exports[`CellSelect should render default settings correctly 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -18,14 +19,15 @@ exports[`CellSelect should render default settings correctly 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.33873792024529126, + 0.9408807689542256, + -0.9408807689542256, + 0.33873792024529126, + 50.8847515111068, + 5.120153954341607, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + - + - Orangefox.eth - - + 0x2990079bcdEe240329a520d2444386FC119da21a + + - 0x2990079bcdEe240329a520d2444386FC119da21a - + } + > + Updated 1 sec ago + + - Updated 1 sec ago + Imported - - - Imported - - diff --git a/app/component-library/components/List/ListItem/ListItem.constants.ts b/app/component-library/components/List/ListItem/ListItem.constants.ts index 8ee1fb524fd0..3003517c37c0 100644 --- a/app/component-library/components/List/ListItem/ListItem.constants.ts +++ b/app/component-library/components/List/ListItem/ListItem.constants.ts @@ -9,13 +9,9 @@ export const TESTID_LISTITEM_GAP = 'listitem-gap'; // Defaults export const DEFAULT_LISTITEM_GAP = 16; export const DEFAULT_LISTITEM_VERTICALALIGNMENT = VerticalAlignment.Center; -export const DEFAULT_LISTITEM_TOPACCESSORYGAP = 0; -export const DEFAULT_LISTITEM_BOTTOMACCESSORYGAP = 0; // Sample consts export const SAMPLE_LISTITEM_PROPS: ListItemProps = { gap: DEFAULT_LISTITEM_GAP, verticalAlignment: DEFAULT_LISTITEM_VERTICALALIGNMENT, - topAccessoryGap: DEFAULT_LISTITEM_TOPACCESSORYGAP, - bottomAccessoryGap: DEFAULT_LISTITEM_BOTTOMACCESSORYGAP, }; diff --git a/app/component-library/components/List/ListItem/ListItem.stories.tsx b/app/component-library/components/List/ListItem/ListItem.stories.tsx index 083abaee2634..d6e359868460 100644 --- a/app/component-library/components/List/ListItem/ListItem.stories.tsx +++ b/app/component-library/components/List/ListItem/ListItem.stories.tsx @@ -26,36 +26,6 @@ const ListItemMeta = { }, defaultValue: SAMPLE_LISTITEM_PROPS.verticalAlignment, }, - topAccessory: { - control: { type: 'boolean' }, - defaultValue: false, - mapping: { - false: null, - true: ( - Sample Top Accessory - ), - }, - }, - bottomAccessory: { - control: { type: 'boolean' }, - defaultValue: false, - mapping: { - false: null, - true: ( - - Sample Bottom Accessory - - ), - }, - }, - topAccessoryGap: { - control: { type: 'number' }, - defaultValue: SAMPLE_LISTITEM_PROPS.topAccessoryGap, - }, - bottomAccessoryGap: { - control: { type: 'number' }, - defaultValue: SAMPLE_LISTITEM_PROPS.bottomAccessoryGap, - }, }, }; export default ListItemMeta; diff --git a/app/component-library/components/List/ListItem/ListItem.styles.ts b/app/component-library/components/List/ListItem/ListItem.styles.ts index df6305cdc20e..25d5fc68d408 100644 --- a/app/component-library/components/List/ListItem/ListItem.styles.ts +++ b/app/component-library/components/List/ListItem/ListItem.styles.ts @@ -17,8 +17,7 @@ import { VerticalAlignment, ListItemStyleSheetVars } from './ListItem.types'; */ const styleSheet = (params: { theme: Theme; vars: ListItemStyleSheetVars }) => { const { vars } = params; - const { style, verticalAlignment, topAccessoryGap, bottomAccessoryGap } = - vars; + const { style, verticalAlignment } = vars; let alignItems; switch (verticalAlignment) { case VerticalAlignment.Center: @@ -36,19 +35,11 @@ const styleSheet = (params: { theme: Theme; vars: ListItemStyleSheetVars }) => { base: Object.assign( { padding: 16, + flexDirection: 'row', + alignItems, } as ViewStyle, style, ) as ViewStyle, - item: { - flexDirection: 'row', - alignItems, - } as ViewStyle, - topAccessory: { - marginBottom: topAccessoryGap ?? 0, - }, - bottomAccessory: { - marginTop: bottomAccessoryGap ?? 0, - }, }); }; diff --git a/app/component-library/components/List/ListItem/ListItem.test.tsx b/app/component-library/components/List/ListItem/ListItem.test.tsx index 34a40bacfd4c..84211b78cd46 100644 --- a/app/component-library/components/List/ListItem/ListItem.test.tsx +++ b/app/component-library/components/List/ListItem/ListItem.test.tsx @@ -23,51 +23,6 @@ describe('ListItem', () => { expect(wrapper).toMatchSnapshot(); }); - it('should render the top accessory', () => { - const wrapper = render( - }> - - , - ); - expect(wrapper).toMatchSnapshot(); - }); - - it('should render the bottom accessory', () => { - const wrapper = render( - }> - - , - ); - expect(wrapper).toMatchSnapshot(); - }); - - it('should render the correct topAccessoryGap', () => { - const givenTopAccessoryGap = 20; - const { getByRole } = render( - } topAccessoryGap={givenTopAccessoryGap}> - - , - ); - expect(getByRole('none').props.children[0].props.style.marginBottom).toBe( - givenTopAccessoryGap, - ); - }); - - it('should render the correct bottomAccessoryGap', () => { - const givenBottomAccessoryGap = 20; - const { getByRole } = render( - } - bottomAccessoryGap={givenBottomAccessoryGap} - > - - , - ); - expect(getByRole('none').props.children[2].props.style.marginTop).toBe( - givenBottomAccessoryGap, - ); - }); - it('should render the correct default gap', () => { const { getByTestId } = render( @@ -106,9 +61,7 @@ describe('ListItem', () => { , ); - expect(getByRole('none').props.children[1].props.style.alignItems).toBe( - 'center', - ); + expect(getByRole('none').props.style.alignItems).toBe('center'); }); it('should render the given verticalAlignment', () => { @@ -117,9 +70,6 @@ describe('ListItem', () => { , ); - - expect(getByRole('none').props.children[1].props.style.alignItems).toBe( - 'flex-start', - ); + expect(getByRole('none').props.style.alignItems).toBe('flex-start'); }); }); diff --git a/app/component-library/components/List/ListItem/ListItem.tsx b/app/component-library/components/List/ListItem/ListItem.tsx index 7c86fbfbe534..5c96fec91d57 100644 --- a/app/component-library/components/List/ListItem/ListItem.tsx +++ b/app/component-library/components/List/ListItem/ListItem.tsx @@ -19,10 +19,6 @@ import { const ListItem: React.FC = ({ style, children, - topAccessory, - bottomAccessory, - topAccessoryGap, - bottomAccessoryGap, gap = DEFAULT_LISTITEM_GAP, verticalAlignment = DEFAULT_LISTITEM_VERTICALALIGNMENT, ...props @@ -30,32 +26,24 @@ const ListItem: React.FC = ({ const { styles } = useStyles(styleSheet, { style, verticalAlignment, - topAccessoryGap, - bottomAccessoryGap, }); return ( - {topAccessory && {topAccessory}} - - {React.Children.toArray(children) - .filter((child) => !!child) - .map((child, index) => ( - - {index > 0 && ( - - )} - {child} - - ))} - - {bottomAccessory && ( - {bottomAccessory} - )} + {React.Children.toArray(children) + .filter((child) => !!child) + .map((child, index) => ( + + {index > 0 && ( + + )} + {child} + + ))} ); }; diff --git a/app/component-library/components/List/ListItem/ListItem.types.ts b/app/component-library/components/List/ListItem/ListItem.types.ts index 18a905c72e1d..1ab097d59352 100644 --- a/app/component-library/components/List/ListItem/ListItem.types.ts +++ b/app/component-library/components/List/ListItem/ListItem.types.ts @@ -18,22 +18,6 @@ export interface ListItemProps extends ViewProps { * Content to wrap to display. */ children?: React.ReactNode; - /** - * Optional prop to include content to be displayed above the ListItem. - */ - topAccessory?: React.ReactNode; - /** - * Optional prop to include content to be displayed below the ListItem. - */ - bottomAccessory?: React.ReactNode; - /** - * Optional prop to configure the gap between the topAccessory and the ListItem. - */ - topAccessoryGap?: number; - /** - * Optional prop to configure the gap between the bottomAccessory and the ListItem. - */ - bottomAccessoryGap?: number; /** * Optional prop to configure the gap between items inside the ListItem. */ @@ -53,5 +37,5 @@ export interface ListItemProps extends ViewProps { */ export type ListItemStyleSheetVars = Pick< ListItemProps, - 'style' | 'verticalAlignment' | 'topAccessoryGap' | 'bottomAccessoryGap' + 'style' | 'verticalAlignment' >; diff --git a/app/component-library/components/List/ListItem/__snapshots__/ListItem.test.tsx.snap b/app/component-library/components/List/ListItem/__snapshots__/ListItem.test.tsx.snap index e23d2a00c93e..a197bdd692f3 100644 --- a/app/component-library/components/List/ListItem/__snapshots__/ListItem.test.tsx.snap +++ b/app/component-library/components/List/ListItem/__snapshots__/ListItem.test.tsx.snap @@ -6,83 +6,12 @@ exports[`ListItem should render snapshot correctly 1`] = ` accessible={true} style={ { + "alignItems": "center", + "flexDirection": "row", "padding": 16, } } > - - - - -`; - -exports[`ListItem should render the bottom accessory 1`] = ` - - - - - - - - -`; - -exports[`ListItem should render the top accessory 1`] = ` - - - - - - - + `; diff --git a/app/component-library/components/List/ListItemMultiSelect/ListItemMultiSelect.styles.ts b/app/component-library/components/List/ListItemMultiSelect/ListItemMultiSelect.styles.ts index 8bd81b3bb466..e317e812ab85 100644 --- a/app/component-library/components/List/ListItemMultiSelect/ListItemMultiSelect.styles.ts +++ b/app/component-library/components/List/ListItemMultiSelect/ListItemMultiSelect.styles.ts @@ -27,6 +27,7 @@ const styleSheet = (params: { { padding: 16, borderRadius: 4, + alignItems: 'flex-start', backgroundColor: colors.background.default, opacity: isDisabled ? 0.5 : 1, } as ViewStyle, diff --git a/app/component-library/components/List/ListItemMultiSelect/__snapshots__/ListItemMultiSelect.test.tsx.snap b/app/component-library/components/List/ListItemMultiSelect/__snapshots__/ListItemMultiSelect.test.tsx.snap index 853d66695618..8ad70722b3d5 100644 --- a/app/component-library/components/List/ListItemMultiSelect/__snapshots__/ListItemMultiSelect.test.tsx.snap +++ b/app/component-library/components/List/ListItemMultiSelect/__snapshots__/ListItemMultiSelect.test.tsx.snap @@ -5,6 +5,7 @@ exports[`ListItemMultiSelect should render snapshot correctly 1`] = ` disabled={false} style={ { + "alignItems": "flex-start", "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, @@ -17,57 +18,50 @@ exports[`ListItemMultiSelect should render snapshot correctly 1`] = ` accessible={true} style={ { + "alignItems": "center", + "flexDirection": "row", "padding": 0, } } > - - - - - - + + + `; diff --git a/app/component-library/components/List/ListItemSelect/ListItemSelect.styles.ts b/app/component-library/components/List/ListItemSelect/ListItemSelect.styles.ts index 5e590a707080..f7ef433fe81c 100644 --- a/app/component-library/components/List/ListItemSelect/ListItemSelect.styles.ts +++ b/app/component-library/components/List/ListItemSelect/ListItemSelect.styles.ts @@ -27,6 +27,7 @@ const styleSheet = (params: { { position: 'relative', opacity: isDisabled ? 0.5 : 1, + padding: 16, borderRadius: 4, backgroundColor: colors.background.default, } as ViewStyle, @@ -38,7 +39,7 @@ const styleSheet = (params: { backgroundColor: colors.primary.muted, }, listItem: { - padding: 16, + padding: 0, }, underlayBar: { marginVertical: 4, diff --git a/app/component-library/components/List/ListItemSelect/__snapshots__/ListItemSelect.test.tsx.snap b/app/component-library/components/List/ListItemSelect/__snapshots__/ListItemSelect.test.tsx.snap index 0fca6037af1b..4199cc4eb072 100644 --- a/app/component-library/components/List/ListItemSelect/__snapshots__/ListItemSelect.test.tsx.snap +++ b/app/component-library/components/List/ListItemSelect/__snapshots__/ListItemSelect.test.tsx.snap @@ -8,6 +8,7 @@ exports[`ListItemSelect should render snapshot correctly 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -17,20 +18,13 @@ exports[`ListItemSelect should render snapshot correctly 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - + `; diff --git a/app/component-library/components/Pickers/PickerAccount/PickerAccount.tsx b/app/component-library/components/Pickers/PickerAccount/PickerAccount.tsx index ce9a9ab90143..5a4c293777fa 100644 --- a/app/component-library/components/Pickers/PickerAccount/PickerAccount.tsx +++ b/app/component-library/components/Pickers/PickerAccount/PickerAccount.tsx @@ -51,7 +51,7 @@ const PickerAccount: React.ForwardRefRenderFunction< /> {accountName} diff --git a/app/component-library/components/Pickers/PickerAccount/__snapshots__/PickerAccount.test.tsx.snap b/app/component-library/components/Pickers/PickerAccount/__snapshots__/PickerAccount.test.tsx.snap index 0afdb8affeb7..f2c7d176b13b 100644 --- a/app/component-library/components/Pickers/PickerAccount/__snapshots__/PickerAccount.test.tsx.snap +++ b/app/component-library/components/Pickers/PickerAccount/__snapshots__/PickerAccount.test.tsx.snap @@ -178,11 +178,11 @@ exports[`PickerAccount should render correctly 1`] = ` style={ { "color": "#141618", - "fontFamily": "EuclidCircularB-Medium", - "fontSize": 14, - "fontWeight": "500", + "fontFamily": "EuclidCircularB-Regular", + "fontSize": 16, + "fontWeight": "400", "letterSpacing": 0, - "lineHeight": 22, + "lineHeight": 24, } } testID="account-label" @@ -207,7 +207,7 @@ exports[`PickerAccount should render correctly 1`] = ` diff --git a/app/component-library/components/Pickers/PickerBase/__snapshots__/PickerBase.test.tsx.snap b/app/component-library/components/Pickers/PickerBase/__snapshots__/PickerBase.test.tsx.snap index f93ccf2a438a..6d3ac0d242b9 100644 --- a/app/component-library/components/Pickers/PickerBase/__snapshots__/PickerBase.test.tsx.snap +++ b/app/component-library/components/Pickers/PickerBase/__snapshots__/PickerBase.test.tsx.snap @@ -17,7 +17,7 @@ exports[`PickerBase should render correctly 1`] = ` > - - - - - - + + - - - + } + height={32} + matrix={ + [ + -0.9438009515832294, + 0.3305143927132231, + -0.3305143927132231, + -0.9438009515832294, + 58.82830600098727, + 40.20612936020905, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + + - + Sample SelectButton label + + - - Sample SelectButton label - - - Sample SelectButton description - - + Sample SelectButton description + diff --git a/app/component-library/components/Select/SelectButton/foundation/__snapshots__/SelectButtonBase.test.tsx.snap b/app/component-library/components/Select/SelectButton/foundation/__snapshots__/SelectButtonBase.test.tsx.snap index b73b687f3310..6506738d46b4 100644 --- a/app/component-library/components/Select/SelectButton/foundation/__snapshots__/SelectButtonBase.test.tsx.snap +++ b/app/component-library/components/Select/SelectButton/foundation/__snapshots__/SelectButtonBase.test.tsx.snap @@ -16,7 +16,9 @@ exports[`SelectButtonBase should render snapshot correctly 1`] = ` accessible={true} style={ { + "alignItems": "center", "flex": 1, + "flexDirection": "row", "marginRight": 8, "padding": 0, } @@ -25,209 +27,200 @@ exports[`SelectButtonBase should render snapshot correctly 1`] = ` - - - - - - + + - - - + } + height={32} + matrix={ + [ + -0.9438009515832294, + 0.3305143927132231, + -0.3305143927132231, + -0.9438009515832294, + 58.82830600098727, + 40.20612936020905, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + + - + Sample SelectValue label + + - - Sample SelectValue label - - - Sample SelectValue description - - + Sample SelectValue description + diff --git a/app/component-library/components/Select/SelectOption/__snapshots__/SelectOption.test.tsx.snap b/app/component-library/components/Select/SelectOption/__snapshots__/SelectOption.test.tsx.snap index 3e2315357d9f..f4844f6ac4ab 100644 --- a/app/component-library/components/Select/SelectOption/__snapshots__/SelectOption.test.tsx.snap +++ b/app/component-library/components/Select/SelectOption/__snapshots__/SelectOption.test.tsx.snap @@ -9,6 +9,7 @@ exports[`SelectOption should render snapshot correctly 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -18,235 +19,220 @@ exports[`SelectOption should render snapshot correctly 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - + - - + - + - - - - - - - + } + height={32} + matrix={ + [ + -0.9438009515832294, + 0.3305143927132231, + -0.3305143927132231, + -0.9438009515832294, + 58.82830600098727, + 40.20612936020905, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + + + - + Sample SelectOption label + + - - Sample SelectOption label - - - Sample SelectOption description - - - + } + > + Sample SelectOption description + diff --git a/app/component-library/components/Select/SelectValue/SelectValue.styles.ts b/app/component-library/components/Select/SelectValue/SelectValue.styles.ts index d8eead46b1a3..090e2954d546 100644 --- a/app/component-library/components/Select/SelectValue/SelectValue.styles.ts +++ b/app/component-library/components/Select/SelectValue/SelectValue.styles.ts @@ -26,7 +26,6 @@ const styleSheet = (params: { base: Object.assign( { padding: 0, - flex: 1, } as ViewStyle, style, ) as ViewStyle, diff --git a/app/component-library/components/Select/SelectValue/__snapshots__/SelectValue.test.tsx.snap b/app/component-library/components/Select/SelectValue/__snapshots__/SelectValue.test.tsx.snap index 9db4ae456c23..f70bceb8b370 100644 --- a/app/component-library/components/Select/SelectValue/__snapshots__/SelectValue.test.tsx.snap +++ b/app/component-library/components/Select/SelectValue/__snapshots__/SelectValue.test.tsx.snap @@ -6,7 +6,8 @@ exports[`SelectValue should render snapshot correctly 1`] = ` accessible={true} style={ { - "flex": 1, + "alignItems": "center", + "flexDirection": "row", "padding": 0, } } @@ -14,209 +15,200 @@ exports[`SelectValue should render snapshot correctly 1`] = ` - - - - - - + + - - - + } + height={32} + matrix={ + [ + -0.9438009515832294, + 0.3305143927132231, + -0.3305143927132231, + -0.9438009515832294, + 58.82830600098727, + 40.20612936020905, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + + - + Sample SelectValue label + + - - Sample SelectValue label - - - Sample SelectValue description - - + Sample SelectValue description + `; diff --git a/app/components/Base/ModalDragger.tsx b/app/components/Base/ModalDragger.js similarity index 80% rename from app/components/Base/ModalDragger.tsx rename to app/components/Base/ModalDragger.js index cb0ea3f1fd13..3e1c58daf26d 100644 --- a/app/components/Base/ModalDragger.tsx +++ b/app/components/Base/ModalDragger.js @@ -1,14 +1,10 @@ import React from 'react'; +import PropTypes from 'prop-types'; import { StyleSheet, View } from 'react-native'; import { useTheme } from '../../util/theme'; -import { Theme } from '@metamask/design-tokens'; import { colors as importedColors } from '../../styles/common'; -interface ModalDraggerProps { - borderless?: boolean; -} - -const createStyles = (colors: Theme['colors']) => +const createStyles = (colors) => StyleSheet.create({ draggerWrapper: { width: '100%', @@ -29,7 +25,7 @@ const createStyles = (colors: Theme['colors']) => }, }); -function ModalDragger({ borderless }: ModalDraggerProps) { +function ModalDragger({ borderless }) { const { colors } = useTheme(); const styles = createStyles(colors); @@ -40,4 +36,8 @@ function ModalDragger({ borderless }: ModalDraggerProps) { ); } +ModalDragger.propTypes = { + borderless: PropTypes.bool, +}; + export default ModalDragger; diff --git a/app/components/Base/SelectorButton.tsx b/app/components/Base/SelectorButton.js similarity index 65% rename from app/components/Base/SelectorButton.tsx rename to app/components/Base/SelectorButton.js index b886dd85ce96..1c3d2d794448 100644 --- a/app/components/Base/SelectorButton.tsx +++ b/app/components/Base/SelectorButton.js @@ -1,16 +1,10 @@ import React from 'react'; -import { View, StyleSheet, TouchableOpacity, TouchableOpacityProps, GestureResponderEvent } from 'react-native'; +import PropTypes from 'prop-types'; +import { View, StyleSheet, TouchableOpacity } from 'react-native'; import Icon from 'react-native-vector-icons/FontAwesome'; import { useTheme } from '../../util/theme'; -import { Theme } from '@metamask/design-tokens'; -interface SelectorButtonProps { - onPress: (event: GestureResponderEvent) => void; - disabled?: boolean; - children: React.ReactNode; -} - -const createStyles = (colors: Theme['colors']) => +const createStyles = (colors) => StyleSheet.create({ container: { backgroundColor: colors.background.alternative, @@ -29,7 +23,7 @@ const createStyles = (colors: Theme['colors']) => }, }); -const SelectorButton: React.FC = ({ onPress, disabled, children, ...props }) => { +function SelectorButton({ onPress, disabled, children, ...props }) { const { colors } = useTheme(); const styles = createStyles(colors); @@ -41,6 +35,12 @@ const SelectorButton: React.FC = ({ ); +} + +SelectorButton.propTypes = { + children: PropTypes.node, + onPress: PropTypes.func, + disabled: PropTypes.bool, }; export default SelectorButton; diff --git a/app/components/Base/Summary.tsx b/app/components/Base/Summary.js similarity index 58% rename from app/components/Base/Summary.tsx rename to app/components/Base/Summary.js index 6a953cf82bd0..2b89be27a0c8 100644 --- a/app/components/Base/Summary.tsx +++ b/app/components/Base/Summary.js @@ -1,9 +1,9 @@ import React from 'react'; -import { View, StyleSheet, ViewStyle, StyleProp } from 'react-native'; +import PropTypes from 'prop-types'; +import { View, StyleSheet } from 'react-native'; import { useTheme } from '../../util/theme'; -import type { Theme as DesignTokenTheme } from '@metamask/design-tokens'; -const createStyles = (colors: DesignTokenTheme['colors']) => +const createStyles = (colors) => StyleSheet.create({ wrapper: { borderWidth: 1, @@ -40,33 +40,11 @@ const useGetStyles = () => { return createStyles(colors); }; -interface SummaryProps { - style?: StyleProp; -} - -interface SummaryRowProps extends SummaryProps { - end?: boolean; - last?: boolean; -} - -interface SummaryColProps extends SummaryProps { - end?: boolean; -} - -interface SummarySeparatorProps extends SummaryProps {} - -interface SummaryComponent extends React.FC { - Row: React.FC; - Col: React.FC; - Separator: React.FC; -} - -const Summary: SummaryComponent = ({ style, ...props }) => { +const Summary = ({ style, ...props }) => { const styles = useGetStyles(); return ; }; - -const SummaryRow: React.FC = ({ style, end, last, ...props }) => { +const SummaryRow = ({ style, end, last, ...props }) => { const styles = useGetStyles(); return ( = ({ style, end, last, ...props }) = /> ); }; - -const SummaryCol: React.FC = ({ style, end, ...props }) => { +const SummaryCol = ({ style, end, ...props }) => { const styles = useGetStyles(); return ; }; - -const SummarySeparator: React.FC = ({ style, ...props }) => { +const SummarySeparator = ({ style, ...props }) => { const styles = useGetStyles(); return ; }; @@ -89,5 +65,34 @@ const SummarySeparator: React.FC = ({ style, ...props }) Summary.Row = SummaryRow; Summary.Col = SummaryCol; Summary.Separator = SummarySeparator; - export default Summary; + +/** + * Any other external style defined in props will be applied + */ +const stylePropType = PropTypes.oneOfType([PropTypes.object, PropTypes.array]); + +Summary.propTypes = { + style: stylePropType, +}; +SummaryRow.propTypes = { + style: stylePropType, + /** + * Aligns content to the end of the row + */ + end: PropTypes.bool, + /** + * Add style to the last row of the summary + */ + last: PropTypes.bool, +}; +SummaryCol.propTypes = { + style: stylePropType, + /** + * Aligns content to the end of the row + */ + end: PropTypes.bool, +}; +SummarySeparator.propTypes = { + style: stylePropType, +}; diff --git a/app/components/Nav/Main/MainNavigator.js b/app/components/Nav/Main/MainNavigator.js index dd7342adc585..b73c245d6cff 100644 --- a/app/components/Nav/Main/MainNavigator.js +++ b/app/components/Nav/Main/MainNavigator.js @@ -89,7 +89,7 @@ import NftDetails from '../../Views/NftDetails'; import NftDetailsFullImage from '../../Views/NftDetails/NFtDetailsFullImage'; import AccountPermissions from '../../../components/Views/AccountPermissions'; import { AccountPermissionsScreens } from '../../../components/Views/AccountPermissions/AccountPermissions.types'; -import { StakeModalStack, StakeScreenStack } from '../../UI/Stake/routes'; +import StakeInputView from '../../UI/Stake/Views/InputView/StakeInputView'; const Stack = createStackNavigator(); const Tab = createBottomTabNavigator(); @@ -694,6 +694,16 @@ const Swaps = () => ( ); +const Stake = () => ( + + + +); + const SetPasswordFlow = () => ( ( {() => } - - + { return ( - { const [showDeprecatedAlert, setShowDeprecatedAlert] = useState(true); const { colors } = useTheme(); const styles = createStyles(colors); + const backgroundMode = useRef(false); const locale = useRef(I18n.locale); const removeConnectionStatusListener = useRef(); const removeNotVisibleNotifications = props.removeNotVisibleNotifications; - useNotificationHandler(props.navigation); + useEnableAutomaticSecurityChecks(); useMinimumVersions(); - - - useEffect(() => { if (DEPRECATED_NETWORKS.includes(props.chainId)) { setShowDeprecatedAlert(true); @@ -268,9 +267,24 @@ const Main = (props) => { initForceReload(); return; } - }); + const bootstrapAndroidInitialNotification = useCallback(async () => { + if (Device.isAndroid()) { + const initialNotification = await notifee.getInitialNotification(); + + if ( + initialNotification?.data?.action === 'tx' && + initialNotification.data.id + ) { + NotificationManager.setTransactionToView(initialNotification.data.id); + props.navigation.navigate(Routes.TRANSACTIONS_VIEW); + } + } + }, [props.navigation]); + + useNotificationHandler(bootstrapAndroidInitialNotification, props.navigation); + // Remove all notifications that aren't visible useEffect(() => { removeNotVisibleNotifications(); diff --git a/app/components/UI/AccountSelectorList/AccountSelector.test.tsx b/app/components/UI/AccountSelectorList/AccountSelector.test.tsx index 306c88825c40..0cb8daa6c9bf 100644 --- a/app/components/UI/AccountSelectorList/AccountSelector.test.tsx +++ b/app/components/UI/AccountSelectorList/AccountSelector.test.tsx @@ -8,12 +8,7 @@ import { View } from 'react-native'; import { ACCOUNT_BALANCE_BY_ADDRESS_TEST_ID } from '../../../../wdio/screen-objects/testIDs/Components/AccountListComponent.testIds'; import { backgroundState } from '../../../util/test/initial-root-state'; import { regex } from '../../../../app/util/regex'; -import { - createMockAccountsControllerState, - createMockAccountsControllerStateWithSnap, - MOCK_ADDRESS_1, - MOCK_ADDRESS_2, -} from '../../../util/test/accountsControllerTestUtils'; +import { createMockAccountsControllerState } from '../../../util/test/accountsControllerTestUtils'; import { mockNetworkState } from '../../../util/test/network'; import { CHAIN_IDS } from '@metamask/transaction-controller'; @@ -205,28 +200,4 @@ describe('AccountSelectorList', () => { expect(within(accountNameItems[1]).getByText('Account 2')).toBeDefined(); }); }); - it('renders "Snaps (beta)" tag for Snap accounts', async () => { - const mockAccountsWithSnap = createMockAccountsControllerStateWithSnap([ - MOCK_ADDRESS_1, - MOCK_ADDRESS_2, - ]); - - const stateWithSnapAccount = { - ...initialState, - engine: { - ...initialState.engine, - backgroundState: { - ...initialState.engine.backgroundState, - AccountsController: mockAccountsWithSnap, - }, - }, - }; - - const { queryByText } = renderComponent(stateWithSnapAccount); - - await waitFor(async () => { - const snapTag = await queryByText('Snaps (beta)'); - expect(snapTag).toBeDefined(); - }); - }); }); diff --git a/app/components/UI/AccountSelectorList/__snapshots__/AccountSelector.test.tsx.snap b/app/components/UI/AccountSelectorList/__snapshots__/AccountSelector.test.tsx.snap index 49c9d6e96b1c..da19df64fb1a 100644 --- a/app/components/UI/AccountSelectorList/__snapshots__/AccountSelector.test.tsx.snap +++ b/app/components/UI/AccountSelectorList/__snapshots__/AccountSelector.test.tsx.snap @@ -65,6 +65,7 @@ exports[`AccountSelectorList renders all accounts with balances 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -75,243 +76,236 @@ exports[`AccountSelectorList renders all accounts with balances 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.7046342099635947, + -0.7095707365365209, + 0.7095707365365209, + 0.7046342099635947, + -25.225718686778755, + -4.611026307883787, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + + + + + Account 1 + + + 0xC495...D272 + + + - Account 1 - - - 0xC495...D272 - - - - - - $3200.00 + $3200.00 1 ETH - - + @@ -358,6 +352,7 @@ exports[`AccountSelectorList renders all accounts with balances 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -368,243 +363,236 @@ exports[`AccountSelectorList renders all accounts with balances 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.6704266189587993, + -0.7419758409756162, + 0.7419758409756162, + 0.6704266189587993, + 8.152366664413217, + -0.7899246956676649, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + + + + + Account 2 + + + 0xd018...78E7 + + + - Account 2 - - - 0xd018...78E7 - - - - - - $6400.00 + $6400.00 2 ETH - - + @@ -681,6 +669,7 @@ exports[`AccountSelectorList renders all accounts with right accessory 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -691,222 +680,215 @@ exports[`AccountSelectorList renders all accounts with right accessory 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.7046342099635947, + -0.7095707365365209, + 0.7095707365365209, + 0.7046342099635947, + -25.225718686778755, + -4.611026307883787, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + - - Account 1 - - - 0xC495...D272 - - - + - - 0xC4955C0d639D99699Bfd7Ec54d9FaFEe40e4D272 - Account 1 - + 0xC495...D272 + + + + + 0xC4955C0d639D99699Bfd7Ec54d9FaFEe40e4D272 - Account 1 @@ -927,6 +909,7 @@ exports[`AccountSelectorList renders all accounts with right accessory 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -937,222 +920,215 @@ exports[`AccountSelectorList renders all accounts with right accessory 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.6704266189587993, + -0.7419758409756162, + 0.7419758409756162, + 0.6704266189587993, + 8.152366664413217, + -0.7899246956676649, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + - + + - - Account 2 - - - 0xd018...78E7 - - - + - - 0xd018538C87232FF95acbCe4870629b75640a78E7 - Account 2 - + 0xd018...78E7 + + + + + 0xd018538C87232FF95acbCe4870629b75640a78E7 - Account 2 @@ -1228,6 +1204,7 @@ exports[`AccountSelectorList renders correctly 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -1238,243 +1215,236 @@ exports[`AccountSelectorList renders correctly 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.7046342099635947, + -0.7095707365365209, + 0.7095707365365209, + 0.7046342099635947, + -25.225718686778755, + -4.611026307883787, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + + + + + Account 1 + + + 0xC495...D272 + + + - Account 1 - - - 0xC495...D272 - - - - - - $3200.00 + $3200.00 1 ETH - - + @@ -1521,6 +1491,7 @@ exports[`AccountSelectorList renders correctly 1`] = ` "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -1531,243 +1502,236 @@ exports[`AccountSelectorList renders correctly 1`] = ` accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - - - - + + - - - + } + height={32} + matrix={ + [ + 0.6704266189587993, + -0.7419758409756162, + 0.7419758409756162, + 0.6704266189587993, + 8.152366664413217, + -0.7899246956676649, + ] + } + propList={ + [ + "fill", + ] + } + width={32} + x={0} + y={0} + /> + + + + + + Account 2 + + + 0xd018...78E7 + + + - Account 2 - - - 0xd018...78E7 - - - - - - $6400.00 + $6400.00 2 ETH - - + @@ -1840,6 +1804,7 @@ exports[`AccountSelectorList should render all accounts but only the balance for "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -1850,127 +1815,120 @@ exports[`AccountSelectorList should render all accounts but only the balance for accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - + + Account 1 + + - + } + > + 0xC495...D272 + + + - Account 1 - - - 0xC495...D272 - - - - - - $3200.00 + $3200.00 1 ETH - - + @@ -2017,6 +1975,7 @@ exports[`AccountSelectorList should render all accounts but only the balance for "backgroundColor": "#ffffff", "borderRadius": 4, "opacity": 1, + "padding": 16, "position": "relative", } } @@ -2027,94 +1986,87 @@ exports[`AccountSelectorList should render all accounts but only the balance for accessible={true} style={ { - "padding": 16, + "alignItems": "center", + "flexDirection": "row", + "padding": 0, } } > - - - - - + + + - Account 2 - - + Account 2 + + - 0xd018...78E7 - - + } + > + 0xd018...78E7 + diff --git a/app/components/UI/AddCustomCollectible/index.tsx b/app/components/UI/AddCustomCollectible/index.tsx index be364abd6c8c..a0bf94fd3748 100644 --- a/app/components/UI/AddCustomCollectible/index.tsx +++ b/app/components/UI/AddCustomCollectible/index.tsx @@ -6,6 +6,7 @@ import { TextInput, View, StyleSheet, + Platform, } from 'react-native'; import { fontStyles } from '../../../styles/common'; import Engine from '../../../core/Engine'; @@ -17,7 +18,14 @@ import Device from '../../../util/device'; import { MetaMetricsEvents } from '../../../core/Analytics'; import { useTheme } from '../../../util/theme'; -import { NFTImportScreenSelectorsIDs } from '../../../../e2e/selectors/wallet/ImportNFTView.selectors'; +import { CUSTOM_TOKEN_CONTAINER_ID } from '../../../../wdio/screen-objects/testIDs/Screens/AddCustomToken.testIds'; +import generateTestId from '../../../../wdio/utils/generateTestId'; +import { + NFT_ADDRESS_INPUT_BOX_ID, + NFT_IDENTIFIER_WARNING_MESSAGE_ID, + NFT_ADDRESS_WARNING_MESSAGE_ID, + NFT_IDENTIFIER_INPUT_BOX_ID, +} from '../../../../wdio/screen-objects/testIDs/Screens/NFTImportScreen.testIds'; import { selectChainId } from '../../../selectors/networkController'; import { selectSelectedInternalAccountChecksummedAddress } from '../../../selectors/accountsController'; import { getDecimalChainId } from '../../../util/networks'; @@ -225,7 +233,7 @@ const AddCustomCollectible = ({ return ( {warningAddress} @@ -274,7 +282,7 @@ const AddCustomCollectible = ({ keyboardType="numeric" onChangeText={onTokenIdChange} onBlur={validateCustomCollectibleTokenId} - testID={NFTImportScreenSelectorsIDs.IDENTIFIER_INPUT_BOX} + {...generateTestId(Platform, NFT_IDENTIFIER_INPUT_BOX_ID)} ref={assetTokenIdInput} onSubmitEditing={addNft} returnKeyType={'done'} @@ -284,7 +292,7 @@ const AddCustomCollectible = ({ /> {warningTokenId} diff --git a/app/components/UI/AddCustomToken/__snapshots__/index.test.tsx.snap b/app/components/UI/AddCustomToken/__snapshots__/index.test.tsx.snap index 4ad291a7d081..e0596fa1cff6 100644 --- a/app/components/UI/AddCustomToken/__snapshots__/index.test.tsx.snap +++ b/app/components/UI/AddCustomToken/__snapshots__/index.test.tsx.snap @@ -8,6 +8,7 @@ exports[`AddCustomToken render matches previous snapshot 1`] = ` "flex": 1, } } + testID="add-custom-token-screen" > @@ -225,7 +226,7 @@ exports[`AddCustomToken render matches previous snapshot 1`] = ` "width": "90%", } } - testID="token-import-next-button" + testID="next-button-custom-import" > + {this.renderBanner()} @@ -529,14 +540,14 @@ class AddCustomToken extends PureComponent { onBlur={() => { this.handleBlurAddress(); }} - testID={ImportTokenViewSelectorsIDs.ADDRESS_INPUT} + {...generateTestId(Platform, TOKEN_ADDRESS_INPUT_BOX_ID)} onSubmitEditing={this.jumpToAssetSymbol} returnKeyType={'next'} keyboardAppearance={themeAppearance} /> {this.state.warningAddress} @@ -554,7 +565,7 @@ class AddCustomToken extends PureComponent { value={this.state.symbol} onChangeText={this.onSymbolChange} onBlur={this.validateCustomTokenSymbol} - testID={ImportTokenViewSelectorsIDs.SYMBOL_INPUT} + {...generateTestId(Platform, TOKEN_ADDRESS_SYMBOL_ID)} ref={this.assetSymbolInput} onSubmitEditing={this.jumpToAssetPrecision} returnKeyType={'next'} @@ -579,7 +590,7 @@ class AddCustomToken extends PureComponent { placeholderTextColor={colors.text.muted} onChangeText={this.onDecimalsChange} onBlur={this.validateCustomTokenDecimals} - testID={ImportTokenViewSelectorsIDs.DECIMAL_INPUT} + {...generateTestId(Platform, NFT_IDENTIFIER_INPUT_BOX_ID)} ref={this.assetPrecisionInput} onSubmitEditing={this.addToken} returnKeyType={'done'} @@ -590,7 +601,10 @@ class AddCustomToken extends PureComponent { {this.state.warningDecimals ? ( {this.state.warningDecimals}{' '} diff --git a/app/components/UI/AddressCopy/AddressCopy.styles.ts b/app/components/UI/AddressCopy/AddressCopy.styles.ts index 089c48d51368..5a79e70438dc 100644 --- a/app/components/UI/AddressCopy/AddressCopy.styles.ts +++ b/app/components/UI/AddressCopy/AddressCopy.styles.ts @@ -7,18 +7,14 @@ const styleSheet = (params: { theme: Theme }) => { const { colors } = theme; return StyleSheet.create({ - address: { - flexDirection: 'row', - alignItems: 'center', - }, + address: { flexDirection: 'row' }, copyButton: { flexDirection: 'row', alignItems: 'center', backgroundColor: colors.primary.muted, borderRadius: 20, - paddingHorizontal: 12, - padding: 4, - marginLeft: 12, + paddingHorizontal: 8, + marginLeft: 8, }, icon: { marginLeft: 4 }, }); diff --git a/app/components/UI/AddressCopy/AddressCopy.tsx b/app/components/UI/AddressCopy/AddressCopy.tsx index d295c5f75ad7..17f8dbd1550e 100644 --- a/app/components/UI/AddressCopy/AddressCopy.tsx +++ b/app/components/UI/AddressCopy/AddressCopy.tsx @@ -79,7 +79,7 @@ const AddressCopy = ({ formatAddressType = 'full' }: AddressCopyProps) => { > {selectedInternalAccount diff --git a/app/components/UI/ApprovalTagUrl/ApprovalTagUrl.tsx b/app/components/UI/ApprovalTagUrl/ApprovalTagUrl.tsx index e7980f2848d2..c66a2390c3d0 100644 --- a/app/components/UI/ApprovalTagUrl/ApprovalTagUrl.tsx +++ b/app/components/UI/ApprovalTagUrl/ApprovalTagUrl.tsx @@ -4,12 +4,12 @@ import { useSelector } from 'react-redux'; import { strings } from '../../../../locales/i18n'; import TagUrl from '../../../component-library/components/Tags/TagUrl'; -import { useStyles } from '../../../component-library/hooks'; import AppConstants from '../../../core/AppConstants'; -import { selectInternalAccounts } from '../../../selectors/accountsController'; import { selectAccountsByChainId } from '../../../selectors/accountTrackerController'; import { prefixUrlWithProtocol } from '../../../util/browser'; import useFavicon from '../../hooks/useFavicon/useFavicon'; +import { selectInternalAccounts } from '../../../selectors/accountsController'; +import { useStyles } from '../../../component-library/hooks'; import stylesheet from './ApprovalTagUrl.styles'; const { ORIGIN_DEEPLINK, ORIGIN_QR_CODE } = AppConstants.DEEPLINKS; @@ -51,14 +51,12 @@ const ApprovalTagUrl = ({ const domainTitle = useMemo(() => { let title = ''; - if (url || currentEnsName || origin) { - title = prefixUrlWithProtocol(currentEnsName || origin || url); - } else { - title = ''; + if (url || currentEnsName) { + title = prefixUrlWithProtocol(currentEnsName || url || ''); } return title; - }, [currentEnsName, origin, url]); + }, [currentEnsName, url]); const faviconSource = useFavicon(origin as string) as | { uri: string } diff --git a/app/components/UI/AssetList/index.js b/app/components/UI/AssetList/index.js index f5f736236de1..c5c89f3709d9 100644 --- a/app/components/UI/AssetList/index.js +++ b/app/components/UI/AssetList/index.js @@ -6,6 +6,7 @@ import StyledButton from '../StyledButton'; // eslint-disable-line import/no-un import AssetIcon from '../AssetIcon'; import { fontStyles } from '../../../styles/common'; import Text from '../../Base/Text'; +import { ImportTokenViewSelectorsIDs } from '../../../../e2e/selectors/ImportTokenView.selectors'; const styles = StyleSheet.create({ rowWrapper: { @@ -79,6 +80,7 @@ export default class AssetList extends PureComponent { containerStyle={styles.item} onPress={() => handleSelectAsset(searchResults[i])} // eslint-disable-line key={i} + testID={ImportTokenViewSelectorsIDs.CONTAINER} > diff --git a/app/components/UI/AssetOverview/Balance/Balance.styles.tsx b/app/components/UI/AssetOverview/Balance/Balance.styles.tsx index 335718d5c39c..ce76a5f26eaa 100644 --- a/app/components/UI/AssetOverview/Balance/Balance.styles.tsx +++ b/app/components/UI/AssetOverview/Balance/Balance.styles.tsx @@ -24,7 +24,9 @@ const styleSheet = (params: { theme: Theme }) => { overflow: 'hidden', }, title: { - paddingVertical: 4, + ...typography.sHeadingSM, + marginVertical: 0, + paddingVertical: 8, paddingHorizontal: 15, } as TextStyle, text: { diff --git a/app/components/UI/AssetOverview/Balance/Balance.tsx b/app/components/UI/AssetOverview/Balance/Balance.tsx index 02c890710519..75fe3d4efac1 100644 --- a/app/components/UI/AssetOverview/Balance/Balance.tsx +++ b/app/components/UI/AssetOverview/Balance/Balance.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { View } from 'react-native'; import { strings } from '../../../../../locales/i18n'; +import Title from '../../../Base/Title'; import { useStyles } from '../../../../component-library/hooks'; import styleSheet from './Balance.styles'; import AssetElement from '../../AssetElement'; @@ -25,9 +26,6 @@ import Text, { } from '../../../../component-library/components/Texts/Text'; import { TokenI } from '../../Tokens/types'; import { useNavigation } from '@react-navigation/native'; -import { isPooledStakingFeatureEnabled } from '../../Stake/constants'; -import StakingBalance from '../../Stake/components/StakingBalance/StakingBalance'; - interface BalanceProps { asset: TokenI; mainBalance: string; @@ -55,9 +53,9 @@ const Balance = ({ asset, mainBalance, secondaryBalance }: BalanceProps) => { return ( - + {strings('asset_overview.your_balance')} - </Text> + { {asset.name || asset.symbol} - {isPooledStakingFeatureEnabled() && asset?.isETH && } ); }; diff --git a/app/components/UI/AssetOverview/Balance/__snapshots__/index.test.tsx.snap b/app/components/UI/AssetOverview/Balance/__snapshots__/index.test.tsx.snap index d233e8e44fdf..af6fcda4d9e5 100644 --- a/app/components/UI/AssetOverview/Balance/__snapshots__/index.test.tsx.snap +++ b/app/components/UI/AssetOverview/Balance/__snapshots__/index.test.tsx.snap @@ -9,18 +9,60 @@ exports[`Balance should render correctly with a fiat balance 1`] = ` } > Your balance @@ -237,18 +279,60 @@ exports[`Balance should render correctly without a fiat balance 1`] = ` } > Your balance diff --git a/app/components/UI/AssetOverview/ChartNavigationButton/ChartNavigationButton.styles.tsx b/app/components/UI/AssetOverview/ChartNavigationButton/ChartNavigationButton.styles.tsx index ae8fdabdd064..d468e7e2502b 100644 --- a/app/components/UI/AssetOverview/ChartNavigationButton/ChartNavigationButton.styles.tsx +++ b/app/components/UI/AssetOverview/ChartNavigationButton/ChartNavigationButton.styles.tsx @@ -15,7 +15,7 @@ const styleSheet = (params: { return StyleSheet.create({ button: { backgroundColor: selected - ? colors.background.pressed + ? colors.primary.default : colors.background.default, borderRadius: 40, paddingVertical: 2, @@ -27,6 +27,7 @@ const styleSheet = (params: { }, label: { letterSpacing: 3, + color: selected ? colors.background.default : colors.primary.default, textAlign: 'center', } as TextStyle, }); diff --git a/app/components/UI/AssetOverview/ChartNavigationButton/ChartNavigationButton.tsx b/app/components/UI/AssetOverview/ChartNavigationButton/ChartNavigationButton.tsx index cc33cec08c89..7aae89096516 100644 --- a/app/components/UI/AssetOverview/ChartNavigationButton/ChartNavigationButton.tsx +++ b/app/components/UI/AssetOverview/ChartNavigationButton/ChartNavigationButton.tsx @@ -2,7 +2,6 @@ import React from 'react'; import { TouchableOpacity } from 'react-native'; import { useStyles } from '../../../../component-library/hooks'; import Text, { - TextColor, TextVariant, } from '../../../../component-library/components/Texts/Text'; import styleSheet from './ChartNavigationButton.styles'; @@ -21,11 +20,7 @@ const ChartNavigationButton = ({ const { styles } = useStyles(styleSheet, { selected }); return ( - + {label} diff --git a/app/components/UI/AssetOverview/Price/Price.styles.tsx b/app/components/UI/AssetOverview/Price/Price.styles.tsx index 5510e7fd7749..0330cf4e6d03 100644 --- a/app/components/UI/AssetOverview/Price/Price.styles.tsx +++ b/app/components/UI/AssetOverview/Price/Price.styles.tsx @@ -11,22 +11,33 @@ const styleSheet = (params: { theme, vars: { priceDiff }, } = params; - const { colors } = theme; + const { colors, typography } = theme; return StyleSheet.create({ wrapper: { paddingHorizontal: 16, }, + name: { + fontWeight: '500', + } as TextStyle, + price: { + ...typography.lHeadingLG, + } as TextStyle, priceDiff: { + ...typography.lBodyMDMedium, color: priceDiff > 0 ? colors.success.default : priceDiff < 0 ? colors.error.default : colors.text.alternative, + lineHeight: 22, } as TextStyle, priceDiffIcon: { marginTop: 10, }, + priceDiffDateText: { + ...typography.lBodyMDMedium, + } as TextStyle, loadingPrice: { paddingTop: 8, }, diff --git a/app/components/UI/AssetOverview/Price/Price.tsx b/app/components/UI/AssetOverview/Price/Price.tsx index f297a40115f9..694f2215b758 100644 --- a/app/components/UI/AssetOverview/Price/Price.tsx +++ b/app/components/UI/AssetOverview/Price/Price.tsx @@ -11,9 +11,9 @@ import { useStyles } from '../../../../component-library/hooks'; import { toDateFormat } from '../../../../util/date'; import { addCurrencySymbol } from '../../../../util/number'; import Text, { - TextColor, TextVariant, } from '../../../../component-library/components/Texts/Text'; +import Title from '../../../Base/Title'; import PriceChart from '../PriceChart/PriceChart'; import { distributeDataPoints } from '../PriceChart/utils'; import styleSheet from './Price.styles'; @@ -80,17 +80,14 @@ const Price = ({ <> {asset.name ? ( - + {asset.name} ({asset.symbol}) ) : ( - {asset.symbol} + {asset.symbol} )} {!isNaN(price) && ( - + {isLoading ? ( <View style={styles.loadingPrice}> <SkeletonPlaceholder> @@ -104,7 +101,7 @@ const Price = ({ ) : ( addCurrencySymbol(price, currentCurrency, true) )} - </Text> + )} {isLoading ? ( @@ -118,7 +115,7 @@ const Price = ({ ) : distributedPriceData.length > 0 ? ( - + { 0 ? '+' : ''} {diff === 0 ? '0' : ((diff / comparePrice) * 100).toFixed(2)} - %){' '} - - {date} - + %) {date} ) : null} diff --git a/app/components/UI/AssetOverview/PriceChart/PriceChart.tsx b/app/components/UI/AssetOverview/PriceChart/PriceChart.tsx index 2af05649ef6b..aeb34cc7a93e 100644 --- a/app/components/UI/AssetOverview/PriceChart/PriceChart.tsx +++ b/app/components/UI/AssetOverview/PriceChart/PriceChart.tsx @@ -69,9 +69,9 @@ const PriceChart = ({ const chartColor = priceDiff > 0 - ? theme.colors.primary.default + ? theme.colors.success.default : priceDiff < 0 - ? theme.colors.primary.default + ? theme.colors.error.default : theme.colors.text.alternative; const apx = (size = 0) => { diff --git a/app/components/UI/AssetOverview/StakingEarnings/StakingEarnings.styles.tsx b/app/components/UI/AssetOverview/StakingEarnings/StakingEarnings.styles.tsx index e5961497522c..b9fc494e5ca9 100644 --- a/app/components/UI/AssetOverview/StakingEarnings/StakingEarnings.styles.tsx +++ b/app/components/UI/AssetOverview/StakingEarnings/StakingEarnings.styles.tsx @@ -3,13 +3,14 @@ import { StyleSheet, TextStyle } from 'react-native'; const styleSheet = (params: { theme: Theme }) => { const { theme } = params; - const { colors } = theme; + const { colors, typography } = theme; return StyleSheet.create({ stakingEarningsContainer: { paddingTop: 16, }, title: { + ...typography.sHeadingSM, paddingBottom: 8, } as TextStyle, keyValueRow: { diff --git a/app/components/UI/AssetOverview/StakingEarnings/__snapshots__/StakingEarnings.test.tsx.snap b/app/components/UI/AssetOverview/StakingEarnings/__snapshots__/StakingEarnings.test.tsx.snap index 3f9bd60d6774..766fc24aac4e 100644 --- a/app/components/UI/AssetOverview/StakingEarnings/__snapshots__/StakingEarnings.test.tsx.snap +++ b/app/components/UI/AssetOverview/StakingEarnings/__snapshots__/StakingEarnings.test.tsx.snap @@ -9,17 +9,58 @@ exports[`Staking Earnings should render correctly 1`] = ` } > Your earnings diff --git a/app/components/UI/AssetOverview/StakingEarnings/index.tsx b/app/components/UI/AssetOverview/StakingEarnings/index.tsx index d9538aaa50a8..99bb62812ab8 100644 --- a/app/components/UI/AssetOverview/StakingEarnings/index.tsx +++ b/app/components/UI/AssetOverview/StakingEarnings/index.tsx @@ -16,6 +16,7 @@ import ButtonIcon, { import useTooltipModal from '../../../../components/hooks/useTooltipModal'; import { strings } from '../../../../../locales/i18n'; import { isPooledStakingFeatureEnabled } from '../../Stake/constants'; +import Title from '../../../Base/Title'; // TODO: Remove mock data when connecting component to backend. const MOCK_DATA = { @@ -49,9 +50,7 @@ const StakingEarnings = () => { return ( - - {strings('stake.your_earnings')} - + {strings('stake.your_earnings')} {/* Annual Rate */} diff --git a/app/components/UI/AssetOverview/TokenDetails/MarketDetailsList/MarketDetailsList.tsx b/app/components/UI/AssetOverview/TokenDetails/MarketDetailsList/MarketDetailsList.tsx index 6edd8fd5ca28..ffd3713470e3 100644 --- a/app/components/UI/AssetOverview/TokenDetails/MarketDetailsList/MarketDetailsList.tsx +++ b/app/components/UI/AssetOverview/TokenDetails/MarketDetailsList/MarketDetailsList.tsx @@ -2,12 +2,10 @@ import React from 'react'; import { View } from 'react-native'; import { strings } from '../../../../../../locales/i18n'; import { useStyles } from '../../../../../component-library/hooks'; +import Title from '../../../../Base/Title'; import styleSheet from '../TokenDetails.styles'; import { MarketDetails } from '../TokenDetails'; import TokenDetailsListItem from '../TokenDetailsListItem'; -import Text, { - TextVariant, -} from '../../../../../component-library/components/Texts/Text'; interface MarketDetailsListProps { marketDetails: MarketDetails; @@ -20,9 +18,7 @@ const MarketDetailsList: React.FC = ({ return ( - - {strings('token.market_details')} - + {strings('token.market_details')} {marketDetails.marketCap && ( Market details diff --git a/app/components/UI/AssetOverview/TokenDetails/TokenDetails.styles.tsx b/app/components/UI/AssetOverview/TokenDetails/TokenDetails.styles.tsx index 2d4b7023f4e2..7a087b99206f 100644 --- a/app/components/UI/AssetOverview/TokenDetails/TokenDetails.styles.tsx +++ b/app/components/UI/AssetOverview/TokenDetails/TokenDetails.styles.tsx @@ -3,7 +3,7 @@ import { StyleSheet, TextStyle } from 'react-native'; const styleSheet = (params: { theme: Theme }) => { const { theme } = params; - const { colors } = theme; + const { typography, colors } = theme; return StyleSheet.create({ tokenDetailsContainer: { marginTop: 24, @@ -13,6 +13,8 @@ const styleSheet = (params: { theme: Theme }) => { paddingVertical: 4, }, title: { + ...typography.sHeadingSM, + marginVertical: 0, paddingVertical: 8, } as TextStyle, icon: { marginLeft: 4 }, diff --git a/app/components/UI/AssetOverview/TokenDetails/TokenDetailsList/TokenDetailsList.tsx b/app/components/UI/AssetOverview/TokenDetails/TokenDetailsList/TokenDetailsList.tsx index b218361c5ff9..17622c974ce5 100644 --- a/app/components/UI/AssetOverview/TokenDetails/TokenDetailsList/TokenDetailsList.tsx +++ b/app/components/UI/AssetOverview/TokenDetails/TokenDetailsList/TokenDetailsList.tsx @@ -8,6 +8,7 @@ import Text, { TextColor, TextVariant, } from '../../../../../component-library/components/Texts/Text'; +import Title from '../../../../Base/Title'; import styleSheet from '../TokenDetails.styles'; import Icon, { IconColor, @@ -48,9 +49,7 @@ const TokenDetailsList: React.FC = ({ return ( - - {strings('token.token_details')} - + {strings('token.token_details')} {tokenDetails.contractAddress && ( Token details diff --git a/app/components/UI/AssetOverview/TokenDetails/__snapshots__/TokenDetails.test.tsx.snap b/app/components/UI/AssetOverview/TokenDetails/__snapshots__/TokenDetails.test.tsx.snap index 1fc8c179d6ce..677b5a82eddb 100644 --- a/app/components/UI/AssetOverview/TokenDetails/__snapshots__/TokenDetails.test.tsx.snap +++ b/app/components/UI/AssetOverview/TokenDetails/__snapshots__/TokenDetails.test.tsx.snap @@ -11,17 +11,59 @@ exports[`TokenDetails should render correctly 1`] = ` > Token details @@ -195,17 +237,59 @@ exports[`TokenDetails should render correctly 1`] = ` Market details diff --git a/app/components/UI/AssetOverview/__snapshots__/AssetOverview.test.tsx.snap b/app/components/UI/AssetOverview/__snapshots__/AssetOverview.test.tsx.snap index 5ec60e73b6f4..28af7970a2c4 100644 --- a/app/components/UI/AssetOverview/__snapshots__/AssetOverview.test.tsx.snap +++ b/app/components/UI/AssetOverview/__snapshots__/AssetOverview.test.tsx.snap @@ -21,12 +21,12 @@ exports[`AssetOverview should render correctly 1`] = ` accessibilityRole="text" style={ { - "color": "#6a737d", + "color": "#141618", "fontFamily": "EuclidCircularB-Medium", - "fontSize": 14, + "fontSize": 18, "fontWeight": "500", "letterSpacing": 0, - "lineHeight": 22, + "lineHeight": 24, } } > @@ -36,16 +36,57 @@ exports[`AssetOverview should render correctly 1`] = ` ) @@ -188,7 +229,7 @@ exports[`AssetOverview should render correctly 1`] = ` style={ { "alignItems": "center", - "backgroundColor": "#00000014", + "backgroundColor": "#0376c9", "borderRadius": 40, "justifyContent": "center", "paddingHorizontal": 8, @@ -201,7 +242,7 @@ exports[`AssetOverview should render correctly 1`] = ` accessibilityRole="text" style={ { - "color": "#141618", + "color": "#ffffff", "fontFamily": "EuclidCircularB-Regular", "fontSize": 12, "fontWeight": "400", @@ -232,7 +273,7 @@ exports[`AssetOverview should render correctly 1`] = ` accessibilityRole="text" style={ { - "color": "#6a737d", + "color": "#0376c9", "fontFamily": "EuclidCircularB-Regular", "fontSize": 12, "fontWeight": "400", @@ -263,7 +304,7 @@ exports[`AssetOverview should render correctly 1`] = ` accessibilityRole="text" style={ { - "color": "#6a737d", + "color": "#0376c9", "fontFamily": "EuclidCircularB-Regular", "fontSize": 12, "fontWeight": "400", @@ -294,7 +335,7 @@ exports[`AssetOverview should render correctly 1`] = ` accessibilityRole="text" style={ { - "color": "#6a737d", + "color": "#0376c9", "fontFamily": "EuclidCircularB-Regular", "fontSize": 12, "fontWeight": "400", @@ -325,7 +366,7 @@ exports[`AssetOverview should render correctly 1`] = ` accessibilityRole="text" style={ { - "color": "#6a737d", + "color": "#0376c9", "fontFamily": "EuclidCircularB-Regular", "fontSize": 12, "fontWeight": "400", @@ -356,7 +397,7 @@ exports[`AssetOverview should render correctly 1`] = ` accessibilityRole="text" style={ { - "color": "#6a737d", + "color": "#0376c9", "fontFamily": "EuclidCircularB-Regular", "fontSize": 12, "fontWeight": "400", @@ -864,18 +905,60 @@ exports[`AssetOverview should render correctly 1`] = ` } > Your balance diff --git a/app/components/UI/AssetSearch/index.tsx b/app/components/UI/AssetSearch/index.tsx index b1cfd4be105f..dfc06c6462d0 100644 --- a/app/components/UI/AssetSearch/index.tsx +++ b/app/components/UI/AssetSearch/index.tsx @@ -3,6 +3,7 @@ import { TextInput, View, StyleSheet, + Platform, TextStyle, DimensionValue, } from 'react-native'; @@ -13,7 +14,8 @@ import { toLowerCaseEquals } from '../../../util/general'; import { useSelector } from 'react-redux'; import { TokenListToken } from '@metamask/assets-controllers'; import { useTheme } from '../../../util/theme'; -import { ImportTokenViewSelectorsIDs } from '../../../../e2e/selectors/wallet/ImportTokenView.selectors'; +import generateTestId from '../../../../wdio/utils/generateTestId'; +import { TOKEN_INPUT_BOX_ID } from '../../../../wdio/screen-objects/testIDs/Screens/AssetSearch.testIds'; import { TokenViewSelectors } from '../../../../e2e/selectors/AddTokenView.selectors'; import { selectTokenListArray } from '../../../selectors/tokenListController'; import Icon, { @@ -164,7 +166,7 @@ const AssetSearch = memo(({ onSearch, onFocus, onBlur }: Props) => { placeholder={strings('token.search_tokens_placeholder')} placeholderTextColor={colors.text.muted} onChangeText={handleSearch} - testID={ImportTokenViewSelectorsIDs.SEARCH_BAR} + {...generateTestId(Platform, TOKEN_INPUT_BOX_ID)} keyboardAppearance={themeAppearance} /> diff --git a/app/components/UI/BasicFunctionality/BasicFunctionalityModal/BasicFunctionalityModal.tsx b/app/components/UI/BasicFunctionality/BasicFunctionalityModal/BasicFunctionalityModal.tsx index e01d3afdccb1..b2d26f688389 100644 --- a/app/components/UI/BasicFunctionality/BasicFunctionalityModal/BasicFunctionalityModal.tsx +++ b/app/components/UI/BasicFunctionality/BasicFunctionalityModal/BasicFunctionalityModal.tsx @@ -26,7 +26,10 @@ import Icon, { IconSize, } from '../../../../component-library/components/Icons/Icon'; import Routes from '../../../../constants/navigation/Routes'; -import NotificationsService from '../../../../util/notifications/services/NotificationService'; +import { + asyncAlert, + requestPushNotificationsPermission, +} from '../../../../util/notifications'; import { MetaMetricsEvents } from '../../../../core/Analytics'; import { useEnableNotifications } from '../../../../util/notifications/hooks/useNotifications'; import { useMetrics } from '../../../hooks/useMetrics'; @@ -34,6 +37,7 @@ import { selectIsProfileSyncingEnabled, selectIsMetamaskNotificationsEnabled, } from '../../../../selectors/notifications'; +import { AuthorizationStatus } from '@notifee/react-native'; interface Props { route: { @@ -61,11 +65,18 @@ const BasicFunctionalityModal = ({ route }: Props) => { const { enableNotifications } = useEnableNotifications(); const enableNotificationsFromModal = useCallback(async () => { - const { permission } = await NotificationsService.getAllPermissions(false); - if (permission !== 'authorized') { - return; - } + const nativeNotificationStatus = await requestPushNotificationsPermission( + asyncAlert, + ); + + if (nativeNotificationStatus?.authorizationStatus === AuthorizationStatus.AUTHORIZED) { + /** + * Although this is an async function, we are dispatching an action (firing & forget) + * to emulate optimistic UI. + * + */ enableNotifications(); + } }, [enableNotifications]); const closeBottomSheet = async () => { diff --git a/app/components/UI/BlockingActionModal/index.tsx b/app/components/UI/BlockingActionModal/index.js similarity index 80% rename from app/components/UI/BlockingActionModal/index.tsx rename to app/components/UI/BlockingActionModal/index.js index c29a8f34e29e..b126438edf0c 100644 --- a/app/components/UI/BlockingActionModal/index.tsx +++ b/app/components/UI/BlockingActionModal/index.js @@ -1,11 +1,11 @@ import React from 'react'; +import PropTypes from 'prop-types'; import { ActivityIndicator, StyleSheet, View } from 'react-native'; import Modal from 'react-native-modal'; import { baseStyles } from '../../../styles/common'; import { useTheme } from '../../../util/theme'; -import { Theme } from '@metamask/design-tokens'; -const createStyles = (colors: Theme['colors']) => +const createStyles = (colors) => StyleSheet.create({ modal: { margin: 0, @@ -26,25 +26,6 @@ const createStyles = (colors: Theme['colors']) => }, }); -interface BlockingActionModalProps { - /** - * Whether modal is shown - */ - modalVisible: boolean; - /** - * Whether a spinner is shown - */ - isLoadingAction: boolean; - /** - * Content to display above the action buttons - */ - children: React.ReactNode; - /** - * Callback function when modal animation is completed - */ - onAnimationCompleted?: () => void; -} - /** * View that renders an action modal */ @@ -53,7 +34,7 @@ export default function BlockingActionModal({ modalVisible, isLoadingAction, onAnimationCompleted, -}: BlockingActionModalProps) { +}) { const { colors } = useTheme(); const styles = createStyles(colors); @@ -77,3 +58,20 @@ export default function BlockingActionModal({ ); } + +BlockingActionModal.propTypes = { + /** + * Whether modal is shown + */ + modalVisible: PropTypes.bool, + /** + * Whether a spinner is shown + */ + isLoadingAction: PropTypes.bool, + /** + * Content to display above the action buttons + */ + children: PropTypes.node, + + onAnimationCompleted: PropTypes.func, +}; diff --git a/app/components/UI/BottomModal/BottomModal.test.tsx b/app/components/UI/BottomModal/BottomModal.test.tsx deleted file mode 100644 index e5204501b339..000000000000 --- a/app/components/UI/BottomModal/BottomModal.test.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { Text, View } from 'react-native'; - -import renderWithProvider from '../../../util/test/renderWithProvider'; -import BottomModal from '.'; - -describe('BottomModal', () => { - it('should match snapshot', async () => { - const container = renderWithProvider( - - - DUMMY - - , - { state: {} }, - ); - expect(container).toMatchSnapshot(); - }); -}); diff --git a/app/components/UI/BottomModal/BottomModal.tsx b/app/components/UI/BottomModal/BottomModal.tsx deleted file mode 100644 index 7dbeb15ede47..000000000000 --- a/app/components/UI/BottomModal/BottomModal.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React, { ReactChild } from 'react'; -import Modal from 'react-native-modal'; -import { StyleSheet } from 'react-native'; - -import { useTheme } from '../../../util/theme'; - -interface BottomModalProps { - children: ReactChild; - onClose?: () => void; -} - -const styles = StyleSheet.create({ - bottomModal: { - justifyContent: 'flex-end', - margin: 0, - }, -}); - -const BottomModal = ({ children, onClose }: BottomModalProps) => { - const { colors } = useTheme(); - - return ( - - {children} - - ); -}; - -export default BottomModal; diff --git a/app/components/UI/BottomModal/__snapshots__/BottomModal.test.tsx.snap b/app/components/UI/BottomModal/__snapshots__/BottomModal.test.tsx.snap deleted file mode 100644 index 6325a7578358..000000000000 --- a/app/components/UI/BottomModal/__snapshots__/BottomModal.test.tsx.snap +++ /dev/null @@ -1,124 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`BottomModal should match snapshot 1`] = ` - - - - - - DUMMY - - - - -`; diff --git a/app/components/UI/BottomModal/index.tsx b/app/components/UI/BottomModal/index.tsx deleted file mode 100644 index 3e78bd6309c1..000000000000 --- a/app/components/UI/BottomModal/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from './BottomModal'; diff --git a/app/components/UI/ComponentErrorBoundary/index.js b/app/components/UI/ComponentErrorBoundary/index.js new file mode 100644 index 000000000000..d532728cdc3a --- /dev/null +++ b/app/components/UI/ComponentErrorBoundary/index.js @@ -0,0 +1,58 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Logger from '../../../util/Logger'; +import trackErrorAsAnalytics from '../../../util/metrics/TrackError/trackErrorAsAnalytics'; + +class ComponentErrorBoundary extends React.Component { + state = { error: null }; + + static propTypes = { + /** + * Component to be used when there is no error + */ + children: PropTypes.oneOfType([ + PropTypes.arrayOf(PropTypes.node), + PropTypes.node, + ]), + /** + * Component label for logging + */ + componentLabel: PropTypes.string.isRequired, + /** + * Function to be called when there is an error + */ + onError: PropTypes.func, + /** + * Will not track as an error, but still log to analytics + */ + dontTrackAsError: PropTypes.bool, + }; + + static getDerivedStateFromError(error) { + return { error }; + } + + componentDidCatch(error, errorInfo) { + // eslint-disable-next-line no-unused-expressions + this.props.onError?.(); + + const { componentLabel, dontTrackAsError } = this.props; + + if (dontTrackAsError) { + return trackErrorAsAnalytics( + `Component Error Boundary: ${componentLabel}`, + error?.message, + ); + } + Logger.error(error, { View: this.props.componentLabel, ...errorInfo }); + } + + getErrorMessage = () => + `Component: ${this.props.componentLabel}\n${this.state.error.toString()}`; + + render() { + return this.state.error ? null : this.props.children; + } +} + +export default ComponentErrorBoundary; diff --git a/app/components/UI/ComponentErrorBoundary/index.tsx b/app/components/UI/ComponentErrorBoundary/index.tsx deleted file mode 100644 index 788c502297cf..000000000000 --- a/app/components/UI/ComponentErrorBoundary/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from 'react'; -import Logger from '../../../util/Logger'; -import trackErrorAsAnalytics from '../../../util/metrics/TrackError/trackErrorAsAnalytics'; - -interface ComponentErrorBoundaryProps { - /** - * Component to be used when there is no error - */ - children: React.ReactNode; - /** - * Component label for logging - */ - componentLabel: string; - /** - * Function to be called when there is an error - */ - onError?: () => void; - /** - * Will not track as an error, but still log to analytics - */ - dontTrackAsError?: boolean; -} - -interface ComponentErrorBoundaryState { - error: Error | null; -} - -class ComponentErrorBoundary extends React.Component { - state: ComponentErrorBoundaryState = { error: null }; - - static getDerivedStateFromError(error: Error): ComponentErrorBoundaryState { - return { error }; - } - - componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void { - this.props.onError?.(); - - const { componentLabel, dontTrackAsError } = this.props; - - if (dontTrackAsError) { - return trackErrorAsAnalytics( - `Component Error Boundary: ${componentLabel}`, - error?.message, - ); - } - Logger.error(error, { View: this.props.componentLabel, ...errorInfo }); - } - - getErrorMessage = (): string => - `Component: ${this.props.componentLabel}\n${this.state.error?.toString()}`; - - render(): React.ReactNode { - return this.state.error ? null : this.props.children; - } -} - -export default ComponentErrorBoundary; diff --git a/app/components/UI/ConfirmAddAsset/ConfirmAddAsset.tsx b/app/components/UI/ConfirmAddAsset/ConfirmAddAsset.tsx index 097b76baf443..e6701455b550 100644 --- a/app/components/UI/ConfirmAddAsset/ConfirmAddAsset.tsx +++ b/app/components/UI/ConfirmAddAsset/ConfirmAddAsset.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect } from 'react'; -import { View } from 'react-native'; +import { View, Platform } from 'react-native'; import Text, { TextVariant, } from '../../../component-library/components/Texts/Text'; @@ -36,7 +36,11 @@ import Modal from 'react-native-modal'; import Box from '../Ramp/components/Box'; import SheetHeader from '../../../component-library/components/Sheet/SheetHeader'; import Routes from '../../../constants/navigation/Routes'; -import { ImportTokenViewSelectorsIDs } from '../../../../e2e/selectors/wallet/ImportTokenView.selectors'; +import generateTestId from '../../../../wdio/utils/generateTestId'; +import { + ADD_CANCEL_ADD_CUSTOM_ASSET_MODAL, + ADD_CONFIRM_CUSTOM_ASSET, +} from '../../../../wdio/screen-objects/testIDs/Screens/AddCustomToken.testIds'; import { TOKEN_TITLE } from '../../../components/Views/AddAsset/AddAsset.constants'; const RenderBalance = (asset: { @@ -125,7 +129,7 @@ const ConfirmAddAsset = () => { > @@ -171,7 +175,7 @@ const ConfirmAddAsset = () => { return ( {strings('wallet.import_token')} diff --git a/app/components/UI/ConnectHeader/index.js b/app/components/UI/ConnectHeader/index.js new file mode 100644 index 000000000000..acd3af74261d --- /dev/null +++ b/app/components/UI/ConnectHeader/index.js @@ -0,0 +1,61 @@ +import React, { Component } from 'react'; +import { View, StyleSheet, TouchableOpacity } from 'react-native'; +import PropTypes from 'prop-types'; +import IonicIcon from 'react-native-vector-icons/Ionicons'; +import Text, { + TextVariant, +} from '../../../component-library/components/Texts/Text'; +import { ThemeContext, mockTheme } from '../../../util/theme'; + +const createStyles = (colors) => + StyleSheet.create({ + header: { + width: '100%', + position: 'relative', + paddingBottom: 20, + }, + title: { + color: colors.text.default, + fontSize: 16, + textAlign: 'center', + paddingVertical: 12, + }, + back: { + position: 'absolute', + zIndex: 1, + paddingVertical: 10, + paddingRight: 10, + }, + }); + +class ConnectHeader extends Component { + static propTypes = { + action: PropTypes.func.isRequired, + title: PropTypes.string.isRequired, + }; + + render() { + const { title, action } = this.props; + const colors = this.context.colors || mockTheme.colors; + const styles = createStyles(colors); + + return ( + + + + + + {title} + + + ); + } +} + +ConnectHeader.contextType = ThemeContext; + +export default ConnectHeader; diff --git a/app/components/UI/ConnectHeader/index.tsx b/app/components/UI/ConnectHeader/index.tsx deleted file mode 100644 index ec7042ccc3da..000000000000 --- a/app/components/UI/ConnectHeader/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from 'react'; -import { View, StyleSheet, TouchableOpacity } from 'react-native'; -import IonicIcon from 'react-native-vector-icons/Ionicons'; -import Text, { - TextVariant, -} from '../../../component-library/components/Texts/Text'; -import { ThemeContext, mockTheme } from '../../../util/theme'; -import { Theme } from '@metamask/design-tokens'; - -interface ConnectHeaderProps { - action: () => void; - title: string; -} - -const createStyles = (colors: Theme['colors']) => - StyleSheet.create({ - header: { - width: '100%', - position: 'relative', - paddingBottom: 20, - }, - title: { - color: colors.text.default, - fontSize: 16, - textAlign: 'center', - paddingVertical: 12, - }, - back: { - position: 'absolute', - zIndex: 1, - paddingVertical: 10, - paddingRight: 10, - }, - }); - -const ConnectHeader: React.FC = ({ title, action }) => { - const context = React.useContext(ThemeContext); - const colors = context?.colors || mockTheme.colors; - const styles = createStyles(colors); - - return ( - - - - - - {title} - - - ); -}; - -export default ConnectHeader; diff --git a/app/components/UI/FadeView/index.tsx b/app/components/UI/FadeView/index.js similarity index 62% rename from app/components/UI/FadeView/index.tsx rename to app/components/UI/FadeView/index.js index 8fe7b4196216..592d5ee25490 100644 --- a/app/components/UI/FadeView/index.tsx +++ b/app/components/UI/FadeView/index.js @@ -1,39 +1,30 @@ -import React, { PureComponent, ReactNode } from 'react'; -import { Animated, StyleProp, ViewStyle } from 'react-native'; - -interface FadeViewPropTypes { - /** - * Determines to show / hide the children components - */ - visible: boolean; - /** - * Children components of the FadeView - * it can be a text node, an image, or an icon - * or an Array with a combination of them - */ - children?: ReactNode; - /** - * Styles to be applied to the FadeView - */ - style?: StyleProp; -} - -interface FadeViewState { - visible: boolean; -} +import React, { PureComponent } from 'react'; +import PropTypes from 'prop-types'; +import { Animated, ViewPropTypes } from 'react-native'; /** * View that has the ability to fade in / out * his children by using the visible prop */ -export default class FadeView extends PureComponent< - FadeViewPropTypes, - FadeViewState -> { - visibility: Animated.Value; - mounted: boolean = false; +export default class FadeView extends PureComponent { + static propTypes = { + /** + * Determines to show / hide the children components + */ + visible: PropTypes.bool, + /** + * Children components of the FadeView + * it can be a text node, an image, or an icon + * or an Array with a combination of them + */ + children: PropTypes.any, + /** + * Styles to be applied to the FadeView + */ + style: ViewPropTypes.style, + }; - constructor(props: FadeViewPropTypes) { + constructor(props) { super(props); this.state = { visible: props.visible, diff --git a/app/components/UI/GenericButton/index.android.tsx b/app/components/UI/GenericButton/index.android.js similarity index 74% rename from app/components/UI/GenericButton/index.android.tsx rename to app/components/UI/GenericButton/index.android.js index 31c0f904e481..d715f3567a72 100644 --- a/app/components/UI/GenericButton/index.android.tsx +++ b/app/components/UI/GenericButton/index.android.js @@ -1,5 +1,6 @@ import React from 'react'; -import { View, TouchableNativeFeedback, StyleProp, ViewStyle, GestureResponderEvent } from 'react-native'; +import PropTypes from 'prop-types'; +import { View, ViewPropTypes, TouchableNativeFeedback } from 'react-native'; /** * @deprecated The `` component has been deprecated in favor of the new `