diff --git a/.depcheckrc.yml b/.depcheckrc.yml index e8fe7a446ec..a4ecdfda65c 100644 --- a/.depcheckrc.yml +++ b/.depcheckrc.yml @@ -2,7 +2,6 @@ ignores: - '@metamask/oss-attribution-generator' - 'webpack-cli' - - '@react-native-community/datetimepicker' - '@react-native-community/slider' - 'patch-package' - '@lavamoat/allow-scripts' diff --git a/.detoxrc.js b/.detoxrc.js index d637d3c937c..ad953511261 100644 --- a/.detoxrc.js +++ b/.detoxrc.js @@ -26,7 +26,7 @@ module.exports = { configurations: { 'ios.sim.apiSpecs': { device: 'ios.simulator', - app: 'ios.debug', + app: 'ios.qa', testRunner: { args: { "$0": "node e2e/api-specs/run-api-spec-tests.js", @@ -41,10 +41,9 @@ module.exports = { device: 'ios.simulator', app: 'ios.release', }, - // because e2e run on debug mode in bitrise - 'android.emu.bitrise.debug': { - device: 'android.bitrise.emulator', - app: 'android.bitrise.debug', + 'ios.sim.qa': { + device: 'ios.simulator', + app: 'ios.qa', }, 'android.emu.debug': { @@ -86,32 +85,21 @@ module.exports = { binaryPath: 'ios/build/Build/Products/Debug-iphonesimulator/MetaMask.app', build: 'yarn start:ios:e2e', }, - 'ios.release': { + 'ios.qa': { type: 'ios.app', binaryPath: - 'ios/build/Build/Products/Release-iphonesimulator/MetaMask.app', - build: "METAMASK_BUILD_TYPE='main' METAMASK_ENVIRONMENT='production' yarn build:ios:release:e2e", - }, - 'android.bitrise.debug': { - type: 'android.apk', - binaryPath: 'android/app/build/outputs/apk/prod/debug/app-prod-debug.apk', - build: 'yarn start:android:e2e', + 'ios/build/Build/Products/Release-iphonesimulator/MetaMask-QA.app', + build: "METAMASK_BUILD_TYPE='main' METAMASK_ENVIRONMENT='qa' yarn build:ios:qa", }, 'android.debug': { type: 'android.apk', binaryPath: 'android/app/build/outputs/apk/prod/debug/app-prod-debug.apk', build: 'yarn start:android:e2e', }, - 'android.release': { - type: 'android.apk', - binaryPath: - 'android/app/build/outputs/apk/prod/release/app-prod-release.apk', - build: "METAMASK_BUILD_TYPE='main' METAMASK_ENVIRONMENT='production' yarn build:android:release:e2e", - }, 'android.qa': { type: 'android.apk', binaryPath: 'android/app/build/outputs/apk/qa/release/app-qa-release.apk', - build: "METAMASK_BUILD_TYPE='main' METAMASK_ENVIRONMENT='qa' yarn build:android:qa:e2e", + build: "METAMASK_BUILD_TYPE='main' METAMASK_ENVIRONMENT='qa' yarn build:android:qa", }, }, }; diff --git a/android/app/build.gradle b/android/app/build.gradle index 7978222f4a7..80ffad8fa28 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -229,7 +229,7 @@ android { release { manifestPlaceholders.isDebug = false minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro", "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro", "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules.pro" } } diff --git a/bitrise.yml b/bitrise.yml index 4df0c76e2c4..40c4e621f3b 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -135,7 +135,7 @@ stages: - run_ios_api_specs: {} - run_tag_smoke_accounts_ios: {} - run_tag_smoke_accounts_android: {} - - run_tag_smoke_assets_ios: {} + # - run_tag_smoke_assets_ios: {} - run_tag_smoke_assets_android: {} - run_tag_smoke_confirmations_ios: {} - run_tag_smoke_confirmations_android: {} @@ -145,8 +145,8 @@ stages: - run_tag_smoke_core_android: {} build_regression_e2e_ios_android_stage: workflows: - - ios_build_regression_tests: {} - - android_build_regression_tests: {} + - ios_e2e_build: {} + - android_e2e_build: {} run_regression_e2e_ios_android_stage: workflows: - ios_run_regression_tests: {} @@ -267,8 +267,29 @@ workflows: source "${HOME}/.nvm/nvm.sh" echo 'source "${HOME}/.nvm/nvm.sh"' | tee -a ${HOME}/.{bashrc,profile} - nvm install ${NODE_VERSION} + # Retry logic for Node installation + MAX_ATTEMPTS=3 + ATTEMPT=1 + until [ $ATTEMPT -gt $MAX_ATTEMPTS ] + do + echo "Attempt $ATTEMPT to install Node.js" + nvm install ${NODE_VERSION} + INSTALL_STATUS=$? # Capture the exit status of the nvm install command + if [ $INSTALL_STATUS -eq 0 ]; then + echo "Node.js installation successful!" + break + else + echo "Node.js installation failed with exit code $INSTALL_STATUS" + ATTEMPT=$((ATTEMPT+1)) + echo "Node.js installation failed, retrying in 5 seconds..." + sleep 5 + fi + done + if [ $ATTEMPT -gt $MAX_ATTEMPTS ]; then + echo "Node.js installation failed after $MAX_ATTEMPTS attempts." + exit 1 + fi envman add --key PATH --value $PATH node --version @@ -586,6 +607,10 @@ workflows: inputs: - ndk_version: $NDK_VERSION - gradlew_path: $PROJECT_LOCATION/gradlew + - file-downloader@1: + inputs: + - source: $BITRISEIO_ANDROID_QA_KEYSTORE_URL + - destination: android/keystores/internalRelease.keystore - script@1: title: Install CCache & symlink inputs: @@ -620,7 +645,7 @@ workflows: node -v export METAMASK_ENVIRONMENT='local' export METAMASK_BUILD_TYPE='main' - IGNORE_BOXLOGS_DEVELOPMENT="true" FORCE_BUNDLING=true yarn test:e2e:android:bitrise:build + IGNORE_BOXLOGS_DEVELOPMENT="true" yarn test:e2e:android:build:qa-release - save-gradle-cache@1: {} - save-cache@1: title: Save CCache @@ -700,7 +725,7 @@ workflows: fi export METAMASK_ENVIRONMENT='local' export METAMASK_BUILD_TYPE='main' - IGNORE_BOXLOGS_DEVELOPMENT="true" FORCE_BUNDLING=true yarn test:e2e:android:bitrise:run "$TEST_SUITE_FOLDER" --testNamePattern="$TEST_SUITE" + IGNORE_BOXLOGS_DEVELOPMENT="true" yarn test:e2e:android:run:qa-release "$TEST_SUITE_FOLDER" --testNamePattern="$TEST_SUITE" - custom-test-results-export@1: title: Export test results is_always_run: true @@ -802,6 +827,8 @@ workflows: - deploy_path: $BITRISE_HTML_REPORT_DIR title: Deploy test report files ios_e2e_build: + envs: + - NO_FLIPPER: '1' before_run: - install_applesimutils - code_setup @@ -833,7 +860,7 @@ workflows: inputs: - content: |- #!/usr/bin/env bash - HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 brew install ccache + brew install ccache with HOMEBREW_NO_DEPENDENTS_CHECK=1 ln -s $(which ccache) /usr/local/bin/gcc ln -s $(which ccache) /usr/local/bin/g++ ln -s $(which ccache) /usr/local/bin/cc @@ -867,7 +894,7 @@ workflows: node -v export METAMASK_ENVIRONMENT='local' export METAMASK_BUILD_TYPE='main' - IGNORE_BOXLOGS_DEVELOPMENT="true" FORCE_BUNDLING=true yarn test:e2e:ios:debug:build + IGNORE_BOXLOGS_DEVELOPMENT="true" yarn test:e2e:ios:build:qa-release - save-cocoapods-cache@1: {} - save-cache@1: title: Save CCache @@ -888,6 +915,8 @@ workflows: - key: node_modules-{{ .OS }}-{{ .Arch }}-{{ getenv "BRANCH_COMMIT_HASH" }} - paths: node_modules ios_e2e_test: + envs: + - NO_FLIPPER: '1' before_run: - setup - install_applesimutils @@ -923,7 +952,7 @@ workflows: - set-xcode-build-number@1: inputs: - build_short_version_string: $VERSION_NAME - - plist_path: $PROJECT_LOCATION_IOS/MetaMask/Info.plist + - plist_path: $PROJECT_LOCATION_IOS/MetaMask/MetaMask-QA-Info.plist - script: inputs: - content: |- @@ -954,7 +983,7 @@ workflows: node -v export METAMASK_ENVIRONMENT='local' export METAMASK_BUILD_TYPE='main' - IGNORE_BOXLOGS_DEVELOPMENT="true" FORCE_BUNDLING=true yarn test:e2e:ios:debug:run "$TEST_SUITE_FOLDER" --testNamePattern="$TEST_SUITE" + IGNORE_BOXLOGS_DEVELOPMENT="true" yarn test:e2e:ios:run:qa-release "$TEST_SUITE_FOLDER" --testNamePattern="$TEST_SUITE" - custom-test-results-export@1: is_always_run: true is_skippable: false @@ -1234,8 +1263,6 @@ workflows: inputs: - ipa_path: $BITRISE_APP_STORE_IPA_PATH build_ios_release: - envs: - - NO_FLIPPER: '1' before_run: - code_setup after_run: @@ -1275,8 +1302,6 @@ workflows: - deploy_path: sourcemaps/ios/index.js.map title: Deploy Source Map build_ios_qa: - envs: - - NO_FLIPPER: '1' before_run: - code_setup after_run: diff --git a/e2e/specs/assets/nft-detection-modal.spec.js b/e2e/specs/assets/nft-detection-modal.spec.js index b0b4b4e41ce..798b9267e3a 100644 --- a/e2e/specs/assets/nft-detection-modal.spec.js +++ b/e2e/specs/assets/nft-detection-modal.spec.js @@ -10,12 +10,10 @@ import TestHelpers from '../../helpers'; import Assertions from '../../utils/Assertions'; import NftDetectionModal from '../../pages/modals/NftDetectionModal'; import { SmokeAssets } from '../../tags'; -import NetworkListModal from '../../pages/modals/NetworkListModal'; -import NetworkEducationModal from '../../pages/modals/NetworkEducationModal'; + import { NftDetectionModalSelectorsText } from '../../selectors/Modals/NftDetectionModal.selectors'; describe(SmokeAssets('NFT Detection Modal'), () => { - const ETHEREUM = 'Ethereum Main Network'; beforeAll(async () => { jest.setTimeout(170000); await TestHelpers.reverseServerPort(); @@ -25,7 +23,6 @@ describe(SmokeAssets('NFT Detection Modal'), () => { await withFixtures( { fixture: new FixtureBuilder() - .withGanacheNetwork() .withPreferencesController({ useNftDetection: false, }) @@ -35,12 +32,6 @@ describe(SmokeAssets('NFT Detection Modal'), () => { }, async () => { await loginToApp(); - - // Switch to Mainnet - await WalletView.tapNetworksButtonOnNavBar(); - await NetworkListModal.changeNetworkTo(ETHEREUM); - await NetworkEducationModal.tapGotItButton(); - await Assertions.checkIfVisible(NftDetectionModal.container); // fix flaky test: toast should desapear to get access to cancel button @@ -65,7 +56,6 @@ describe(SmokeAssets('NFT Detection Modal'), () => { await withFixtures( { fixture: new FixtureBuilder() - .withGanacheNetwork() .withPreferencesController({ useNftDetection: false, }) @@ -76,11 +66,6 @@ describe(SmokeAssets('NFT Detection Modal'), () => { async () => { await loginToApp(); - // Switch to Mainnet - await WalletView.tapNetworksButtonOnNavBar(); - await NetworkListModal.changeNetworkTo(ETHEREUM); - await NetworkEducationModal.tapGotItButton(); - await Assertions.checkIfVisible(NftDetectionModal.container); await NftDetectionModal.tapAllowButton(); // Check that we are on the wallet screen diff --git a/ios/Podfile b/ios/Podfile index 759ce5f2e02..56b8c3f9164 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -98,7 +98,7 @@ def common_target_logic pod 'GzipSwift' # Pod for fixing react-native-quick-crypto issue: https://github.com/margelo/react-native-quick-crypto/issues/244 - pod "OpenSSL-Universal", "= 1.1.1100" + pod 'OpenSSL-Universal', :modular_headers => true, :configurations => ['Release'] end target 'MetaMask' do diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b8151245f04..24d83fa9fef 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -702,8 +702,6 @@ PODS: - React-Core - RNCPicker (2.2.1): - React-Core - - RNDateTimePicker (7.7.0): - - React-Core - RNDefaultPreference (1.4.3): - React - RNDeviceInfo (9.0.2): @@ -825,6 +823,7 @@ DEPENDENCIES: - GzipSwift - lottie-ios (from `../node_modules/lottie-ios`) - lottie-react-native (from `../node_modules/lottie-react-native`) + - OpenSSL-Universal - OpenSSL-Universal (= 1.1.1100) - Permission-BluetoothPeripheral (from `../node_modules/react-native-permissions/ios/BluetoothPeripheral`) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) @@ -897,7 +896,6 @@ DEPENDENCIES: - "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)" - "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)" - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)" - RNDefaultPreference (from `../node_modules/react-native-default-preference`) - RNDeviceInfo (from `../node_modules/react-native-device-info`) - "RNFBApp (from `../node_modules/@react-native-firebase/app`)" @@ -1115,8 +1113,6 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-masked-view/masked-view" RNCPicker: :path: "../node_modules/@react-native-picker/picker" - RNDateTimePicker: - :path: "../node_modules/@react-native-community/datetimepicker" RNDefaultPreference: :path: "../node_modules/react-native-default-preference" RNDeviceInfo: @@ -1274,7 +1270,6 @@ SPEC CHECKSUMS: RNCClipboard: ddd4d291537f1667209c9c405aaa4307297e252e RNCMaskedView: 090213d32d8b3bb83a4dcb7d12c18f0152591906 RNCPicker: cb57c823d5ce8d2d0b5dfb45ad97b737260dc59e - RNDateTimePicker: 4f3c4dbd4f908be32ec8c93f086e8924bd4a2e07 RNDefaultPreference: 2f8d6d54230edbd78708ada8d63bb275e5a8415b RNDeviceInfo: 1e3f62b9ec32f7754fac60bd06b8f8a27124e7f0 RNFBApp: 5f87753a8d8b37d229adf85cd0ff37709ffdf008 @@ -1302,6 +1297,6 @@ SPEC CHECKSUMS: Yoga: 6f5ab94cd8b1ecd04b6e973d0bc583ede2a598cc YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: 876298d4a106643492005466f7a314cd08711f4d +PODFILE CHECKSUM: e0bcc4eb12d48746028cd4f4161a292fa9ddc627 COCOAPODS: 1.15.2 diff --git a/package.json b/package.json index dad216e5954..09389f360c6 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,6 @@ "start:android:flask": "export METAMASK_BUILD_TYPE='flask' && ./scripts/build.sh android flaskDebug", "build:announce": "node ./scripts/metamask-bot-build-announce-bitrise.js", "build:android:release": "./scripts/build.sh android release", - "build:android:release:e2e": "./scripts/build.sh android releaseE2E", - "build:android:qa:e2e": "./scripts/build.sh android QAE2E", "build:android:checksum": "./scripts/checksum.sh", "build:android:checksum:qa": "./scripts/checksum.sh QA", "build:android:checksum:flask": "export METAMASK_BUILD_TYPE='flask' && ./scripts/checksum.sh flask", @@ -44,28 +42,26 @@ "build:android:pre-release:bundle:flask": "export METAMASK_BUILD_TYPE='flask' && GENERATE_BUNDLE=true ./scripts/build.sh android flask --pre", "build:ios:release": "./scripts/build.sh ios release", "build:ios:pre-flask": "export METAMASK_BUILD_TYPE='flask' && ./scripts/build.sh ios flask --pre", - "build:ios:release:e2e": "./scripts/build.sh ios releaseE2E", "build:ios:pre-release": "./scripts/build.sh ios release --pre", - "build:ios:qa": "./scripts/build.sh ios QA", "build:ios:pre-qa": "./scripts/build.sh ios QA --pre", + "build:android:qa": "NO_FLIPPER='1' ./scripts/build.sh android QA", + "build:ios:qa": "NO_FLIPPER='1' ./scripts/build.sh ios QA", "build:attribution": "./scripts/generate-attributions.sh", "release:android": "./scripts/build.sh android release && open android/app/build/outputs/apk/release/", "release:ios": "./scripts/build.sh ios release", "release:android:qa": "./scripts/build.sh android QA && open android/app/build/outputs/apk/release/", - "test": "yarn test:unit && yarn test:e2e", + "test": "yarn test:unit", "test:unit": "jest ./app/ ./locales/", "test:unit:update": "time jest -u ./app/", "test:api-specs": "detox reset-lock-file && detox test -c ios.sim.apiSpecs", - "test:e2e": "yarn test:e2e:ios && yarn test:e2e:android", - "test:e2e:ios": "detox build -c ios.sim.release && detox test -c ios.sim.release", + "test:e2e:ios:build:qa-release": "IS_TEST='true' detox build -c ios.sim.qa", + "test:e2e:ios:run:qa-release": "IS_TEST='true' detox test -c ios.sim.qa", + "test:e2e:android:build:qa-release": "NO_FLIPPER='1' IS_TEST='true' detox build -c android.emu.release.qa", + "test:e2e:android:run:qa-release": "NO_FLIPPER='1' IS_TEST='true' detox test -c android.emu.release.qa --headless --record-logs all", "test:e2e:ios:debug:build": "IS_TEST='true' detox build -c ios.sim.debug", "test:e2e:ios:debug:run": "IS_TEST='true' detox reset-lock-file && detox test -c ios.sim.debug", "test:e2e:android:debug:build": "IS_TEST='true' detox build -c android.emu.debug", - "test:e2e:android:bitrise:build": "IS_TEST='true' detox build -c android.emu.bitrise.debug", "test:e2e:android:debug:run": "IS_TEST='true' detox test -c android.emu.debug", - "test:e2e:android:bitrise:run": "IS_TEST='true' detox reset-lock-file && detox test -c android.emu.bitrise.debug --headless", - "test:e2e:android": "detox build -c android.emu.release && detox test -c android.emu.release --record-videos failing", - "test:e2e:android:qa": "detox build -c android.emu.release.qa && detox test -c android.emu.release.qa --record-videos failing", "test:wdio:ios": "yarn wdio ./wdio/config/ios.config.debug.js", "test:wdio:ios:browserstack:local": "yarn wdio ./wdio/config/ios.config.browserstack.local.js", "test:wdio:android": "yarn wdio ./wdio/config/android.config.debug.js", @@ -197,7 +193,6 @@ "@react-native-clipboard/clipboard": "1.8.4", "@react-native-community/blur": "^4.4.0", "@react-native-community/checkbox": "^0.5.17", - "@react-native-community/datetimepicker": "^7.5.0", "@react-native-community/netinfo": "^9.5.0", "@react-native-community/slider": "^4.4.3", "@react-native-cookies/cookies": "^6.2.1", diff --git a/patches/@react-native-community+datetimepicker+7.7.0.patch b/patches/@react-native-community+datetimepicker+7.7.0.patch deleted file mode 100644 index 1ebdc150937..00000000000 --- a/patches/@react-native-community+datetimepicker+7.7.0.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m b/node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m -index 4ff3362..c139440 100644 ---- a/node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m -+++ b/node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m -@@ -41,7 +41,7 @@ - (void)setTimeZoneName:(NSString *)timeZoneName { - YGNodeMarkDirty(self.yogaNode); - } - --static YGSize RNDateTimePickerShadowViewMeasure(YGNodeConstRef node, float width, YGMeasureMode widthMode, float height, YGMeasureMode heightMode) -+static YGSize RNDateTimePickerShadowViewMeasure(YGNodeRef node, float width, YGMeasureMode widthMode, float height, YGMeasureMode heightMode) - { - RNDateTimePickerShadowView *shadowPickerView = (__bridge RNDateTimePickerShadowView *)YGNodeGetContext(node); - diff --git a/scripts/build.sh b/scripts/build.sh index f32e593e54e..1623dc30ca1 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -361,16 +361,16 @@ buildIosReleaseE2E(){ } buildIosQA(){ + echo "Start iOS QA build..." + remapEnvVariableQA prebuild_ios - echo "Start QA build..." - # Replace release.xcconfig with ENV vars if [ "$PRE_RELEASE" = true ] ; then echo "Setting up env vars..."; - echo "$IOS_ENV" + echo "$IOS_ENV" echo "$IOS_ENV" | tr "|" "\n" > $IOS_ENV_FILE echo "Build started..." brew install watchman @@ -380,22 +380,25 @@ buildIosQA(){ if [ ! -f "ios/release.xcconfig" ] ; then echo "$IOS_ENV" | tr "|" "\n" > ios/release.xcconfig fi - ./node_modules/.bin/react-native run-ios --scheme MetaMask-QA--configuration Release --simulator "iPhone 13 Pro" + cd ios && xcodebuild -workspace MetaMask.xcworkspace -scheme MetaMask-QA -configuration Release -sdk iphonesimulator -derivedDataPath build + # ./node_modules/.bin/react-native run-ios --scheme MetaMask-QA- -configuration Release --simulator "iPhone 13 Pro" fi } buildAndroidQA(){ + echo "Start Android QA build..." + remapEnvVariableQA - if [ "$PRE_RELEASE" = false ] ; then - adb uninstall io.metamask.qa - fi + # if [ "$PRE_RELEASE" = false ] ; then + # adb uninstall io.metamask.qa + # fi prebuild_android # Generate APK - cd android && ./gradlew assembleQaRelease --no-daemon --max-workers 2 + cd android && ./gradlew assembleQaRelease app:assembleQaReleaseAndroidTest -PminSdkVersion=26 -DtestBuildType=release # GENERATE BUNDLE if [ "$GENERATE_BUNDLE" = true ] ; then @@ -407,9 +410,9 @@ buildAndroidQA(){ yarn build:android:checksum:qa fi - if [ "$PRE_RELEASE" = false ] ; then - adb install app/build/outputs/apk/qa/release/app-qa-release.apk - fi + # if [ "$PRE_RELEASE" = false ] ; then + # adb install app/build/outputs/apk/qa/release/app-qa-release.apk + # fi } buildAndroidRelease(){ diff --git a/yarn.lock b/yarn.lock index eeb198f6585..eac0c47f976 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6779,13 +6779,6 @@ prompts "^2.4.0" semver "^7.5.2" -"@react-native-community/datetimepicker@^7.5.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@react-native-community/datetimepicker/-/datetimepicker-7.7.0.tgz#0d0162b0434c7b35883f8c5af846f35e23d045ec" - integrity sha512-nYzZy4DQLRFUzKJShWzRleCaebmCJfZ1lIcFmZgMXJoiVuGJNw3OIGHSWmHhPETh3OhP1RO3to882d7WmDIyrA== - dependencies: - invariant "^2.2.4" - "@react-native-community/netinfo@^9.5.0": version "9.5.0" resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-9.5.0.tgz#93663bbb105feb8f729b8f0271ee06ffc009f024"