diff --git a/.vscode/settings.json b/.vscode/settings.json index 5b6a22615f8..fff1f59785b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -29,5 +29,6 @@ "editor.quickSuggestions": { "strings": true }, - "editor.inlayHints.enabled": "on" + "editor.inlayHints.enabled": "on", + "java.configuration.updateBuildConfiguration": "interactive" } diff --git a/android/app/build.gradle b/android/app/build.gradle index f3d62c6283e..cb4ddb7c1fd 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -21,7 +21,7 @@ react { // cliFile = file("../node_modules/react-native/cli.js") /* Variants */ // The list of variants to that are debuggable. For those we're going to - // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // skip the bundling of the JS bundle and the assets. Default is "debug", "debugOptimized". // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. debuggableVariants = ["prodDebug", "flaskDebug"] /* Bundling */ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index d4081da476b..37f78a6af83 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/gradlew b/android/gradlew index 75770754dbd..6274d70a892 100755 --- a/android/gradlew +++ b/android/gradlew @@ -134,7 +134,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/android/gradlew.bat b/android/gradlew.bat index e15b90cc2b8..5bacadf0fff 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -73,7 +73,7 @@ goto fail set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/docs/rn-0.85-upgrade-spike.md b/docs/rn-0.85-upgrade-spike.md new file mode 100644 index 00000000000..98b4a65b0d3 --- /dev/null +++ b/docs/rn-0.85-upgrade-spike.md @@ -0,0 +1,159 @@ +# RN 0.85 Upgrade Spike (from 0.81.5) + +**Date:** 2026-06-24 +**Branch:** feat/rn-0.85 +**Current version:** 0.81.5 → Target: 0.85.0 + +--- + +## Wins + +| Version | Win | +| -------- | ---------------------------------------------------------------------------------- | +| **0.82** | Bridge fully removed → faster startup, cleaner JSI-only arch | +| **0.82** | Uncaught Promise Rejections now surface via `console.error` → surfaces silent bugs | +| **0.83** | React 19.2: `` component + `useEffectEvent` hook | +| **0.83** | Web Performance APIs stable (`performance.now()`, `PerformanceObserver`) | +| **0.84** | Hermes V1 default → better JS perf + memory | +| **0.84** | iOS: ~20% faster builds + smaller app size (legacy arch stripped from pods) | +| **0.85** | New Animation Backend: animate Flexbox/position props with `useNativeDriver: true` | +| **0.85** | Reanimated 4.x perf improvements unblocked by the new backend | +| **0.85** | Multiple CDP connections → VS Code + AI agents + DevTools simultaneously | +| **0.85** | Metro TLS support | + +--- + +## Breaking Changes Across All 4 Versions + +### 0.82 — BIGGEST JUMP + +- **New Architecture mandatory** — `newArchEnabled=false` (Android) and `RCT_NEW_ARCH_ENABLED=0` (iOS) are now silently ignored. Good news: `android/gradle.properties` already has `newArchEnabled=true`. +- `Appearance.setColorScheme()` no longer accepts `null`/`undefined` — use `'unspecified'` +- Android: `JSONArguments` class removed, Gradle 8.x → 9.0.0 required +- C++ backward-compat headers deleted (only affects patched native libs) + +### 0.83 — No breaking changes + +- React 19.1.0 → 19.2.x peer dep bump + +### 0.84 + +- Node.js 22+ required (already on 24.16.0 — no action needed) +- Many Android legacy bridge classes removed (`LazyReactPackage`, `CxxModuleWrapper`, `BridgeDevSupportManager`, etc.) +- iOS: Legacy arch stripped from pods by default — saves ~20% build time, but any third-party pod still using legacy C++ headers will break +- `XHRInterceptor`/`WebSocketInterceptor` deprecated (0 usages in codebase — fine) +- `MainApplication.kt` refactored: `ReactNativeHost` removed, simplified to `getDefaultReactHost` + +### 0.85 + +- **`StyleSheet.absoluteFillObject` removed** — **28 files affected** (see Codebase Actions) +- Jest preset moved: `preset: 'react-native'` → `preset: '@react-native/jest-preset'` (new package, `jest.config.js:32`) +- `@react-native/babel-preset`/`metro-config`/`typescript-config` must match 0.85.0 +- Gradle: 8.14.3 → 9.3.1 +- React 19.2.3, `@types/react` → ^19.2.0 +- iOS: `Podfile` and `MainApplication.kt` template changes + +--- + +## Codebase Actions Required + +| Item | Scope | Location | +| ----------------------------------------------------------- | ---------------------------- | -------------------------------------------------- | +| `StyleSheet.absoluteFillObject` → `StyleSheet.absoluteFill` | **Must be in RN upgrade PR** | 28 files in `app/` | +| `jest.config.js:32` preset change | Must be in RN upgrade PR | `jest.config.js` | +| `@react-native/babel-preset` 0.76.9 → 0.85.0 | Must | `package.json` | +| `@react-native/metro-config` 0.81.5 → 0.85.0 | Must | `package.json` | +| `@react-native/typescript-config` 0.76.9 → 0.85.0 | Must | `package.json` | +| `metro-react-native-babel-preset` ~0.76.9 → ~0.84.x | Must | `package.json` | +| Add `@react-native/jest-preset` 0.85.0 | Must | `package.json` | +| `react`/`react-test-renderer` 19.1.0 → 19.2.3 | Must | `package.json` | +| `@react-native-community/cli` 20.0.0 → 20.1.0 | Must | `package.json` | +| Android `MainApplication.kt` refactor | Must | `android/app/src/main/java/.../MainApplication.kt` | +| iOS `Podfile` changes | Must | `ios/Podfile` | +| Gradle wrapper 8.14.3 → 9.3.1 | Must | `android/gradle/wrapper/gradle-wrapper.properties` | +| Audit `Appearance.setColorScheme(null)` usage | Must audit | `app/` | + +### Files using `StyleSheet.absoluteFillObject` (28 total) + +``` +app/components/UI/Tabs/TabThumbnail/TabThumbnail.styles.ts +app/components/UI/Card/components/DaimoPayModal/DaimoPayModal.tsx +app/components/UI/Card/Views/SpendingLimit/components/ShimmerOverlay.tsx +app/components/UI/Notification/TransactionNotification/index.js +app/components/UI/Bridge/components/TransactionDetails/PulsingCircle.tsx +app/components/UI/CollectibleMedia/CollectibleMedia.styles.ts +app/components/UI/WebviewError/index.js +app/components/UI/AssetOverview/PriceChart/PriceChart.styles.tsx +app/components/UI/AssetOverview/Price/Price.styles.tsx +app/components/UI/Predict/components/PredictDetailsChart/PredictDetailsChart.tsx +app/components/UI/HardwareWallet/Swaps/HwQrScanner.tsx +app/components/UI/HardwareWallet/Swaps/StepConnectorLine.tsx +app/components/UI/SlippageSlider/index.js +app/components/UI/Ramp/Aggregator/components/LoadingAnimation/index.tsx +app/components/UI/ButtonReveal/index.tsx +app/components/UI/ReusableModal/styles.ts +app/components/UI/UrlAutocomplete/styles.ts +app/components/Views/MediaPlayer/index.js +app/components/Views/Homepage/Sections/Perpetuals/components/PerpsMarketTileCard/PerpsMarketTileCard.styles.ts +app/components/Views/TradeWalletActions/TradeWalletActions.tsx +(+ 8 more) +``` + +--- + +## Library Updates + +### Must update in the RN upgrade PR + +| Package | Current | Target | Notes | +| ---------------------- | ------- | ------- | --------------------------------------- | +| `react-native-screens` | ~4.16.0 | ~4.25.2 | Minor bump, low risk | +| `react-native-svg` | 15.12.1 | 15.15.5 | Minor bump; 0.84 broke its observer API | +| `@shopify/flash-list` | 2.0.3 | 2.3.2 | Minor bump | + +### Can be separate PRs (update independently before or after) + +| Package | Current | Target | Risk | Notes | +| ---------------------------------- | ------- | -------- | ---------- | ---------------------------------------------------------------------------- | +| `react-native-gesture-handler` | ~2.28.0 | ^3.0.2 | **HIGH** | 3.x is new arch only, min RN 0.82; API changes expected | +| `react-native-reanimated` | 3.19.0 | ^4.5.0 | **HIGH** | 4.x integrates with new Animation Backend; wait for RN 0.85.1 | +| `react-native-mmkv` | ^3.2.0 | ^4.3.2 | **MEDIUM** | 4.x is a Nitro Module; API changed | +| `react-native-vision-camera` | ^4.7.3 | ^5.0.11 | **HIGH** | Full Nitro Module rewrite in v5 | +| `@sentry/react-native` | ~7.2.0 | ~8.15.1 | **MEDIUM** | Major bump; verify init API changes | +| `@react-native-firebase/app` | ^20.5.0 | ^24.1.1 | **HIGH** | 4 major versions; requires `forceStaticLinking` for iOS on RN 0.84+ | +| `expo` | 54.0.33 | SDK 56 | **HIGH** | Skips SDK 55; SDK 56 = RN 0.85; all `expo-*` packages bump | +| `react-native-keyboard-controller` | ^1.20.3 | ^1.21.9 | **LOW** | Minor bump | +| `lottie-react-native` | ~7.3.1 | ~7.3.8 | **LOW** | Minor bump | +| `@notifee/react-native` | ^9.0.0 | ⚠️ 9.1.8 | **NOTE** | Unmaintained; community suggests migrating to `expo-notifications` long-term | + +--- + +## Suggested Order of Work + +1. **Core RN upgrade PR** + - `react-native` 0.81.5 → 0.85.0 + - All `@react-native/*` tooling (babel-preset, metro-config, typescript-config, eslint-config) → 0.85.0 + - Add `@react-native/jest-preset` 0.85.0 + - `react` + `react-test-renderer` → 19.2.3 + - `@types/react` → ^19.2.0 + - `@react-native-community/cli` → 20.1.0 + - Fix `jest.config.js` preset + - Fix 28x `StyleSheet.absoluteFillObject` → `StyleSheet.absoluteFill` + - Gradle wrapper → 9.3.1 + - Android `MainApplication.kt` + iOS `Podfile` template changes + - Bump `react-native-screens`, `react-native-svg`, `flash-list` + +2. **Parallel low-risk PRs** (can land with or before core) + - `react-native-keyboard-controller` → ^1.21.9 + - `lottie-react-native` → ~7.3.8 + +3. **Follow-up PRs** (each its own PR — all major version bumps) + - `react-native-gesture-handler` → 3.x + - `@react-native-firebase` → 24.x (most complex) + - `@sentry/react-native` → 8.x + - `expo` → SDK 56 + +4. **After RN 0.85.1 is released** + - `react-native-reanimated` → 4.x (new Animation Backend only available from 0.85.1) + - `react-native-vision-camera` → 5.x (Nitro Module) + - `react-native-mmkv` → 4.x (Nitro Module) diff --git a/docs/rn-0.85-upgrade-spike.txt b/docs/rn-0.85-upgrade-spike.txt new file mode 100644 index 00000000000..ab7ad267abd --- /dev/null +++ b/docs/rn-0.85-upgrade-spike.txt @@ -0,0 +1,771 @@ +RN 0.85 UPGRADE SPIKE (from 0.81.5) +===================================== +Date: 2026-06-25 +Branch: feat/rn-0.85 +Current version: 0.81.5 -> Target: 0.85.0 + + +================================================================================ +EXECUTIVE SUMMARY -- READ THIS FIRST +================================================================================ + +This is a 4-version jump (0.81.5 -> 0.85.0). New Architecture is mandatory from +0.82; Expo SDK 56 is pinned to RN 0.85 and cannot be a separate follow-up PR. + +WHAT BLOCKS THE BUILD (must be clean before CI goes green): + 1. RN + tooling version lock (babel-preset, metro-config, etc.) + 2. StyleSheet.absoluteFillObject removed (28 files) + 3. Jest preset path changed + 4. Gradle wrapper 9.3.1 + 5. react-native-linear-gradient broken on Fabric (crash on startup) + 6. react-native-get-random-values v1 -> v2 (link error on new-arch) + 7. react-native-i18n legacy bridge (high risk -- see PREP PRs) + +WHAT BLOCKS RUNTIME (must be PREP PRs before core): + - react-native-device-info v9 (no TurboModule, breaks on new-arch) + - react-native-permissions v3.7 (too old for new-arch) + - react-native-keychain v9 -> v10 (security-critical; TurboModule in v10) + +WHAT IS VERIFIED CLEAN (no code changes needed): + - newArchEnabled=true already set + - Kotlin 2.1.20, compileSdk/targetSdk/buildTools 36 already at template level + - edgeToEdgeEnabled=false (no action) + - hermesEnabled=true already set + - Appearance.setColorScheme null/undefined: 0 usages + - XHRInterceptor / WebSocketInterceptor: 0 usages + - TypeScript Flow-type aliases ($Values/$ReadOnly/$ReadOnlyArray/mixed): 0 usages + - AccessibilityInfo.setAccessibilityFocus: 0 usages + +SUGGESTED SEQUENCING: + PREP PRs (independent, land first) + -> CORE RN 0.85 PR (version-locked bundle) + -> Low-risk follow-ups (keyboard-controller, lottie, segment, etc.) + -> Major follow-ups (gesture-handler 3.x, firebase 24.x, sentry 8.x) + -> After 0.85.1 (reanimated 4.x, mmkv 4.x, vision-camera 5.x) + + * Expo SDK 56 IS version-locked to RN 0.85 -- it CANNOT be a later follow-up. + It must ship in the core PR. See PR PLAN section for full explanation. + + +================================================================================ +WINS +================================================================================ + +0.82 Bridge fully removed -> faster startup, cleaner JSI-only arch +0.82 Uncaught Promise Rejections now surface via console.error -> surfaces silent bugs +0.83 React 19.2: component + useEffectEvent hook +0.83 Web Performance APIs stable (performance.now(), PerformanceObserver) +0.84 Hermes V1 default -> better JS perf + memory +0.84 iOS: ~20% faster builds + smaller app size (legacy arch stripped from pods) +0.85 New Animation Backend: animate Flexbox/position props with useNativeDriver: true + [NOTE] OPT-IN only via unstable_enableNewAnimationBackend(). The Animated + layout-prop native driver lands in 0.85.1, NOT automatically in 0.85.0. +0.85 Reanimated 4.x perf improvements unblocked by the new backend (after 0.85.1) +0.85 Multiple CDP connections -> VS Code + AI agents + DevTools simultaneously +0.85 Metro TLS/HTTPS support in development +0.85 Android: android_ripple now accepts PlatformColor +0.85 Android: TextInput extended autofill hints (androidx.autofill 1.3.0) +0.85 iOS: Privacy manifest declarations for mach_absolute_time() API + + +================================================================================ +BREAKING CHANGES ACROSS ALL 4 VERSIONS +================================================================================ + +0.82 - BIGGEST JUMP + - New Architecture mandatory + newArchEnabled=false (Android) and RCT_NEW_ARCH_ENABLED=0 (iOS) silently ignored + VERIFIED: android/gradle.properties already has newArchEnabled=true -- fine + - Appearance.setColorScheme() no longer accepts null/undefined, use 'unspecified' + VERIFIED CLEAN: 0 real usages of the RN API in this codebase + - Android: JSONArguments class removed, Gradle 8.x -> 9.0.0 required + - C++ backward-compat headers deleted (only affects patched native libs) + +0.83 - No breaking changes + - React 19.1.0 -> 19.2.x peer dep bump only + +0.84/0.85 + - Node.js support (per RN 0.85 package.json "engines", the authoritative source): + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + i.e. v20.19.4+ IS still supported (NOT dropped); v21 and v23 are EOL/dropped. + (RN's setup docs/changelog say "22.11+", but the engines field allows 20.19.4+.) + We are on 24.16.0 (satisfies ^24.3.0) -- no action. + - Many Android legacy bridge classes removed: + LazyReactPackage, CxxModuleWrapper, CxxModuleWrapperBase, CallbackImpl, + NotThreadSafeBridgeIdleDebugListener, OnBatchCompleteListener, + ReactCxxErrorHandler, BridgeDevSupportManager, NativeKind, + LayoutAnimationController, LayoutAnimationListener + - iOS: Legacy arch stripped from pods by default -- saves ~20% build time + Any third-party pod still using legacy C++ headers will break at build + - XHRInterceptor / WebSocketInterceptor deprecated + VERIFIED CLEAN: 0 usages in codebase + +0.85 + - StyleSheet.absoluteFillObject REMOVED -- 28 FILES AFFECTED (see list below) + - Jest preset moved: preset: 'react-native' -> preset: '@react-native/jest-preset' + Affected file: jest.config.js line 32 + - @react-native/babel-preset / metro-config / typescript-config must be 0.85.0 + - metro-react-native-babel-preset ~0.76.9 -> ~0.84.x + - Gradle: 8.14.3 -> 9.3.1 + - React 19.2.3, @types/react -> ^19.2.0 + - iOS Podfile and Android MainApplication.kt template changes required + - TypeScript Flow-type aliases removed: $Values, $ReadOnly, $ReadOnlyArray, mixed + VERIFIED CLEAN: 0 usages in app/ -- no code changes needed + - AccessibilityInfo.setAccessibilityFocus() deprecated -> sendAccessibilityEvent() + VERIFIED CLEAN: 0 usages in app/ -- no code changes needed + - Android: ReactTextUpdate made internal; ReactTextAnchorViewManager merged into + ReactTextViewManager; UIManagerHelper event-dispatcher methods deprecated + (only affects code that calls these RN internals directly -- app code is fine) + - iOS: RCTHostRuntimeDelegate deprecated -> merged into RCTHostDelegate + (only affects custom host implementations -- not applicable to this app) + - *** LEGACY ARCH CLEANUP (nuanced -- read carefully) *** + Popular blogs claim "interop is removed, every legacy module breaks" -- OVERSTATED. + Reality from the RN 0.85 changelog: + - Legacy Native MODULE interop layer (RCTBridgeModule / Java legacy modules) + is STILL PRESENT BY DEFAULT in 0.85. Only compiled out with opt-in build + constraint RCT_REMOVE_LEGACY_MODULE_INTEROP (Meta-internal; OFF by default). + => Most old bridge-style native MODULES still work on 0.85 via interop layer + (enabled by default since RN 0.74). + - What IS actually gone in 0.85: + * C++ legacy modules: CxxModule, RCTCxxModule, TurboCxxModule (no interop path) + * unstable_shouldEnableLegacyModuleInterop() API removed + * CatalystInstanceImpl removed, NativeViewHierarchyManager stubbed, + NativeKind deleted, ReactZIndexedViewGroup + UIManagerHelper deprecated + * C++ backward-compat headers deleted in 0.84 -> breaks pods using them + - The genuinely fragile category is native VIEW COMPONENTS (legacy ViewManagers): + Fabric component interop is limited/buggy, so native UI libs that have NOT + moved to Fabric can render broken (confirmed example: react-native-linear-gradient) + => Audit native deps splitting MODULE (mostly fine via interop) vs COMPONENT + (must support Fabric). See NATIVE MODULE NEW-ARCH AUDIT section below. + + +================================================================================ +CODEBASE ACTIONS REQUIRED +================================================================================ + + Item | Scope | Location + ----------------------------------------------|--------|-------------------------------------------------- + StyleSheet.absoluteFillObject -> .absoluteFill | Must | 28 files (see list below) + jest.config.js:32 preset change | Must | jest.config.js + @react-native/babel-preset 0.76.9 -> 0.85.0 | Must | package.json + @react-native/metro-config 0.81.5 -> 0.85.0 | Must | package.json + @react-native/typescript-config 0.76.9->0.85.0| Must | package.json + @react-native/eslint-config ^0.82.0 -> 0.85.0 | Must | package.json + metro-react-native-babel-preset ~0.76.9->0.84.x| Must | package.json + metro-react-native-babel-transformer ~0.76.9 | Must | package.json -- bump with preset, or remove if unused + Add @react-native/jest-preset 0.85.0 | Must | package.json (new package) + react / react-test-renderer 19.1.0 -> 19.2.3 | Must | package.json + react-dom 18.2.0 -> 19.2.x | Must | package.json (devDep; peer mismatch with react 19) + @types/react ^19.1.0 -> ^19.2.0 | Must | package.json -- tracks React 19.2.3 target + @types/react-test-renderer ^18 -> ^19 | Should | package.json + typescript ~5.4.5 -> ~5.8.x | Must | package.json -- new typescript-config 0.85 requires TS 5.8.x + @react-native-community/cli 20.0.0 -> 20.1.0 | Must | package.json + @react-native-community/cli-platform-android | Must | package.json -- 20.0.0 -> 20.1.0 (bump with cli) + @react-native-community/cli-platform-ios | Must | package.json -- 20.0.0 -> 20.1.0 (bump with cli) + @react-native-community/cli-server-api ^17.0.0 | Must | package.json -- far behind; bump to ^20.1.0 with other CLI pkgs + @react-native-firebase/messaging 20.5 -> 24.x | Must | package.json -- bump in lockstep with /app + Android MainApplication.kt refactor | Must | android/app/src/main/java/.../MainApplication.kt + iOS Podfile changes | Must | ios/Podfile + nkf gem in ios/Gemfile | Must | ios/Gemfile -- required by RN 0.85 template (Ruby 3.4) + Gradle wrapper 8.14.3 -> 9.3.1 | Must | android/gradle/wrapper/gradle-wrapper.properties + Regenerate/validate all yarn patches | Must | .yarn/patches/ -- see PATCHES section below + Audit ALL native modules for new-arch support | Must | package.json -- see NATIVE MODULE NEW-ARCH AUDIT below + Appearance.setColorScheme(null) usage | NO ACTION | VERIFIED CLEAN -- 0 usages + TypeScript $Values/$ReadOnly/$ReadOnlyArray/ | NO ACTION | VERIFIED CLEAN -- 0 usages in app/ + mixed type alias removals | | + AccessibilityInfo.setAccessibilityFocus usage | NO ACTION | VERIFIED CLEAN -- 0 usages + + ALREADY DONE (verified in android/build.gradle + gradle.properties): + Kotlin 2.1.20, compileSdk/targetSdk/buildTools 36, edgeToEdgeEnabled=false, + newArchEnabled=true, hermesEnabled=true -- these already match RN 0.85 template. + + +================================================================================ +FILES USING StyleSheet.absoluteFillObject (28 total -- all must be fixed) +================================================================================ + + app/components/UI/Tabs/TabThumbnail/TabThumbnail.styles.ts + app/components/UI/Card/components/DaimoPayModal/DaimoPayModal.tsx + app/components/UI/Card/Views/SpendingLimit/components/ShimmerOverlay.tsx + app/components/UI/Notification/TransactionNotification/index.js + app/components/UI/Bridge/components/TransactionDetails/PulsingCircle.tsx + app/components/UI/CollectibleMedia/CollectibleMedia.styles.ts + app/components/UI/WebviewError/index.js + app/components/UI/AssetOverview/PriceChart/PriceChart.styles.tsx + app/components/UI/AssetOverview/Price/Price.styles.tsx + app/components/UI/Predict/components/PredictDetailsChart/PredictDetailsChart.tsx + app/components/UI/HardwareWallet/Swaps/HwQrScanner.tsx + app/components/UI/HardwareWallet/Swaps/StepConnectorLine.tsx + app/components/UI/SlippageSlider/index.js + app/components/UI/Ramp/Aggregator/components/LoadingAnimation/index.tsx + app/components/UI/ButtonReveal/index.tsx + app/components/UI/ReusableModal/styles.ts + app/components/UI/UrlAutocomplete/styles.ts + app/components/Views/MediaPlayer/index.js + app/components/Views/Homepage/Sections/Perpetuals/components/PerpsMarketTileCard/PerpsMarketTileCard.styles.ts + app/components/Views/TradeWalletActions/TradeWalletActions.tsx + (+ 8 more -- run: grep -r "StyleSheet.absoluteFillObject" app/ -l) + + +================================================================================ +LIBRARY UPDATES +================================================================================ + +*** IMPORTANT: this repo is Expo-based. Do NOT hand-pick versions for Expo-managed + packages -- use `npx expo install` / `npx expo install --check` to get SDK 56 + pinned versions. Expo pins screens/svg/safe-area-context/flash-list/all expo-* + to known-good versions for RN 0.85. The targets below are floors, not hand-picks. *** + + +MUST UPDATE IN THE CORE RN UPGRADE PR +-------------------------------------- + + Package | Current | Target | Notes + ------------------------------|-----------|---------------------|-------------------------------------- + react-native-screens | ~4.16.0 | 4.25.0+ (latest) | 4.25.0+ requires RN 0.82+ and drops + | | | legacy arch. Use Expo SDK 56 pinned + | | | version. (4.25.2 does not exist) + react-native-svg | 15.12.1 | 15.15.4+ | RN 0.85 changed ImageResponseObserver + | | | to shared_ptr; 15.15.4 is the confirmed- + | | | compatible build. + @shopify/flash-list | 2.0.3 | Expo SDK 56 pin | New-arch-only rewrite; use Expo pin. + react-native-safe-area-context| ~5.6.0 | Expo SDK 56 pin | Core nav dep; use Expo-pinned version. + + +PREP PRs -- LAND BEFORE CORE (hard blockers on new-arch) +--------------------------------------------------------- + + These are build/runtime blockers that should be separate PRs so the core PR + stays focused and reviewable. Land these first. + + Package | Current | Target | Risk | Why it blocks + -------------------------------|-------------|-----------|--------|---------------------------------------------- + react-native-linear-gradient | ^2.8.3 | MIGRATE | CRIT | v2 has NO Fabric support; breaks at render + | | | | on any screen with a gradient. MIGRATE to + | | | | expo-linear-gradient (already in Expo SDK). + | | | | API differs: colors tuple, start/end instead + | | | | of angle/useAngle -- code changes needed. + react-native-get-random-values | ^1.8.0 | ^2.0 | CRIT | v1 throws _RCTRegisterModule undefined link + | | | | error on new-arch. App won't start. + react-native-device-info | ^9.0.2 | ^15.x | HIGH | v9 has NO TurboModule; breaks on 0.85 + | | | | new-arch. Required by many features. + react-native-permissions | ^3.7.2 | ^5.x | HIGH | v3.7 too old for new-arch. Permissions + | | | | will fail at runtime. + react-native-keychain | ^9.0.0 | ^10.0.0 | HIGH | v9 works via interop but v10 adds + | | | | TurboModule (Mar 2026). SECURITY-CRITICAL + | | | | path -- bump and test biometrics separately. + react-native-i18n | 2.0.15 patch| EVALUATE | HIGH | Bridge-ONLY module (2018); no new-arch + | | | | support. Two options: + | | | | a) Migrate to i18n-js + react-native-localize + | | | | b) Verify patch still works on 0.85 via interop + | | | | and accept tech debt. Cannot ignore -- test + | | | | ALL translated strings after the bump. + react-native-default-preference| ^1.4.3 | EVALUATE | MED | Pure bridge module (SharedPreferences/ + | | | | UserDefaults); no new-arch version exists. + | | | | Works via interop but fragile long-term. + | | | | Consider migrating to react-native-mmkv + | | | | (already in repo) or AsyncStorage. + + +SEPARATE PRs -- INDEPENDENT; SEQUENCE AROUND CORE +--------------------------------------------------- + + Low-risk (anytime, before or after core): + Package | Current | Target | Risk | Notes + --------------------------------|-----------|-----------|--------|------------------------------------------ + react-native-keyboard-controller| ^1.20.3 | ^1.21.9 | LOW | Minor bump + lottie-react-native | ~7.3.1 | ~7.3.8 | LOW | Minor bump + react-native-localize | ^3.4.1 | latest ^3 | LOW | Bump for new-arch confidence; active lib + @segment/analytics-react-native | ^2.21.4 | latest 2.x| LOW | Older versions crash on new-arch; bump. + react-native-share | 7.3.7 | latest | LOW | Bump for new-arch; verify share sheet. + react-native-blob-util | ^0.19.9 | verify | LOW | New-arch supported in 0.19+. Verify OK. + + Major bumps (each its own PR, after core): + Package | Current | Target | Risk | Notes + --------------------------------|-----------|-----------|--------|------------------------------------------ + react-native-gesture-handler | ~2.28.0 | ^3.0.2 | HIGH | 3.x new-arch only, min RN 0.82; API changes + @react-native-firebase/app | ^20.5.0 | ^24.1.1 | HIGH | 4 major versions; needs forceStaticLinking + | | | | on iOS for RN 0.84+ + @sentry/react-native | ~7.2.0 | ~8.13+ | MED | Its OWN version line -- NOT the same as + | | | | @sentry/browser/core/react (those are ~8.54, + | | | | a completely separate package line). + | | | | Known 8.x gotcha: TurboModule race can + | | | | silently drop events on Hermes new-arch -> + | | | | use latest patch version. + @notifee/react-native | ^9.0.0 | 9.1.8 [!] | NOTE | Unmaintained; consider expo-notifications + | | | | long-term. + + After RN 0.85.1 (depend on new animation backend / Nitro runtime): + Package | Current | Target | Risk | Notes + --------------------------------|-----------|-----------|--------|------------------------------------------ + react-native-reanimated | 3.19.0 | ^4.5.0 | HIGH | 4.x integrates with new Animation Backend; + | | | | wait for RN 0.85.1 (backend lands in .1) + react-native-worklets [NEW DEP] | (none) | match rea.| HIGH | REQUIRED companion package for Reanimated + | | | | 4. Must ADD as dependency AND update + | | | | babel.config.js:75: replace + | | | | 'react-native-reanimated/plugin' WITH + | | | | 'react-native-worklets/plugin' (must be LAST). + | | | | Leaving both = worklets transformed twice = + | | | | "called function from a different thread". + | | | | NOTE: babel-preset-expo (SDK 56) may + | | | | auto-inject this -- confirm before adding + | | | | the explicit line. + react-native-mmkv | ^3.2.0 | ^4.3.2 | MED | 4.x is a Nitro Module; API changed + react-native-vision-camera | ^4.7.3 | ^5.0.11 | HIGH | Full Nitro Module rewrite in v5 + react-native-nitro-modules | 0.35.5 | compatible| MED | Bump to version compatible with mmkv 4.x / + | | | | vision-camera 5.x + + +================================================================================ +PATCHES TO REGENERATE / VALIDATE (.yarn/patches/) +================================================================================ + +Yarn patches are version-pinned and frequently break on RN bumps. Audit EVERY +patch in the upgrade PR. After bumping RN, run `yarn install` and fix every patch +that fails to apply. Highest risk: + + react-native-npm-0.81.5-d8232ef145.patch + Pinned to 0.81.5 -- WILL NOT APPLY to 0.85. Must regenerate or drop. + + @metamask/react-native-webview (14.6.0) + Heavily used native lib; verify 0.85 compat and patch still applies. + + react-native-quick-crypto (0.7.15) + Native crypto module; verify new-arch support and patch. + + react-native-quick-base64 (2.2.0) + Native module; verify patch applies. + + react-native-aes-crypto-forked (MetaMask GitHub fork) + No npm release; patch is against a Git SHA. Must verify on 0.85. + + react-native-ble-plx (3.4.0) + LEDGER-CRITICAL; verify BLE transport patch applies and works on 0.85. + + react-native-fast-crypto (2.2.0) + Verify patch. + + react-native-os (1.2.6) + Legacy bridge module with patch; verify interop on 0.85. + + react-native-sensors (5.3.0) + Verify patch. + + react-native-gzip (1.1.0) + Verify patch. + + react-native-i18n (2.0.15) + Bridge-only + patched. High risk. See PREP PRs section. + + detox (20.51.0) + Verify E2E tooling works on 0.85 before merging. + + @braze/react-native-sdk (19.1.0) + Verify patch applies; recent Braze SDKs support new arch. + + @tommasini/react-native-scrollable-tab-view (1.1.1) + View component (Fabric risk) + patched. Verify rendering. + + redux-persist-filesystem-storage (4.2.0) + Verify patch. + + reactotron-core-client (2.9.7) + Dev tooling; verify. + + expo-web-browser (15.0.10) + Expo module patch; will likely need regenerating for SDK 56. + + +================================================================================ +NATIVE MODULE NEW-ARCH AUDIT (per-library verdict for 0.85) +================================================================================ + +How to read this: + 0.85 keeps the legacy MODULE interop layer ON by default, so old bridge-style + native MODULES generally still run. Real failures are: + (a) native VIEW COMPONENTS that never moved to Fabric + (b) C++ legacy modules / removed classes + Pure-JS libs are unaffected by arch -- their only risk is React 19 / maintenance. + +Legend: + [JS] = pure JS, no native (arch-agnostic) + [MOD] = native module (legacy interop OK by default in 0.85) + [VIEW] = native view component (Fabric required -- highest risk) + [VERIFIED] = checked against changelogs / official notes + +Recommended workflow: build on 0.85 EARLY and watch startup for TurboModule +registration errors (modules) and 0x0 / blank views (Fabric components) -- those +pinpoint the libs that actually need a bump vs ones that just work. + + +A) PURE-JS -- WORK ON 0.85 AS-IS + (risk = React 19 peer / unmaintained, not arch) + + react-native-svg-charts [JS] works; unmaintained. Modern alts: + victory-native, react-native-gifted-charts, + react-native-wagmi-charts. + react-native-material-textfield [JS] works; unmaintained. Alt: own TextField + via component-library. + react-native-elevated-view [JS] trivial elevation wrapper; works. + react-native-step-indicator [JS] works. + react-native-keyboard-aware-scroll-view [JS] works; superseded by + react-native-keyboard-controller (in repo). + react-native-fade-in-image [JS] works. + react-native-swipe-gestures [JS] works. + react-native-confetti [JS] works. + react-native-confetti-cannon [JS] works. + react-native-animatable [JS] uses Animated API -- JS-level API is + unchanged in 0.85. Works fine. + react-native-progress [JS+SVG] pure JS + react-native-svg; fine once + svg is bumped. + react-native-render-html [JS] uses WebView bridge for display; fine. + react-native-confirmation-code-field [JS] view built with RN primitives; fine. + react-native-size-matters [JS] pure JS utility; fine. + react-native-skeleton-placeholder [JS] fine. + => No arch action. Optionally retire unmaintained ones to reduce React-19 risk. + + +B) NATIVE MODULES -- run on 0.85 via interop; bump for real TurboModule where available + + react-native-keychain ^9.0.0 -> ^10.0.0 [MOD][VERIFIED] TurboModule added in + v10 (Mar 2026), backward compatible. + SECURITY-CRITICAL -> bump & test biometrics. + react-native-device-info ^9.0.2 -> ^15.x [MOD][VERIFIED] v9 too old; new arch + in recent majors. Hard blocker. + react-native-permissions ^3.7.2 -> ^5.x [MOD] new arch supported in v5; bump. + react-native-ble-plx 3.4.0(patched) [MOD][VERIFIED] No TurboModule but works + via default-on MODULE interop. Bump + re-verify + patch on 0.85. LEDGER-CRITICAL -> test BLE transport. + @segment/analytics-react-native ^2.21.4 [MOD][VERIFIED] works on bridgeless; + older versions crash "don't use ReactNativeHost + in New Arch" -> bump to latest 2.x. + NOTE: pulls react-native-get-random-values; needs + >=2.0 for new arch. + react-native-share 7.3.7 -> latest [MOD] bump for new-arch; verify sheet. + react-native-randombytes ^3.5.3 [MOD] old; runs via interop. Largely + redundant -- react-native-get-random-values (in repo) + + expo-crypto cover it. Consider removing. + react-native-background-timer 2.1.1 [MOD] unmaintained bridge module; runs via + interop but risky long-term. + Alt: expo-background-task / expo-task-manager. + react-native-fs ^2.20.0 [MOD] legacy; interop works. Prefer + migrating to expo-file-system or react-native-blob-util + (already in repo) and dropping it. + react-native-blob-util ^0.19.9 [MOD] new-arch supported in 0.19+. Fine; + verify on 0.85. + @react-native-community/netinfo ^11.4.1 [MOD] new arch OK. + @react-native-community/datetimepicker ^8.5.1 [MOD/VIEW] new arch OK in v8+. + @react-native-clipboard/clipboard ^1.16.1 [MOD] new arch OK. + @react-native-cookies/cookies ^6.2.1 [MOD] verify new arch on 0.85. + @braze/react-native-sdk (patched 19.1.0) [MOD] recent Braze SDKs support new arch; + verify patch on 0.85. + @veriff/react-native-sdk ^11.2.0 [MOD/VIEW] vendor SDK -> check Veriff's + RN 0.85 support note. + rive-react-native ^9.8.0 [MOD/VIEW] Rive supports new arch in recent + v9; verify. + react-native-localize ^3.4.1 [MOD] active; works via interop. Bump to + latest for new-arch confidence. + react-native-in-app-review ^4.3.3 [MOD] native module; runs via interop. + Verify on 0.85; no known Fabric issues. + react-native-branch ^5.6.2 [MOD] Branch.io SDK; v5 claims new-arch + support but verify -- Branch has had bridgeless issues + in past minor versions. Test deep-link flows. + react-native-aes-crypto 3.0.3 [MOD] native crypto; no known new-arch + blockers. Verify interop + test encryption flows. + react-native-aes-crypto-forked (patched) [MOD] MetaMask fork from GitHub SHA; + PATCH WILL LIKELY BREAK on RN bump. Verify and + regenerate patch. Test encryption after. + react-native-quick-crypto (patched 0.7.15) [MOD] C++ native module. Patch pinned to + 0.7.15 -- must verify patch applies to 0.85. Check + if 0.85 C++ header changes affect it. + react-native-quick-base64 (patched 2.2.0) [MOD] native module with patch; verify. + react-native-default-preference ^1.4.3 [MOD] pure legacy bridge module + (SharedPreferences/UserDefaults); no new-arch version + exists. Works via interop but fragile. + Plan: migrate to react-native-mmkv (in repo) or + AsyncStorage for a clean new-arch path. + react-native-inappbrowser-reborn ^3.7.0 [MOD] in-app browser via native WebView + bridge. Verify against @metamask/react-native-webview. + Check for Fabric/interop issues on iOS. + react-native-os (patched 1.2.6) [MOD] legacy; interop works. Patch must + be re-validated on 0.85. + + +C) NATIVE VIEW COMPONENTS -- Fabric risk; verify rendering (highest-risk category) + + react-native-linear-gradient ^2.8.3 [VIEW][VERIFIED] BROKEN on Fabric (v2 has no + Fabric support). HARD BLOCKER. + => MIGRATE to expo-linear-gradient (in Expo SDK, + already available). API differs: colors tuple, + start/end instead of angle/useAngle. Code changes + needed at every usage site. + @react-native-community/slider 5.0.1 [VIEW] new arch OK in 4.5+/5.x; verify. + @react-native-community/checkbox ^0.5.20 [VIEW] Android-only; verify Fabric. + @react-native-masked-view/masked-view ^0.3.1 [VIEW] new arch OK in 0.3.x; fine. + react-native-pager-view 6.9.1 [VIEW] Fabric-ready in 6.x; fine. + react-native-video ^6.19.0 [VIEW] v6 supports Fabric; fine. + react-native-view-shot 4.0.3 [VIEW] v4 supports new arch; fine. + react-native-vector-icons 10.2.0 [VIEW/JS] v10 fine. + react-native-svg (covered in MUST-UPDATE table) -- core Fabric dep for many libs. + @tommasini/react-native-scrollable-tab-view (patched 1.1.1) [VIEW] Fabric compat + unknown; patched version. Verify rendering of any + tab-view screens after the bump. If broken, replace + with react-native-pager-view (already in repo). + + +D) BRIDGE-ONLY -- HIGH RISK (no new-arch path; runs via interop but may fail) + + react-native-i18n 2.0.15 (patched) [MOD] Bridge-ONLY (2018 codebase), no + TurboModule, no Fabric. Works via legacy MODULE + interop layer (ON by default in 0.85) but is the + most fragile category. + TWO OPTIONS: + a) MIGRATE: i18n-js + react-native-localize is the + modern equivalent and is well-maintained. + b) ACCEPT RISK: verify patch still applies to 0.85, + test ALL translated strings, accept tech debt. + Recommendation: plan migration in a follow-up PR; + for now verify it starts and strings load correctly. + + +E) RELATED FINDING + + react-native-get-random-values ^1.8.0 -> ^2.0 [MOD] v1.x has new-arch link errors + (_RCTRegisterModule undefined); v2.0 fixes it. + Required by Segment + others. HARD BLOCKER. + + +================================================================================ +PR PLAN -- WHAT GOES WHERE +================================================================================ + +1) PREP PRs -- land before core (each independent; keeps core PR clean) + Hard blockers -- 0.85 won't RUN correctly without these: + + react-native-linear-gradient -> expo-linear-gradient (Fabric crash; code changes) + react-native-get-random-values ^1.8.0 -> ^2.0 (new-arch link error) + react-native-keychain ^9 -> ^10 (TurboModule; biometrics) + react-native-device-info ^9 -> ^15 (broken new-arch) + react-native-permissions ^3.7 -> ^5 (broken new-arch) + react-native-i18n evaluate/migrate (bridge-only; high risk) + react-native-default-preference evaluate/migrate (bridge-only; fragile) + + +2) CORE RN 0.85 PR -- MUST ship together (version-locked / build-blocking) + RN 0.85 will not build/type-check/test without all of these: + + react-native 0.81.5 -> 0.85.0 (+ regenerate yarn patch) + @react-native/babel-preset 0.76.9 -> 0.85.0 + @react-native/metro-config 0.81.5 -> 0.85.0 + @react-native/typescript-config 0.76.9 -> 0.85.0 + @react-native/eslint-config ^0.82 -> 0.85.0 + @react-native/jest-preset ADD 0.85.0 (+ jest.config.js:32 preset change) + metro-react-native-babel-preset/-transformer ~0.76.9 -> ~0.84.x (or remove if unused) + react / react-test-renderer 19.1.0 -> 19.2.3 + react-dom 18.2.0 -> 19.2.x (peer-locked to react) + typescript ~5.4.5 -> ~5.8.x (new typescript-config requires it) + @types/react ^19.1.0 -> ^19.2.0 + @types/react-test-renderer ^18 -> ^19 + @react-native-community/cli + cli-platform-android + cli-platform-ios 20.0.0 -> 20.1.0 + @react-native-community/cli-server-api ^17.0.0 -> ^20.1.0 + @react-native-firebase/messaging 20.5 -> 24.x (must match /app) + react-native-screens / react-native-svg / @shopify/flash-list / react-native-safe-area-context + expo SDK 54 -> SDK 56 (+ ALL expo-*) + + WHY expo CANNOT be a later follow-up: + Expo SDK 56 is pinned to RN 0.85. babel-preset-expo and all expo modules are + SDK-version-locked. Running RN 0.85 with Expo SDK 54 = undefined behavior. + They must ship together. + + Code/config in the same PR: + 28x absoluteFillObject -> absoluteFill + Gradle wrapper -> 9.3.1 + MainApplication.kt + Podfile templates + nkf gem in ios/Gemfile + Re-validate ALL yarn patches (esp. react-native-npm-0.81.5 patch -- must regenerate) + + ALREADY DONE (no action in PR): + Kotlin 2.1.20, compileSdk/targetSdk/buildTools 36, edgeToEdgeEnabled=false, + newArchEnabled=true, hermesEnabled=true + + +3) SEPARATE PRs -- independent; sequence around core + + Low-risk (anytime, before or after): + react-native-keyboard-controller ^1.20.3 -> ^1.21.9 + lottie-react-native ~7.3.1 -> ~7.3.8 + react-native-localize -> latest ^3 + @segment/analytics-react-native -> latest 2.x (bridgeless fix) + react-native-share -> latest; react-native-blob-util verify + + Major bumps (each its own PR, after core): + react-native-gesture-handler -> 3.x (new-arch only; API changes) + @react-native-firebase/app + /messaging -> 24.x (iOS forceStaticLinking) + @sentry/react-native ~7.2 -> ~8.13+ (own version line) + @notifee/react-native -> 9.1.8 + + After RN 0.85.1 (depend on new animation backend / Nitro): + react-native-reanimated -> 4.x (+ ADD react-native-worklets + babel plugin swap) + react-native-mmkv -> 4.x (Nitro; bump react-native-nitro-modules with it) + react-native-vision-camera -> 5.x (Nitro; bump react-native-nitro-modules with it) + + +4) NO ACTION (verified clean) + Pure-JS libs (svg-charts, material-textfield, step-indicator, animatable, progress, + confetti, etc.) work on 0.85 as-is. + Appearance.setColorScheme audit: CLEAN. + TypeScript Flow-type alias removals ($Values/$ReadOnly/$ReadOnlyArray/mixed): CLEAN. + AccessibilityInfo.setAccessibilityFocus: CLEAN. + XHRInterceptor / WebSocketInterceptor: CLEAN. + Android template (Kotlin/SDK/edgeToEdge/newArch/hermes): already at 0.85 level. + + Recommended sequencing: + PREP PRs (1) -> CORE PR (2) -> low-risk + major follow-ups (3), + with reanimated/mmkv/vision-camera waiting for 0.85.1. + + +================================================================================ +SECURITY CVEs (bundled inside RN 0.85 -- resolve automatically with RN bump) +================================================================================ + +These CVEs exist in transitive dependencies inside RN itself. They are NOT in the +repo's resolutions section and will resolve when RN is bumped to 0.85: + + fast-xml-parser 4.5.0 -> 4.5.4 CVE-2026-25896 + minimatch various CVE-2026-27903, CVE-2026-27904 + +No action required; noted here for audit trail. + + +================================================================================ +EXPO ALTERNATIVES -- MIGRATE INSTEAD OF BUMPING (where it's a clean win) +================================================================================ + +This repo is already Expo-based (SDK 54 -> 56). For several libs we'd otherwise +bump for new-arch, there is a first-party Expo module that is Fabric/TurboModule- +ready, removes a community dep (and sometimes a yarn patch), and is version-locked +to the SDK. Where the Expo module is a genuine equivalent we should MIGRATE rather +than bump. Where the Expo module is weaker/partial we should KEEP the RN lib. + +Legend: [MIGRATE] clean swap [EVALUATE] alt exists, trade-offs [KEEP] no good +Expo equiv / Expo weaker. "(in repo)" = Expo package already in package.json. + + +A) MIGRATE -- clean win, do these instead of bumping +------------------------------------------------------------------------------ + react-native-linear-gradient -> expo-linear-gradient [MIGRATE] + Already the plan (Fabric crash forces it). API differs: colors tuple, + start/end instead of angle/useAngle. Code changes at every usage site. + + react-native-inappbrowser-reborn -> expo-web-browser (in repo) [MIGRATE] + expo-web-browser is ALREADY installed and inappbrowser is ALREADY set to + `false` in resolutions -- finish the swap and drop the dep entirely. + openBrowserAsync / openAuthSessionAsync cover the existing usage. + + react-native-sensors (patched) -> expo-sensors (in repo) [MIGRATE] + expo-sensors is ALREADY installed. Migrating removes the + react-native-sensors-5.3.0 yarn patch (one less patch to regenerate on 0.85). + + react-native-fs -> expo-file-system (in repo) [MIGRATE] + expo-file-system is ALREADY installed. Doc already flags fs as legacy. + Migrate file IO and drop fs (also helps consolidate with blob-util below). + + react-native-vector-icons -> @expo/vector-icons [MIGRATE] + @expo/vector-icons wraps vector-icons with the same icon sets; SDK-locked + and font-asset handling is handled by Expo. Low-risk import swap. + + react-native-localize -> expo-localization [MIGRATE] + expo-localization gives locales/region/timezone. Pairs with the i18n + migration below; bumping localize is also fine but Expo consolidates. + + react-native-randombytes -> expo-crypto [MIGRATE] + Doc already calls randombytes largely redundant. expo-crypto + (getRandomBytes / getRandomBytesAsync) covers it; drop the dep. + + +B) EVALUATE -- Expo alt exists but has trade-offs (measure before deciding) +------------------------------------------------------------------------------ + react-native-i18n (patched) -> expo-localization + i18n-js [EVALUATE] + Already in the migrate-or-accept-risk list. expo-localization handles the + device-locale half; i18n-js handles translations. Removes a bridge-only + patch. Preferred long-term path over keeping the 2018 bridge module. + + react-native-device-info -> expo-device + expo-application + expo-constants [EVALUATE] + Expo splits device info across three modules. Covers most fields (model, + brand, OS, app version/build, unique id via expo-application). Audit every + getX() call site; a few fields (e.g. some battery/telephony) have no Expo + equivalent. If all used fields map, MIGRATE; else bump to ^15. + + react-native-video -> expo-video [EVALUATE] + expo-video is stable and Fabric-ready. Migration depends on how much of the + v6 API (DRM, custom controls, ads) is used. If usage is basic playback, + MIGRATE; otherwise bump v6 (already Fabric-ready). + + react-native-blob-util -> expo-file-system [EVALUATE] + SDK 52+ File/Directory API covers most reads/writes/downloads. blob-util's + streaming/multipart-fetch features have no 1:1 Expo equiv -- check usage + before committing. + + react-native-vision-camera -> expo-camera [EVALUATE] + expo-camera is Fabric-ready, but loses VisionCamera frame processors / + worklet-based scanning. If we only do capture + basic QR, expo-camera wins + (and avoids the v5 Nitro rewrite). If we use frame processors, KEEP v5. + + react-native-background-timer -> expo-task-manager / expo-background-task [EVALUATE] + Doc already flags background-timer as unmaintained. Expo equivalents are + the modern path but have a different (OS-scheduled) execution model -- not + a drop-in for a simple JS setInterval-style timer. + + react-native-share -> expo-sharing [EVALUATE] + expo-sharing only shares files/URIs via the OS sheet -- it does NOT support + sharing arbitrary text/message payloads or per-target social share. + MIGRATE only if usage is file-share; otherwise KEEP and bump react-native-share. + + @notifee + @react-native-firebase/messaging -> expo-notifications [EVALUATE] + Doc already suggests expo-notifications for notifee long-term. This is a + large push-infra change (token handling, channels, FCM config). Treat as a + separate initiative, NOT part of the 0.85 PR. + + react-native-get-random-values -> expo-crypto [EVALUATE] + expo-crypto can back a global.crypto.getRandomValues polyfill, but multiple + crypto libs depend on this specific global being installed early at startup. + Lower-risk to just bump to ^2.0 for the 0.85 PR; revisit Expo consolidation later. + + +C) KEEP -- no good Expo equivalent, or Expo module is weaker +------------------------------------------------------------------------------ + react-native-keychain KEEP, bump ^9 -> ^10 [KEEP] + expo-secure-store lacks keychain's granular biometric access-control + (accessControl / accessible flags). Security-critical -- keep keychain v10 + (TurboModule). NOTE: expo-local-authentication (in repo) already covers the + biometric prompt, but NOT secure storage ACLs. + + react-native-permissions KEEP, bump ^3.7 -> ^5 [KEEP] + expo-permissions is deprecated; Expo does per-module permissions, which + doesn't replace a centralized cross-permission library. Bump to v5. + + react-native-default-preference KEEP (migrate to mmkv/AsyncStorage) [KEEP] + No Expo equivalent. Doc's plan (react-native-mmkv, already in repo) stands. + + react-native-aes-crypto KEEP [KEEP] + expo-crypto only does hashing/random, NOT symmetric AES encrypt/decrypt. + Not a replacement -- keep and verify interop on 0.85. + + react-native-quick-crypto / quick-base64 / ble-plx / view-shot / + @react-native-community/datetimepicker / slider / masked-view / + pager-view KEEP [KEEP] + No first-party Expo equivalent (or already Fabric-ready). Bump/verify as in + the native-module audit above. + + +NET EFFECT IF WE TAKE THE [MIGRATE] SET +------------------------------------------------------------------------------ + Deps removed: react-native-inappbrowser-reborn, react-native-sensors, + react-native-fs, react-native-randombytes, react-native-localize, + react-native-vector-icons, react-native-linear-gradient + Patches dropped: react-native-sensors patch (and any fs/inappbrowser-related) + Expo deps to ADD: expo-linear-gradient, expo-localization, @expo/vector-icons, + expo-crypto (expo-web-browser / expo-file-system / expo-sensors + already present) + => Fewer community native deps to validate on new-arch, fewer yarn patches to + regenerate, all SDK-56 version-locked. Each migration is still its own PR. diff --git a/ios/Gemfile b/ios/Gemfile index 456952fe5af..c239327d86c 100644 --- a/ios/Gemfile +++ b/ios/Gemfile @@ -17,3 +17,4 @@ gem 'bigdecimal' gem 'logger' gem 'benchmark' gem 'mutex_m' +gem 'nkf' diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock index 7d1081ee16e..e42f4faad7a 100644 --- a/ios/Gemfile.lock +++ b/ios/Gemfile.lock @@ -305,6 +305,7 @@ DEPENDENCIES fastlane (>= 2.220.0) logger mutex_m + nkf RUBY VERSION ruby 3.2.9 diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index fabbe97f770..19183063dd6 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1041,10 +1041,12 @@ PRODUCT_NAME = MetaMask; PROVISIONING_PROFILE_SPECIFIER = "development-metamask"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "development-metamask"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SWIFT_OBJC_BRIDGING_HEADER = "MetaMask-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_PRECOMPILE_BRIDGING_HEADER = NO; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -1107,9 +1109,11 @@ PRODUCT_NAME = MetaMask; PROVISIONING_PROFILE_SPECIFIER = "Bitrise AppStore io.metamask.MetaMask"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Bitrise AppStore io.metamask.MetaMask"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SWIFT_OBJC_BRIDGING_HEADER = "MetaMask-Bridging-Header.h"; SWIFT_PRECOMPILE_BRIDGING_HEADER = NO; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; diff --git a/ios/MetaMask/Info.plist b/ios/MetaMask/Info.plist index 70ffd460ed4..bb5729bad1e 100644 --- a/ios/MetaMask/Info.plist +++ b/ios/MetaMask/Info.plist @@ -124,8 +124,13 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown UIViewControllerBasedStatusBarAppearance diff --git a/jest.config.js b/jest.config.js index 31ed38658da..8c001bfa2f6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -31,7 +31,7 @@ process.env.MM_CARD_BAANX_API_CLIENT_KEY = 'test-api-key'; const isReassureRun = process.env.REASSURE === 'true'; const config = { - preset: 'react-native', + preset: '@react-native/jest-preset', setupFilesAfterEnv: ['/app/util/test/testSetup.js'], testEnvironment: 'jest-environment-node', transformIgnorePatterns: [ diff --git a/package.json b/package.json index 23a427cb324..d172b7ebf59 100644 --- a/package.json +++ b/package.json @@ -368,9 +368,9 @@ "@react-native-async-storage/async-storage": "2.2.0", "@react-native-clipboard/clipboard": "^1.16.1", "@react-native-community/checkbox": "^0.5.20", - "@react-native-community/cli": "20.0.0", - "@react-native-community/cli-platform-android": "20.0.0", - "@react-native-community/cli-platform-ios": "20.0.0", + "@react-native-community/cli": "20.1.0", + "@react-native-community/cli-platform-android": "20.1.0", + "@react-native-community/cli-platform-ios": "20.1.0", "@react-native-community/cli-server-api": "^17.0.0", "@react-native-community/datetimepicker": "^8.5.1", "@react-native-community/netinfo": "11.5.2", @@ -379,9 +379,10 @@ "@react-native-firebase/app": "^20.5.0", "@react-native-firebase/messaging": "^20.5.0", "@react-native-masked-view/masked-view": "^0.3.1", - "@react-native/babel-preset": "0.83.0", - "@react-native/eslint-config": "0.83.0", - "@react-native/typescript-config": "0.83.0", + "@react-native/babel-preset": "0.85.0", + "@react-native/eslint-config": "0.85.0", + "@react-native/jest-preset": "0.85.0", + "@react-native/typescript-config": "0.85.0", "@react-navigation/bottom-tabs": "^6.5.0", "@react-navigation/native": "^6.1.0", "@react-navigation/native-stack": "^6.0.0", @@ -473,8 +474,8 @@ "qs": "6.15.2", "query-string": "^6.12.1", "randomfill": "^1.0.4", - "react": "19.2.0", - "react-native": "patch:react-native@npm%3A0.83.6#~/.yarn/patches/react-native-npm-0.83.6-106e10c49d.patch", + "react": "19.2.3", + "react-native": "0.85.0", "react-native-aes-crypto": "3.0.3", "react-native-aes-crypto-forked": "patch:react-native-aes-crypto-forked@https%3A//github.com/MetaMask/react-native-aes-crypto-forked.git%23397d5db5250e8e7408294807965b5b9fd4ca6a25#~/.yarn/patches/react-native-aes-crypto-forked-https-9ebec3d485.patch", "react-native-animatable": "^1.3.3", @@ -596,7 +597,7 @@ "@open-rpc/schema-utils-js": "^1.16.2", "@open-rpc/test-coverage": "^2.2.2", "@playwright/test": "^1.57.0", - "@react-native/metro-config": "0.83.0", + "@react-native/metro-config": "0.85.0", "@storybook/addon-controls": "^7.5.1", "@storybook/addon-ondevice-controls": "^6.5.6", "@storybook/builder-webpack5": "^7.5.1", @@ -703,7 +704,7 @@ "react-native-svg-asset-plugin": "^0.5.0", "react-native-svg-transformer": "^1.0.0", "react-native-tcp-socket": "^6.3.0", - "react-test-renderer": "19.2.0", + "react-test-renderer": "19.2.3", "reassure": "^1.4.0", "redux-devtools-expo-dev-plugin": "^1.0.0", "redux-saga-test-plan": "^4.0.6", diff --git a/rn-0.85-upgrade-compact.txt b/rn-0.85-upgrade-compact.txt new file mode 100644 index 00000000000..74db82aaff5 --- /dev/null +++ b/rn-0.85-upgrade-compact.txt @@ -0,0 +1,181 @@ +RN 0.85 UPGRADE SPIKE (COMPACT) +Baseline: RN 0.83.6 + Expo SDK 55 (unmerged 0.83 branch) | Target: RN 0.85.3 + Expo SDK 56 +All versions verified on npm 2026-07-06. RN 0.86 / SDK 57 exist; we target one line behind the latest for stability. + +STRATEGY +Land every risky library bump as its own green PR on 0.83 first. The final upgrade PR then only touches what peer-requires RN 0.85. If something breaks on 0.83, you debug one library, not the whole upgrade. Wherever an Expo module can replace a third-party native lib, switch instead of bumping: Expo modules are version-guaranteed per SDK, so every switch permanently removes one library from all future upgrade checklists. + +RN 0.85 BREAKING CHANGES +- Jest preset 'react-native' removed, use '@react-native/jest-preset' (new devDep) +- StyleSheet.absoluteFillObject removed, replace with absoluteFill (28 files) +- Node >= 20.19.4 (we use 24, fine); Metro bumps via @react-native/metro-config + +EXPO ALTERNATIVES: SWITCH INSTEAD OF BUMP (all have SDK 55 versions, land pre-upgrade) +- react-native-fs (dead since 2022, 6 files): expo-file-system, already installed +- react-native-get-random-values (1 import in shim.js): expo-crypto 55.0.16 +- react-native-in-app-review (1 file): expo-store-review 55.0.15 +- react-native-video (3 files): expo-video 55.0.18; also removes the v6 bridgeless-crash risk on 0.85 +- react-native-localize (3 files): expo-localization 55.0.16 +- react-native-linear-gradient (42 files, near drop-in props): expo-linear-gradient 55.0.15; removes the 2.8.3-compile risk on 0.85 (2.x is dead, only 3.0-beta exists) +- react-native-inappbrowser-reborn (16 files): expo-web-browser, already installed and in use; dedupes two browser libs. OPTIONAL, can defer post-upgrade +- react-native-vector-icons (51 files, root pkg npm-deprecated): @expo/vector-icons 15.1.1 (SDK-managed, no font linking) OR scoped @react-native-vector-icons/* 13.x; decide in PR 6 + +EXPO ALTERNATIVE EXISTS BUT BUMP IS SAFER (not equivalent, revisit later) +- clipboard: expo-clipboard exists, API differs, 22 files; bump to 1.16.3 +- netinfo: expo-network exists, listener parity gaps, 15 files; bump to 12.0.1 +- async-storage: expo-sqlite/kv-store is a drop-in, but async-storage v3 is active; bump to 3.1.1 +- keychain: expo-secure-store has a 2KB value limit, unsuitable for vault; bump to 10.0.0 +- share: expo-sharing is files-only, no message/social options; bump to 12.3.1 +- device-info: expo-device + expo-application cover a subset, 87 files; bump to 15.0.2 +- vision-camera: expo-camera scans QR but worse perf/features; bump to 5.1.0 (Nitro PR) +- permissions: Expo handles permissions per-module, architecture change; bump to 5.6.0 + +NO EXPO EQUIVALENT +- background-timer (dead since 2020, 12 files): bump 2.1.1 to 2.4.1 + audit call sites +- default-preference (dead, 4 files): replace with react-native-mmkv (already in project) +- @react-native-cookies/cookies (npm-deprecated, 6 files): replace with @preeternal/react-native-cookie-manager 6.3.3, active API-compatible fork +- ble-plx, mmkv, quick-crypto, keyboard-controller, view-shot, datetimepicker, branch, notifee, rive, masked-view, checkbox: bump (see PRs below) + +PR PLAN: 6 PRs BEFORE THE UPGRADE + +PR 1 - Code fix + safe bumps (risk: LOW) +- absoluteFillObject to absoluteFill codemod (28 files) +- reanimated 4.2.1 to 4.5.1 + ADD react-native-worklets 0.10.1 (required peer, missing from package.json!) + babel.config.js: swap last plugin to 'react-native-worklets/plugin' +- gesture-handler 2.30 to 2.32.0 (stay on v2; v3 is a post-upgrade decision) +- safe-area-context 5.8.0, svg 15.15.5 (+ DELETE patches/react-native-svg+15.11.2.patch — content-type guard and " fix both upstreamed into 15.15.x), lottie 7.3.8, flash-list 2.3.2, walletconnect/core 2.23.10, clipboard 1.16.3, slider 5.2.0, keyboard-controller 1.21.14, detox 20.51.4, branch 6.10.0, rive 9.8.3, notifee 9.1.8, masked-view 0.3.2, aes-crypto 3.3.0 (maintained after all, latest Feb 2026), inappbrowser-reborn 3.7.1 +- Keep as-is, verified safe: svg-charts 5.4.0 and render-html 6.3.4 (abandoned but pure JS, render via react-native-svg, cannot break the native build; plan replacement epic separately), react-native-modal 14.0.0-rc.1 (rc.1 IS the latest release), sovran 1.1.3, segment analytics 2.23.0 (keep patch), qrcode-svg 6.3.21, react 19.2 + +PR 2 - Switch to Expo modules + drop abandoned libs (risk: LOW-MED) +- react-native-fs to expo-file-system (readFile to readAsStringAsync etc.; update jest mocks in testSetup) +- react-native-get-random-values to expo-crypto (verify crypto.getRandomValues at boot, wallet-critical) +- react-native-in-app-review to expo-store-review (1 file) +- react-native-video to expo-video (3 files; VideoView + useVideoPlayer API) +- react-native-localize to expo-localization (3 files) +- react-native-linear-gradient to expo-linear-gradient (42-file import codemod, props near-identical) +- cookies to @preeternal/react-native-cookie-manager 6.3.3 (same CookieManager API, re-point 6 imports) +- default-preference to mmkv (4 files; audit for native-side reads first) +- background-timer 2.1.1 to 2.4.1 + document per-call-site replacement plan (fallback if it fails to compile on 0.85) +Test: onboarding SRP, dapp login persistence, session lock timer, video playback, gradient visual pass, store-review prompt. + +PR 3 - Nitro Modules ecosystem (risk: HIGH, shared peer deps, one PR) +- nitro-modules 0.35.5 to 0.36.1, quick-base64 2.2.0 to 3.0.0 (patch drops), quick-crypto 0.7.15 to 1.1.5 (patch rewrite), mmkv 3.2 to 4.3.2, vision-camera 4.7.3 to 5.1.0 + ADD nitro-image 0.15.1 (useCameraDevice signature changed, audit Camera usages) +Test: vault encrypt/decrypt round-trip, QR scan, mmkv data survives upgrade from prod build. + +PR 4 - Firebase 20.5 to 25.1 (risk: HIGH, isolated on purpose) +- @react-native-firebase/app + /messaging to 25.1.0 (Firebase iOS SDK 12.x / Android BoM 33.x; check google-services files, Gradle plugin, Xcode 16+) +Test: push notifications end-to-end, both platforms. + +PR 5 - Patched vendors: Sentry + Braze (risk: HIGH, both patches need rework) +- @sentry/react-native 7.11 to 8.17.2 (init API changed; align @sentry/browser/core/react devDeps) +- @braze/react-native-sdk 19.1 to 22.0.0 (v21+ validated on RN 0.85; check if ReactModuleInfo patch still needed) +Test: crashes reach Sentry, Braze campaigns render. + +PR 6 - Native majors batch (risk: MED, all peer RN "*") +- permissions 3.7 to 5.6.0 (constants changed 4.x/5.x, only 4 files) | netinfo 11.5 to 12.0.1 (NEARBY_WIFI_DEVICES on Android 13+ if WiFi info read) +- async-storage 2.2 to 3.1.1 (SQLite backend) | keychain 9 to 10.0.0 (vault-critical: test biometrics + password fallback) +- device-info 9 to 15.0.2 (87 files, API additive) | share 7.3 to 12.3.1 (Share.open schema changed, 17 files) +- blob-util 0.24.10 (+ resolutions entry) | ble-plx 3.5.1 (verify patch; Ledger test) | view-shot 5.1.1 | datetimepicker 9.1.0 +- vector-icons 10.2: prefer @expo/vector-icons 15.1.1 (SDK-managed, no font linking config), fallback scoped @react-native-vector-icons/* 13.x; 51-file import codemod either way +Test: login/biometrics, share sheet, Ledger pairing, icon visual pass. + +UPGRADE PR - only what peer-requires RN 0.85 +- react-native 0.83.6 to 0.85.3; @react-native/{babel-preset,metro-config,eslint-config,typescript-config} to 0.85.3 +- metro-react-native-babel-preset/-transformer: REMOVED (metro.transform.js now uses @react-native/metro-babel-transformer; bump it 0.83.0 to 0.85.3 here). This also fixed hot reload: the old 0.76 transformer injected react-refresh 0.4 while the RN 0.83 runtime expects 0.14. +- Jest: add @react-native/jest-preset 0.85.3; all configs preset to '@react-native/jest-preset' +- Expo SDK 56 (sdk-56 dist-tags): expo 56.0.14, apple-authentication 56.0.4, asset 56.0.18, auth-session 56.0.15, build-properties 56.0.21, crypto 56.0.4, dev-client 56.0.22, file-system 56.0.8, font 56.0.7, haptics 56.0.3, image 56.0.11, linear-gradient 56.0.4, local-authentication 56.0.4, localization 56.0.6, screen-orientation 56.0.5, sensors 56.0.6, splash-screen 56.0.12, store-review 56.0.3, updates 56.0.21, video 56.1.4, web-browser 56.0.5, @expo/fingerprint 0.19.6 +- react-native-screens 4.23 to 4.25.2 (the hard blocker, expo-router SDK 56 requires it), pager-view to 8.0.3 + +PR HIERARCHY AND ORDER (19 PRs in 5 waves, PRs within a wave can run in parallel) + +Wave 1 - Enablers, start immediately (no dependencies, low risk) + PR 1 - absoluteFillObject codemod, 28 files (risk: NONE, one PR). Zero-risk, unblocks nothing but removes a hard 0.85 breaker. + PR 2 - Safe chore bumps, ~15 libs (risk: LOW, one batch PR, trivial to revert per-line). + PR 3 - background-timer bump 2.4.1 + call-site audit, 12 files (risk: MED, own PR). First because its audit produces the fallback plan the upgrade PR depends on. + PR 4 - react-native-fs to expo-file-system, 6 files (risk: LOW, own small PR). + +Wave 2 - Expo switches + wallet-critical polyfill (independent migrations) + PR 5 - Animation stack: reanimated 4.5.1 + worklets NEW + gesture-handler 2.32 + babel plugin swap (risk: LOW, shared peer deps, one PR). + PR 6 - Small Expo switches: video + localize + in-app-review, 7 files (risk: LOW, one PR). + PR 7 - cookies to @preeternal fork + default-preference to mmkv (risk: LOW-MED, one PR). + PR 8 - react-native-get-random-values to expo-crypto (risk: MED, wallet-critical SRP path, own PR). Early so it soaks through a full release cycle before the upgrade. + +Wave 3 - High-risk isolates (early as possible for maximum soak time in beta builds; each own PR so reverts are surgical) + PR 9 - Nitro Modules ecosystem: nitro-modules + quick-base64 + quick-crypto + mmkv + vision-camera (risk: HIGH, shared peer deps, MUST be one PR). + PR 10 - Firebase 20.5 to 25.1 (risk: HIGH, isolated on purpose, one PR). + PR 11 - Sentry 7 to 8.17.2 + patch rework (risk: HIGH, own PR). + PR 12 - Braze 19 to 22 + patch rework (risk: HIGH, own PR). + PR 13 - keychain 9 to 10 (risk: HIGH, vault/biometrics-critical, own PR). + +Wave 4 - Remaining native majors + PR 14 - permissions 5.6 + netinfo 12 (risk: MED, permission surface together, one PR). + PR 15 - async-storage 2 to 3 (risk: MED, storage backend change, own PR). + PR 16 - Native utils batch: device-info 15 + share 12 + view-shot 5 + datetimepicker 9 + blob-util + ble-plx (risk: MED, one PR). + +Wave 5 - Wide codemods, land last-minute (they conflict with all ongoing feature work; merge fast, right before the upgrade) + PR 17 - linear-gradient to expo-linear-gradient, 42-file codemod (risk: LOW but wide, own PR). + PR 18 - vector-icons to @expo/vector-icons, 51-file codemod (risk: MED, mechanical but wide, own PR). + +Final + PR 19 - UPGRADE: RN 0.85.3 + @react-native/* + Expo SDK 56 + screens 4.25.2 + pager-view + jest preset (risk: HIGH, versions interlocked, MUST be one PR). Requires PRs 1-18 merged. + +Ordering logic: enablers and audits first (wave 1), wallet-critical and high-risk changes as early as possible so they soak in beta/nightly builds for weeks before upgrade day (waves 2-3), mechanical wide codemods last to minimize merge-conflict windows with feature teams (wave 5). +Split logic: shared peer deps (Nitro, animation stack) and interlocked versions (upgrade PR) must ship together. Wallet-critical paths (crypto polyfill, keychain) and patch rewrites (Sentry, Braze) are isolated so a revert is surgical. Wide codemods get own PRs for reviewability. +To reduce to 15 PRs: merge PR 4+6+7 into one Expo-switches PR and PR 14 into PR 16, with no loss of risk isolation. + +UPGRADE-DAY CHECKLIST (fallbacks pre-decided) +[ ] background-timer 2.4.1 compiles, else execute PR 2 audit plan +[ ] checkbox 0.5.20 compiles, else design-system Checkbox (4 files) +[ ] Patches: drop @expo-cli SDK-55 patch; drop react-native-svg+15.11.2.patch (fixes upstreamed into 15.15.x, confirmed 2026-07-07); re-check expo-web-browser, segment, scrollable-tab-view patches +[ ] jest transformIgnorePatterns still resolve after preset swap + +ALIGN-DEPS REPORT (run: yarn dlx @rnx-kit/align-deps --requirements react-native@0.85, 2026-07-07) +22 violations reported. Breakdown: + + REAL VERSION GAPS (all already covered in PR plan): + - react-native-gesture-handler ~2.30.0 → ^2.31.1 (PR 1/Wave 2 bumps to 2.32.0 ✓) + - react-native-reanimated 4.2.1 → ^4.4.0 (PR 1/Wave 2 bumps to 4.5.1 ✓) + - react-native-screens ~4.23.0 → ^4.25.0 (Upgrade PR bumps to 4.25.2 ✓) + - @react-native-community/netinfo 11.5.2 → ^12.0.1 (PR 14/Wave 4 bumps to 12.0.1 ✓) + - react-dom 19.2.0 → ^19.2.3 (patch bump only; add to PR 1 safe-bumps batch) + + COSMETIC ONLY — range specifier vs exact pin, no actual version change needed: + - react-native, @react-native/babel-preset, @react-native/metro-config, @react-native-community/cli + cli-platform-*, + @react-native-async-storage/async-storage, react-native-safe-area-context, react-native-svg (all: "X.Y.Z" → "^X.Y.Z") + + WE ARE ALREADY NEWER — align-deps profile is behind: + - @react-native-clipboard/clipboard ^1.16.1 (expected ^1.16.0) + - @react-native-community/datetimepicker ^8.5.1 (expected ^8.4.4) + - @react-native-masked-view/masked-view ^0.3.1 (expected ^0.3.0) + - react-native-modal ^14.0.0-rc.1 (expected ^13.0.0; rc.1 IS the latest release) + - react-native-fs ^2.20.0 (expected ^2.18.0; switching to expo-file-system anyway) + - react-native-render-html ^6.3.4 (expected ^6.1.0; pure JS, no native impact) + - jest ^29.7.0 (expected ^29.2.1) + + DEFERRED — not required for RN 0.85: + - @react-navigation/native ^6.1.0 → ^7.1.14: align-deps recommends v7 because it is the latest stable. + v6 peer dep is react-native >= 0.66.0; v6 WORKS on RN 0.85. Upgrading all three nav packages + (native + native-stack + bottom-tabs) is a separate, significant effort unrelated to this upgrade. + Defer to a post-upgrade epic. + + WARNING (already in upgrade PR): + - metro-react-native-babel-preset renamed to @react-native/babel-preset since RN 0.73; removal already + scheduled in Upgrade PR. + + NET ACTION: add react-dom 19.2.0 → 19.2.3 to PR 1 safe-bumps. All other real gaps already in plan. + +SUMMARY +PR 1 code fix + safe bumps (LOW), PR 2 Expo switches + drop abandoned libs (LOW-MED), PR 3 Nitro (HIGH), PR 4 Firebase (HIGH), PR 5 Sentry+Braze (HIGH), PR 6 native majors (MED), then UPGRADE PR (RN 0.85.3 + Expo 56 + screens + jest preset). +Expo switches remove 6 third-party native libs for good: fs, get-random-values, in-app-review, video, localize, linear-gradient (+ optionally inappbrowser-reborn and vector-icons via @expo/vector-icons). +Excluded on purpose: @tanstack/react-query 4 to 5 (unrelated to RN; separate effort). +Excluded on purpose: @react-navigation v6 → v7 (not required for RN 0.85; separate post-upgrade epic). + +SPIKE BRANCH CI FINDINGS (feat/rn-0.85, observed 2026-07-07) +The spike branch does a raw RN 0.85 bump without the PR ladder. CI job "Build iOS E2E Apps" fails at +"Setup project dependencies with retry" (yarn setup:github-ci --build-ios --no-build-android), all 3 +attempts, exit code 1. Root cause: yarn patch-package --error-on-fail aborts because +patches/react-native-svg+15.11.2.patch targets 15.11.2 but the installed package is 15.15.3. +Fix: delete the patch file (fixes are upstream). Secondary blockers that surface after the patch fix: +- react-native-screens 4.23.0 has no RN 0.85 native support → pod install / Xcode build fails (covered by Upgrade PR) +- react-native-reanimated 4.2.1 peer dep does not cover RN 0.85 (covered by PR 1/Wave 2) +- react-native-gesture-handler 2.30 same (covered by PR 1/Wave 2) +CI runner: ghcr.io/cirruslabs/macos-runner:tahoe-xl, Xcode 26.3 (build 17C529). diff --git a/rn-0.85-upgrade-plan.txt b/rn-0.85-upgrade-plan.txt new file mode 100644 index 00000000000..4519a468662 --- /dev/null +++ b/rn-0.85-upgrade-plan.txt @@ -0,0 +1,403 @@ +RN 0.85 UPGRADE PLAN — FINAL +============================ +Baseline : RN 0.83.6 + Expo SDK 55 +Target : RN 0.85.3 + Expo SDK 56 + +NOTE: RN 0.86.0 and Expo SDK 57 are already published. This plan intentionally +targets one line behind latest (RN 0.85.3 / Expo 56) for stability. + +ALL VERSIONS RE-VERIFIED AGAINST THE NPM REGISTRY ON 2026-07-06. +All usage-site counts below come from grepping this codebase (files, not lines). + +STRATEGY + 1. For every library, first check if an Expo SDK module can replace it. + Expo modules are version-guaranteed per SDK — every switch permanently + removes one third-party native lib from future upgrade checklists. + 2. If no Expo alternative: bump to a verified RN-0.85-compatible version + BEFORE the upgrade, on the 0.83 codebase, in its own PR. + 3. The final UPGRADE PR only touches what peer-requires RN 0.85 + (react-native itself, @react-native/* tooling, Expo SDK 56, screens). + +Legend + [EXPO] remove third-party lib, replace with Expo-managed module + [BUMP] keep same library, change version + [REPLACE] remove lib, swap for a different maintained library + [CODE] source-only change, no package version change + [KEEP] no action needed, verified safe + +================================================================================ +PART 1 — EXPO-ALTERNATIVE AUDIT (decision per library) +================================================================================ +Every third-party native lib was checked for an Expo SDK 55/56 equivalent. + + react-native-fs → SWITCH to expo-file-system [EXPO] + Abandoned (last publish 2022-05). expo-file-system already installed. + Only 6 usage files. → PRE-2 + + react-native-get-random-values → SWITCH to expo-crypto [EXPO] + Used only as a polyfill import in shim.js. expo-crypto provides + getRandomValues. (Fallback: lib itself released 2.0.0 on 2025-10, + peer RN >=0.81, so a bump also works — but the Expo switch removes + a native dep entirely.) → PRE-2 + + react-native-background-timer → NO Expo equivalent [BUMP+AUDIT] + ABANDONED confirmed (last publish 2020-10-01). 12 usage files. + expo-background-fetch/task-manager solve a different problem + (OS-scheduled background work, not JS timers that survive backgrounding). + Plan: bump 2.1.1 → 2.4.1 (latest) now, audit the 12 call sites, and + schedule a longer-term replacement. If 2.4.1 fails to compile on 0.85 + on upgrade day, this becomes a hard blocker → prioritize audit. → PRE-4 + + react-native-default-preference → REPLACE with react-native-mmkv [REPLACE] + Effectively abandoned (1.4.4, 2022-04). Only 4 usage files. + SharedPreferences/NSUserDefaults reads map directly to MMKV get/set. + mmkv is already in the project (and upgraded in PRE-5). → PRE-4 + + @react-native-cookies/cookies → REPLACE with fork [REPLACE] + Officially DEPRECATED on npm (archived 2026-01-31). 6 usage files. + Replacement: @preeternal/react-native-cookie-manager 6.3.3 + (active fork, last publish 2026-06-17, API-compatible). → PRE-3 + + Everything else either has no Expo equivalent (wallet/BLE/camera/etc.) + or is already an Expo module. See per-PR sections for bump targets. + +================================================================================ +PART 2 — RESOLVED INVESTIGATIONS (previously open questions, now verdicts) +================================================================================ + + react-native-svg-charts ^5.4.0 [KEEP] + Abandoned (last publish 2020-04) BUT pure JS — renders through + react-native-svg, no native code, so RN 0.85 cannot break its build. + 19 usage files (PriceChart, Stake, Earn, Predict, SocialLeaderboard). + Verdict: no pre-upgrade action. Schedule a separate longer-term + replacement epic (d3-shape + react-native-svg direct, or wagmi-charts). + + react-native-render-html ^6.3.4 [KEEP] + Abandoned (2022-01) but pure JS. Exactly 1 usage file + (Notifications/AnnouncementDescriptionField). Verdict: keep for the + upgrade; replace with a small custom renderer whenever convenient. + + react-native-modal ^14.0.0-rc.1 [KEEP] + 14.0.0-rc.1 IS the newest release (2025-03, peer RN >=0.70). JS-only. + 23 usage files. No action. + + react-native-aes-crypto 3.0.3 → 3.3.0 [BUMP] + MAINTAINED after all — 3.3.0 published 2026-02-02. 1 usage file + (app/core/Encryptor/lib/aes-native.ts). Simple bump. → PRE-11 + + react-native-linear-gradient ^2.8.3 [KEEP] + 2.8.3 is the last stable; 3.0.0-beta.2 (2026-02-11) is newest publish. + 42 usage files. Verdict: keep 2.8.3, test on upgrade day; adopt + 3.0.0-beta only if the 2.x native build fails on 0.85. + + react-native-video ^6.19.0 → 6.19.2 [BUMP] + 6.19.2 (2026-04-28) is latest stable and contains the RN 0.84 + bridgeless crash fix. 3 usage files. v7.0.0-beta.10 exists as + fallback if 6.x breaks on 0.85. → PRE-11 + + @react-native-community/checkbox ^0.5.20 [KEEP] + 0.5.20 (2025-05-14) is latest, peer RN >=0.62. 4 usage files. + Verify native compile on upgrade day; replace with design-system + Checkbox if it fails. + + @react-native-masked-view/masked-view 0.3.1 → 0.3.2 [BUMP] + 0.3.2 (2024-11) is latest. 16 usage files, patch-level bump. → PRE-11 + + @notifee/react-native 9.0.0 → 9.1.8 [BUMP] + 9.1.8 (2024-12-20) is latest, peer RN "*". Maintenance has slowed — + watch this library for future upgrades. → PRE-11 + + rive-react-native 9.8.0 → 9.8.3 [BUMP] + 9.8.3 (2026-04-23), actively maintained. → PRE-11 + + react-native-branch ^5.6.2 → 6.10.0 [BUMP] + 6.10.0 (2026-05-15) is latest stable; 7.0.0-beta.2 exists — stay on 6. + → PRE-11 + + react-native-in-app-review 4.3.3 → 4.4.2 [BUMP] + 4.4.2 (2025-09-03), maintained. → PRE-11 + + react-native-inappbrowser-reborn 3.7.0 → 3.7.1 [BUMP] + 3.7.1 (2026-03-16), maintained. → PRE-11 + + @segment/sovran-react-native ^1.1.3 [KEEP] + 1.1.3 is latest on npm. No action. + + @segment/analytics-react-native 2.23.0 (patched) [KEEP] + 2.23.0 is latest on npm (2026-04-29). Keep the patch; re-validate it + applies on upgrade day. + +================================================================================ +PART 3 — PR-BY-PR PLAN (all PRE-* PRs land on the 0.83 codebase) +================================================================================ + +PRE-1 — Code fix: StyleSheet.absoluteFillObject → absoluteFill [CODE] +──────────────────────────────────────────────────────────────────────────────── + RN 0.85 removes absoluteFillObject. 28 files currently use it. + Both forms work on 0.83, so this is a zero-risk, mechanical PR. + Command: rg -l "absoluteFillObject" app/ + Risk: NONE. Test: lint + unit tests. + +PRE-2 — Expo switches: file-system + crypto polyfill [EXPO] +──────────────────────────────────────────────────────────────────────────────── + react-native-fs ^2.20.0 → REMOVE + Replace with expo-file-system (~55.x already installed). + 6 usage files: app/util/logs/index.ts (+test), ProfilerManager.tsx + (+test), app/util/test/testSetup.js, testSetupView.js. + API mapping: readFile → readAsStringAsync, writeFile → writeAsStringAsync, + exists → getInfoAsync(...).exists. Update jest mocks in the two + testSetup files. Also check redux-persist-filesystem-storage — it + depends on react-native-blob-util (not rn-fs), so it is unaffected. + + react-native-get-random-values ^1.8.0 → REMOVE + Add expo-crypto (~55.0.16 on SDK 55; bumps to 56.0.4 in UPGRADE PR). + Swap the polyfill import in shim.js for expo-crypto's getRandomValues + global install. Verify crypto.getRandomValues works in Hermes at boot + (wallet-critical path — SRP generation). + Risk: LOW-MEDIUM (crypto path needs careful smoke testing). + Test: onboarding (new SRP), logs export, profiler traces. + +PRE-3 — Replace deprecated cookies library [REPLACE] +──────────────────────────────────────────────────────────────────────────────── + @react-native-cookies/cookies ^6.2.1 → @preeternal/react-native-cookie-manager 6.3.3 + Upstream archived + npm-deprecated. Fork is API-compatible (same + CookieManager surface) and actively published (2026-06-17). + 6 usage files to re-point imports. + Risk: LOW (drop-in). Test: in-app browser sessions, dapp logins persist. + +PRE-4 — Retire abandoned key-value + timer libs [REPLACE] +──────────────────────────────────────────────────────────────────────────────── + react-native-default-preference ^1.4.3 → REMOVE, use react-native-mmkv + 4 usage files. Map get/set calls to an MMKV instance. If values are + read natively (widgets/extensions), keep writes mirrored — audit first. + + react-native-background-timer 2.1.1 → 2.4.1 (+ usage audit) + Bump to latest (still old — lib abandoned since 2020). Audit all 12 + usage files and document which ones actually need background-surviving + timers vs plain setInterval. Produces the replacement decision so the + upgrade PR is not blocked if 2.4.1 fails to compile on 0.85. + Risk: MEDIUM. Test: settings persistence, session timeout / lock timer. + +PRE-5 — Nitro Modules ecosystem (one PR — shared peer deps) [BUMP] +──────────────────────────────────────────────────────────────────────────────── + react-native-nitro-modules 0.35.5 → 0.36.1 (base, first) + react-native-quick-base64 2.2.0 → 3.0.0 (peer of quick-crypto 1.x; + existing patch drops — verify) + react-native-quick-crypto 0.7.15 → 1.1.5 (JSI → Nitro; existing patch + must be rewritten or dropped) + react-native-mmkv ^3.2.0 → 4.3.2 (JSI → Nitro; JS API unchanged, + verify constructor options) + react-native-vision-camera ^4.7.3 → 5.1.0 (Nitro; ADD new dep + react-native-nitro-image 0.15.1; + useCameraDevice signature changed — + audit all usages) + Risk: HIGH (crypto + storage + camera in one PR, two patches to rework). + Test: vault decrypt/encrypt round-trip, QR scan, mmkv migration on upgrade + from a production build. + +PRE-6 — Firebase (isolated — highest integration risk) [BUMP] +──────────────────────────────────────────────────────────────────────────────── + @react-native-firebase/app ^20.5.0 → 25.1.0 + @react-native-firebase/messaging ^20.5.0 → 25.1.0 + 5 majors. Bundles Firebase iOS SDK 12.x / Android BoM 33.x. + Check: google-services.json + GoogleService-Info.plist compatibility, + Google Services Gradle plugin version, Xcode 16+ requirement. + Risk: HIGH. Test: push notifications end-to-end on both platforms. + +PRE-7 — Sentry + Braze (both patched — rework together) [BUMP] +──────────────────────────────────────────────────────────────────────────────── + @sentry/react-native ~7.11.0 (patched) → 8.17.2 + Sentry.init() options shape changed in 8.x. Rewrite or drop the patch. + Also align devDeps @sentry/browser, @sentry/core, @sentry/react (~8.54.0 + today — check the 8.17.2 RN SDK's required JS-SDK version and match it). + @braze/react-native-sdk 19.1.0 (patched) → 22.0.0 + v21 was first to validate against RN 0.85; 22.0.0 (2026-06-29) is latest. + Existing ReactModuleInfo patch — verify if 22.x still needs it. + Risk: HIGH (two patch reworks). Test: crash reporting arrives in Sentry, + Braze campaigns/IAMs render. + +PRE-8 — Permission surface: permissions + netinfo [BUMP] +──────────────────────────────────────────────────────────────────────────────── + react-native-permissions ^3.7.2 → 5.6.0 + 2 majors; permission constants changed across 4.x/5.x. Only 4 usage + files — audit each PERMISSIONS.* / requestMultiple() call. + @react-native-community/netinfo 11.5.2 → 12.0.1 + v12: Android WiFi info now needs NEARBY_WIFI_DEVICES on Android 13+. + Update manifest/app.json only if WiFi details are read. + Risk: MEDIUM. Test: camera permission flow (QR), offline banner. + +PRE-9 — Vector icons scoped-package migration [REPLACE] +──────────────────────────────────────────────────────────────────────────────── + react-native-vector-icons 10.2.0 → REMOVE (npm-DEPRECATED at 10.3.0) + Add per-icon-set scoped packages (independently versioned): + @react-native-vector-icons/common 13.0.1 + @react-native-vector-icons/ latest 13.x + Import codemod across 51 usage files: + BEFORE: import Icon from 'react-native-vector-icons/MaterialIcons' + AFTER: import MaterialIcons from '@react-native-vector-icons/material-icons' + Also update fonts linking config (react-native.config.js / Info.plist / + build.gradle font assets) per the new packages' docs. + Risk: MEDIUM (large but mechanical). Test: visual pass over icon-heavy + screens, both platforms. + +PRE-10 — Native utils batch (all peer RN "*") [BUMP] +──────────────────────────────────────────────────────────────────────────────── + @react-native-async-storage/async-storage 2.2.0 → 3.1.1 + v3 defaults to SQLite backend — verify nothing assumes file paths. + react-native-keychain ^9.0.0 → 10.0.0 + Check ACCESSIBLE / ACCESS_CONTROL option removals. Vault-critical: test + biometrics unlock + password fallback thoroughly. + react-native-device-info ^9.0.2 → 15.0.2 + 87 usage files but API is largely additive; removals are old deprecated + methods. Type-check will catch signature changes. + react-native-share 7.3.7 → 12.3.1 + Share.open() options schema changed in 9.x. 17 usage files. + react-native-blob-util ^0.19.9 → 0.24.10 + Same 0.x major; also bump the resolutions entry for + redux-persist-filesystem-storage/react-native-blob-util. + react-native-ble-plx 3.4.0 → 3.5.1 + Verify existing patch still needed on 3.5.1 (Ledger BLE pairing test). + react-native-view-shot 4.0.3 → 5.1.1 + @react-native-community/datetimepicker ^8.5.1 → 9.1.0 + Risk: MEDIUM-HIGH in aggregate; each individually LOW-MEDIUM. + Test: login/biometrics, share sheet, receive-QR screenshot, Ledger pairing. + +PRE-11 — Chore batch: reanimated line + all remaining safe bumps [BUMP] +──────────────────────────────────────────────────────────────────────────────── + Animation stack (peer RN "0.83 - 0.86" — works on both sides of upgrade): + react-native-reanimated 4.2.1 → 4.5.1 + react-native-worklets (NEW) → 0.10.1 + REQUIRED peer of reanimated 4.5. Not in package.json today (testSetup.js + mocks it "when not installed"). Add it, and in babel.config.js swap the + LAST plugin: 'react-native-reanimated/plugin' → 'react-native-worklets/plugin' + (must stay last). + react-native-gesture-handler ~2.30.0 → 2.32.0 + Latest v2 line (v3.0.2 exists — defer v3 to a post-upgrade decision). + If any of the three fail to compile on 0.83 (unlikely), move that line to + the UPGRADE PR. + + Remaining safe bumps (all verified latest on npm 2026-07-06): + react-native-safe-area-context ~5.6.0 → 5.8.0 + react-native-svg 15.15.3 → 15.15.5 + react-native-localize ^3.4.1 → 3.7.0 + lottie-react-native ~7.3.1 → 7.3.8 + @shopify/flash-list 2.0.2 → 2.3.2 + @walletconnect/core ^2.23.0 → 2.23.10 (JS-only, Hermes crash fix) + @react-native-clipboard/clipboard ^1.16.1 → 1.16.3 + @react-native-community/slider 5.1.2 → 5.2.0 + react-native-keyboard-controller 1.20.7 → 1.21.14 + detox 20.51.0 → 20.51.4 (tested against RN 0.85.2; + re-apply/verify detox patch) + react-native-video ^6.19.0 → 6.19.2 + react-native-branch ^5.6.2 → 6.10.0 + rive-react-native ^9.8.0 → 9.8.3 + @notifee/react-native ^9.0.0 → 9.1.8 + react-native-in-app-review ^4.3.3 → 4.4.2 + @react-native-masked-view/masked-view ^0.3.1 → 0.3.2 + react-native-aes-crypto 3.0.3 → 3.3.0 + react-native-inappbrowser-reborn ^3.7.0 → 3.7.1 + Risk: LOW. Test: CI green + one manual smoke pass. + + (Deliberately excluded: @tanstack/react-query 4→5 — unrelated to RN 0.85, + large API migration; do separately if the team wants it.) + +================================================================================ +PART 4 — UPGRADE PR (RN 0.83.6 → 0.85.3 + Expo SDK 56) +================================================================================ +By this point all PRE-* PRs are merged. This PR only contains what +peer-requires RN 0.85 and therefore cannot land earlier. + + REACT NATIVE CORE (0.85.3 = latest 0.85.x, verified) + react-native 0.83.6 → 0.85.3 + @react-native/babel-preset 0.83.x → 0.85.3 + @react-native/metro-config 0.83.x → 0.85.3 + @react-native/eslint-config 0.83.x → 0.85.3 + @react-native/typescript-config 0.83.x → 0.85.3 + metro-react-native-babel-preset / -transformer: REMOVED (done 2026-07-06). + metro.transform.js now uses @react-native/metro-babel-transformer + (bump 0.83.0 → 0.85.3 in this PR) and react-native-svg-transformer + was bumped to ^1.5.3. This also fixed broken hot reload: the old 0.76 + transformer injected react-refresh 0.4.x while the RN 0.83 runtime + expects react-refresh 0.14.x. + + JEST PRESET MIGRATION (RN 0.85 removed the old preset) + @react-native/jest-preset (NEW devDep) → 0.85.3 + All jest configs: preset: 'react-native' → preset: '@react-native/jest-preset' + + EXPO SDK 56 (peer-requires RN 0.85; versions = sdk-56 dist-tags 2026-07-06) + expo → 56.0.14 + expo-apple-authentication → 56.0.4 + expo-asset → 56.0.18 + expo-auth-session → 56.0.15 + expo-build-properties → 56.0.21 + expo-crypto → 56.0.4 (added in PRE-2) + expo-dev-client → 56.0.22 + expo-file-system → 56.0.8 + expo-font → 56.0.7 + expo-haptics → 56.0.3 + expo-image → 56.0.11 + expo-local-authentication → 56.0.4 + expo-screen-orientation → 56.0.5 + expo-sensors → 56.0.6 + expo-splash-screen → 56.0.12 + expo-updates → 56.0.21 + expo-web-browser → 56.0.5 + @expo/fingerprint → 0.19.6 + + PEER-REQUIRES RN 0.85 + react-native-screens ~4.23.0 → 4.25.2 + (expo-router SDK 56 requires ^4.25.2; peer RN >=0.82.0 — the hard blocker) + react-native-pager-view 8.0.x → 8.0.3 + + UPGRADE-DAY VERIFICATION CHECKLIST + [ ] react-native-linear-gradient 2.8.3 compiles → else adopt 3.0.0-beta + [ ] react-native-background-timer 2.4.1 compiles → else execute the + replacement decided in PRE-4's audit + [ ] @react-native-community/checkbox 0.5.20 compiles → else swap to + design-system Checkbox at the 4 usage sites + [ ] react-native-video 6.19.2 plays without bridgeless crash → else v7 beta + [ ] Patches: remove @expo-cli SDK-55 patch (fix shipped in SDK 56 CLI); + re-evaluate expo-web-browser patch against 56.0.5; + re-validate @segment/analytics-react-native and + @tommasini/react-native-scrollable-tab-view patches still apply + [ ] jest transformIgnorePatterns still resolve after preset swap + +================================================================================ +PART 5 — SEQUENCE SUMMARY +================================================================================ + PRE-1 absoluteFillObject codemod (28 files) risk NONE + PRE-2 Expo switches: rn-fs → expo-file-system, + get-random-values → expo-crypto risk LOW-MED + PRE-3 cookies → @preeternal fork (6 files) risk LOW + PRE-4 default-preference → mmkv (4 files); + background-timer bump + usage audit (12 files) risk MED + PRE-5 Nitro ecosystem: nitro-modules, quick-base64, + quick-crypto, mmkv, vision-camera (+nitro-image) risk HIGH + PRE-6 Firebase 20 → 25 risk HIGH + PRE-7 Sentry 7 → 8.17.2 + Braze 19 → 22 (patch rework) risk HIGH + PRE-8 permissions 3 → 5 + netinfo 11 → 12 risk MED + PRE-9 vector-icons → scoped packages (51 files) risk MED + PRE-10 native utils: async-storage, keychain, device-info, + share, blob-util, ble-plx, view-shot, datetimepicker risk MED-HIGH + PRE-11 chore: reanimated 4.5.1 + worklets (NEW) + babel + plugin swap, gesture-handler 2.32.0, + 18 safe bumps risk LOW + ───────────────────────────────────────────────────────── + UPGRADE RN 0.85.3 + @react-native/* 0.85.3 + Expo SDK 56 + + screens 4.25.2 + pager-view 8.0.3 + jest preset + + upgrade-day verification checklist + + Rationale: every risky bump that lands green on 0.83 removes one variable + from upgrade day. If Firebase 25 breaks on 0.83 you debug Firebase; if it + breaks alongside RN 0.85 you cannot tell which change caused it. + +================================================================================ +PART 6 — NO-ACTION LIBRARIES (verified, for the record) +================================================================================ + react-native-svg-charts 5.4.0 abandoned but JS-only — safe; plan + separate replacement epic (19 files) + react-native-render-html 6.3.4 abandoned but JS-only — safe (1 file) + react-native-modal 14.0.0-rc.1 rc.1 IS the latest release; JS-only + react-native-qrcode-svg 6.3.21 already latest + @segment/sovran-react-native 1.1.3 already latest + @segment/analytics-react-native 2.23.0 already latest (keep patch) + react (19.2.0), react-dom unchanged for RN 0.85 diff --git a/rn-0.85-upgrade-spike.txt b/rn-0.85-upgrade-spike.txt new file mode 100644 index 00000000000..2404d7a13e6 --- /dev/null +++ b/rn-0.85-upgrade-spike.txt @@ -0,0 +1,561 @@ +RN 0.85 UPGRADE SPIKE +===================== +From: RN 0.83.6 + Expo SDK 55 +To: RN 0.85.x + Expo SDK 56 +Date: 2026-07-02 + +CONFIRMED: Expo SDK 56 (released May 21, 2026) targets React Native 0.85 + React 19.2. + +================================================================================ +RN 0.85 BREAKING CHANGES +================================================================================ +1. Jest preset: `preset: 'react-native'` → `preset: '@react-native/jest-preset'` + Requires new @react-native/jest-preset package. +2. StyleSheet.absoluteFillObject REMOVED — audit codebase, replace with StyleSheet.absoluteFill. +3. Metro: bumps to ^0.84.0 (handled by @react-native/metro-config bump). +4. Node.js minimum: v20.19.4 (MetaMask uses ^24.16.0, no action needed). + +================================================================================ +SECTION 1 — REACT NATIVE CORE TOOLING +================================================================================ +react-native 0.83.6 → 0.85.x BUMP +react 19.2.0 → 19.2.0 NO CHANGE +react-dom 19.2.0 → 19.2.0 NO CHANGE +@react-native/babel-preset 0.83.0 → 0.85.x BUMP (matches RN version) +@react-native/metro-config 0.83.0 → 0.85.x BUMP (matches RN version) +@react-native/eslint-config 0.83.0 → 0.85.x BUMP (matches RN version) +@react-native/typescript-config 0.83.0 → 0.85.x BUMP (matches RN version) +metro-react-native-babel-preset ~0.76.9 → ~0.85.x BUMP + +================================================================================ +SECTION 2 — EXPO SDK 56 PACKAGES +================================================================================ +expo ^55.0.0 → ~56.0.13 BUMP +expo-apple-authentication ~55.0.13 → ~56.0.4 BUMP +expo-asset ~55.0.17 → ~56.0.18 BUMP +expo-auth-session ~55.0.16 → ~56.0.14 BUMP +expo-build-properties ~55.0.14 → ~56.0.20 BUMP +expo-dev-client ~55.0.35 → ~56.0.21 BUMP +expo-file-system ~55.0.22 → ~56.0.8 BUMP +expo-font ~55.0.8 → ~56.0.7 BUMP +expo-haptics ~55.0.14 → ~56.0.3 BUMP +expo-image ~55.0.11 → ~56.0.11 BUMP +expo-local-authentication ~55.0.14 → ~56.0.4 BUMP +expo-screen-orientation ~55.0.16 → ~56.0.5 BUMP +expo-sensors ~55.0.15 → ~56.0.6 BUMP +expo-splash-screen ~55.0.21 → ~56.0.11 BUMP +expo-updates ~55.0.24 → ~56.0.20 BUMP +expo-web-browser ~55.0.16 → ~56.0.5 BUMP +@expo/fingerprint ~0.16.7 → ~0.19.5 BUMP + +NOTE: The .yarn/patches/@expo-cli-npm-55.0.32 patch (device install fix) needs +re-evaluation against Expo CLI bundled in SDK 56 — may no longer be needed. + +================================================================================ +SECTION 3 — CRITICAL BLOCKERS (must fix, build will fail or break) +================================================================================ + +react-native-screens + Current: ~4.23.0 + Target: ^4.25.2 + Reason: 4.23.x does NOT support RN 0.85. expo-router SDK 56 requires ^4.25.2. + +react-native-reanimated + Current: 4.2.1 + Target: ~4.5.0 + Reason: 4.2.x peer dep doesn't cover RN 0.85; 4.4.0+ adds support. + Note: Reanimated 4.x uses react-native-worklets as a peer dep — verify it's present. + +react-native-gesture-handler + Current: ~2.30.0 + Target: ~2.31.1 (or ~3.0.x for v3 line) + Reason: RN 0.85 support backported to 2.31.1; v3 is fully supported. + +@react-native-cookies/cookies + Current: ^6.2.1 + Target: REPLACE — library ARCHIVED January 31, 2026 (read-only, no more fixes) + Reason: No maintenance, will not receive RN 0.85 native fixes. + Action: Find maintained fork or switch to WebView cookie API / expo-web-browser. + +Jest preset migration + Current: preset: 'react-native' in jest configs + Target: preset: '@react-native/jest-preset' + Reason: RN 0.85 removed old preset. + Action: Add @react-native/jest-preset to devDeps, update all jest.config.js files. + +StyleSheet.absoluteFillObject + Action: grep codebase and replace all usages with StyleSheet.absoluteFill. + +================================================================================ +SECTION 4 — HIGH RISK BUMPS (major version jumps, expect API breaking changes) +================================================================================ + +@sentry/react-native + Current: ~7.11.0 (patched) + Target: ~8.16.0 + Risk: Major version jump (7→8). Likely config/init API changes. + Patch may need to be redone or dropped. + +@braze/react-native-sdk + Current: 19.1.0 (patched) + Target: ^22.0.0 (v21.0.0 was first to validate RN 0.85; latest is 22.0.0) + Risk: 3 major versions, high chance of API changes. Patch likely needs rework. + +@react-native-firebase/app + /messaging + Current: ^20.5.0 + Target: ^25.1.0 + Risk: 5 major versions, bundled native Firebase SDK changes (iOS/Android), + may require Xcode/Gradle version bumps. + +react-native-mmkv + Current: ^3.2.0 + Target: ^4.3.2 + Reason: v4 switched from JSI to Nitro Modules. + Note: Already depends on react-native-nitro-modules (which we have). + +react-native-vision-camera + Current: ^4.7.3 + Target: ^5.1.0 + Reason: v5 uses Nitro Modules (new peer deps: react-native-nitro-modules + react-native-nitro-image). + Completely new API surface compared to v4. + +react-native-quick-crypto + Current: 0.7.15 (patched) + Target: ^1.1.5 + Reason: v1.x switched to Nitro Modules. New peer deps: react-native-nitro-modules, + react-native-quick-base64 >=3.0.0 (we currently use ^2.2.0 patched → needs bump). + Note: Patch will need to be redone for v1.x. + +react-native-permissions + Current: ^3.7.2 + Target: ^5.6.0 + Risk: Two major versions, permission constants API changed in 4.x and 5.x. + +react-native-device-info + Current: ^9.0.2 + Target: ^15.0.2 + Risk: 6 major versions. High change surface despite "*" peer dep. + +react-native-share + Current: 7.3.7 + Target: ^12.3.1 + Risk: 5 major versions. + +react-native-vector-icons + Current: 10.2.0 + Target: 13.x (restructured as monorepo with @react-native-vector-icons/* scoped packages) + Risk: Migration to scoped packages likely requires import path changes throughout codebase. + +react-native-keychain + Current: ^9.0.0 + Target: ^10.0.0 + Risk: Major version — check CHANGELOG for breaking changes. + +@react-native-async-storage/async-storage + Current: 2.2.0 + Target: ^3.1.1 + Risk: Major version. v2.2.0 may still work with RN 0.85 (peer dep "*") but v3 is active. + +react-native-nitro-modules + Current: 0.35.5 + Target: ^0.36.1 + Reason: Bumped by mmkv v4, vision-camera v5, quick-crypto v1.x ecosystem. + +================================================================================ +SECTION 5 — SAFE BUMPS (low risk, peer dep "*" or wide range, minor versions) +================================================================================ + +react-native-safe-area-context ~5.6.0 → ~5.8.0 BUMP (minor, peer *) +react-native-svg 15.15.3 → ~15.15.5 BUMP (minor, peer *) +react-native-pager-view 8.0.0 → ~8.0.2 BUMP (minor, peer *) +react-native-ble-plx 3.4.0 → ^3.5.1 BUMP (minor, peer *) +react-native-blob-util ^0.19.9 → ^0.24.10 BUMP (same major, tested RN 0.84.1) +react-native-localize ^3.4.1 → ^3.7.0 BUMP (minor, peer *) +react-native-view-shot 4.0.3 → ^5.1.1 BUMP (peer >=0.76.0, tested 0.84.1) +react-native-qrcode-svg 6.3.21 → 6.3.21 NO CHANGE (already latest) +lottie-react-native ~7.3.1 → ~7.3.8 BUMP (minor, peer *) +@shopify/flash-list 2.0.2 → ^2.3.2 BUMP (minor, peer *) +@react-native-community/slider 5.1.2 → ^5.2.0 BUMP (minor) +@react-native-community/datetimepicker ^8.5.1 → ^9.1.0 BUMP (major but low risk) +@react-native-community/netinfo 11.5.2 → ^12.0.1 BUMP (major, new arch Android/iOS support) +@react-native-clipboard/clipboard ^1.16.1 → ^1.16.3 BUMP (patch) +@segment/analytics-react-native 2.23.0 → 2.23.0 NO CHANGE (appears current) +@walletconnect/core ^2.23.0 → ^2.23.10 BUMP (JS-only, Hermes crash fix) +detox 20.51.0 → ^20.51.4 BUMP (already developed vs RN 0.85.2) +react-native-keyboard-controller 1.20.7 → check npm BUMP (Software Mansion, tracks RN closely) + +================================================================================ +SECTION 6 — NEEDS INVESTIGATION (unclear maintenance / RN 0.85 status) +================================================================================ + +react-native-linear-gradient + Current: ^2.8.3 (last 2.x release) | 3.0.0-beta.3 exists but not stable yet + Action: Test with 2.8.3 first; if build fails, use 3.0.0-beta.3. + +react-native-video + Current: ^6.19.0 | v7.0.0-beta.10 available (June 2026) + Action: v6.19.2 patched a RN 0.84 bridgeless crash — test with 6.19.2 first; + if RN 0.85 breaks it, migrate to v7 beta. + +react-native-keyboard-controller + Current: 1.20.7 (Software Mansion) + Action: Check npm for latest — library tracks RN releases; likely just needs a bump. + +react-native-svg-charts + Current: ^5.4.0 — LIKELY ABANDONED (last release years ago) + Action: Research if MetaMask can remove or replace this. + +react-native-render-html + Current: ^6.3.4 — maintenance status unclear + Action: Check GitHub for activity; if abandoned, may need to fork or replace. + +react-native-aes-crypto + Current: 3.0.3 — obscure library, repo ambiguous + Action: Locate correct repo; check if it compiles against RN 0.85 headers. + +react-native-get-random-values + Current: ^1.8.0 — minimal native code, likely works + Action: Check npm for latest version. + +react-native-background-timer + Current: 2.1.1 — POSSIBLY ABANDONED (no releases page visible) + Action: Check if library compiles against RN 0.85; if not, replace with + BackgroundTimer equivalent or use setTimeout workaround. + +react-native-default-preference + Current: ^1.4.3 — POSSIBLY ABANDONED (no releases visible) + Action: Check if library compiles against RN 0.85; if not, replace with + react-native-mmkv or @react-native-async-storage. + +react-native-in-app-review + Current: ^4.3.3 — repo availability unclear + Action: Manual check needed on GitHub/npm for latest version and RN 0.85 status. + +react-native-modal + Current: ^14.0.0-rc.1 (pre-release) + Action: Determine if 14.0.0 stable released; check peer deps for RN 0.85 support. + +@react-native-community/checkbox + Current: ^0.5.20 — latest visible but peer dep unknown + Action: Verify it compiles against RN 0.85. + +@react-native-masked-view/masked-view + Current: ^0.3.1 (last release Nov 2024) — peer dep unknown + Action: Verify it compiles against RN 0.85. + +react-native-fs + Current: ^2.20.0 — minimally maintained (last release May 2024) + Action: Consider replacing with expo-file-system (already in project) or + react-native-blob-util which includes FS functionality. + +@segment/sovran-react-native + Current: ^1.1.3 — peer dep and status not confirmed + Action: Check npm for latest. + +================================================================================ +SECTION 7 — SWITCH TO EXPO (libraries with official expo equivalents) +================================================================================ +These libraries have Expo SDK 56 managed alternatives. Switching reduces +maintenance burden since Expo guarantees SDK-version compatibility. + +react-native-fs + → expo-file-system (already in project — evaluate if react-native-fs can be removed) + +react-native-get-random-values + → expo-crypto (provides getRandomValues polyfill as part of Expo ecosystem) + +react-native-background-timer (if abandoned) + → expo-background-fetch (for periodic tasks) or expo-task-manager + +(No other core libraries in this list have direct Expo SDK 56 managed replacements. + The Expo modules already in use cover camera, haptics, auth, splash, etc.) + +================================================================================ +SECTION 8 — RESOLUTIONS / PATCHES TO REVIEW +================================================================================ +These patches may need updating for the new library versions: + +@expo-cli-npm-55.0.32 patch → Re-evaluate for SDK 56 CLI +@sentry/react-native patch → Likely needs rework for 8.x +@braze/react-native-sdk patch → Likely needs rework for 22.x +expo-web-browser patch → Re-evaluate for SDK 56 +react-native-quick-crypto patch → Rework for 1.x / Nitro Modules +react-native-quick-base64 patch → Bump to >=3.0.0 (required by quick-crypto 1.x) +react-native-ble-plx patch → Check if still needed in 3.5.1 +@react-native-community/viewpager patch → Likely still needed +detox patch → Re-evaluate for 20.51.4 + +================================================================================ +SECTION 9 — PRE-UPGRADE PLAN (work that can land on RN 0.83 before the bump) +================================================================================ +Strategy: isolate risk. Every high-risk library bump done on 0.83 is one fewer +variable on RN upgrade day. If Firebase 25 breaks on 0.83, you debug only Firebase. +If it breaks on upgrade day alongside RN 0.85, you won't know the cause. + +Expo SDK 56 packages CANNOT be pre-upgraded — SDK 56 peer-requires RN 0.85. +Everything else below can land as separate PRs on the current 0.83 codebase. + +──────────────────────────────────────────────────────────────────────────────── +TRACK A — Switch to Expo (eliminate native dependencies before upgrade) +──────────────────────────────────────────────────────────────────────────────── +These replace third-party native libs with Expo-managed modules already in the +project. Expo guarantees version compatibility across SDK upgrades. + + A1. react-native-fs → expo-file-system + expo-file-system is already installed. Audit all react-native-fs import + sites and migrate to expo-file-system equivalents. Remove react-native-fs. + Risk: LOW (API is similar; FileSystem.readAsStringAsync vs fs.readFile) + + A2. react-native-get-random-values → expo-crypto + expo-crypto provides getRandomValues. Replace the polyfill import + (typically in index.js) with expo-crypto/build/ExpoCrypto. + Risk: LOW (drop-in for the global polyfill use case) + + A3. react-native-background-timer (IF confirmed abandoned) + → expo-background-fetch + expo-task-manager + Investigate maintenance first (see Track E). If abandoned, migrate. + Risk: MEDIUM (API differs; requires task registration pattern) + + A4. react-native-default-preference (IF confirmed abandoned) + → react-native-mmkv (being upgraded in Track C anyway) + SharedPreferences / NSUserDefaults reads/writes map naturally to MMKV. + Risk: LOW (simple key-value replacement) + +──────────────────────────────────────────────────────────────────────────────── +TRACK B — High-risk major version bumps (do on 0.83, in separate PRs) +──────────────────────────────────────────────────────────────────────────────── +All have peer dep "*" or wide RN range — they compile on 0.83. Doing them now +means API migrations are tested and green before RN upgrade day. + + B1. @react-native-firebase/app + /messaging 20.5.0 → ^25.1.0 + Largest jump (5 majors). Likely needs: + - Updated google-services.json / GoogleService-Info.plist (SDK version bump) + - Potentially newer Google Services Gradle plugin in android/build.gradle + - Xcode Firebase SDK 12.x may require Xcode 16+ + Do this as its own PR. High integration test surface. + + B2. @sentry/react-native 7.11.0 → ~8.16.0 + Init API changed in 8.x (Sentry.init options shape). Patch will likely + need to be rewritten or dropped. Treat as own PR. + + B3. @braze/react-native-sdk 19.1.0 → ^22.0.0 + 3 major versions. Current patch needs re-evaluation. Patch addresses + ReactModuleInfo — verify if 22.x still needs it. Own PR. + + B4. react-native-permissions 3.7.2 → ^5.6.0 + Permission constants renamed between 4.x and 5.x (e.g. CAMERA usage). + Grep for PERMISSIONS.* and check against 5.x docs. Own PR. + + B5. react-native-device-info 9.x → ^15.0.2 + 6 major versions but peer dep is "*". API is largely additive; removals + were deprecated methods in 10.x and 11.x. Test all getDeviceId, + getBundleId, getVersion etc. usages. Batch with B6 below. + + B6. react-native-share 7.3.7 → ^12.3.1 + 5 major versions. Share.open() API changed in 9.x (options schema). + Audit all Share.open() call sites. Batch with B5 as "native utils" PR. + + B7. react-native-keychain 9.x → ^10.0.0 + Single major bump. Check CHANGELOG for ACCESSIBLE and ACCESS_CONTROL + option changes. Low surface area. Batch with B5+B6. + + B8. @react-native-async-storage/async-storage 2.2.0 → ^3.1.1 + v3 added SQLite backend (default) — verify no assumptions about storage + internals (migrate scripts, etc.). Low JS API change risk. Own small PR. + + B9. @react-native-community/netinfo 11.5.2 → ^12.0.1 + v12 changed Android WiFi info API (requires NEARBY_WIFI_DEVICES permission + on Android 13+). Check permission config in app.json. Small PR. + + B10. react-native-vector-icons 10.2.0 → 13.x + Monorepo restructure — import paths change from + import Icon from 'react-native-vector-icons/MaterialIcons' + to + import MaterialIcons from '@react-native-vector-icons/material-icons' + Grep all vector-icon imports and do a codemod. Own PR (large but mechanical). + + B11. react-native-view-shot 4.0.3 → ^5.1.1 + Peer dep >=0.76.0, tested to 0.84.1. Low API change risk. Batch with B7. + + B12. @react-native-community/datetimepicker 8.5.1 → ^9.1.0 + Major version. Check for any display/mode API changes. Batch with B7. + +──────────────────────────────────────────────────────────────────────────────── +TRACK C — Nitro Modules ecosystem (do on 0.83, must be done together) +──────────────────────────────────────────────────────────────────────────────── +These are interlinked: quick-crypto 1.x and mmkv 4.x both require nitro-modules +>=0.31.2; vision-camera 5.x needs nitro-modules + nitro-image. Do in one PR. + + C1. react-native-nitro-modules 0.35.5 → ^0.36.1 (base dep, do first) + C2. react-native-quick-base64 2.2.0 → ^3.0.0 (required by quick-crypto 1.x) + Current patch for 2.2.0 will need to be dropped or rewritten for 3.0.0. + C3. react-native-quick-crypto 0.7.15 → ^1.1.5 (switches to Nitro Modules) + Patch for 0.7.15 will need to be rewritten. New peer deps: nitro-modules, + quick-base64 >=3.0.0. + C4. react-native-mmkv 3.2.x → ^4.3.2 (switches to Nitro Modules) + Storage.getString() API unchanged; constructor options may have changed. + Verify all new MMKV({...}) instantiations. + C5. react-native-vision-camera 4.7.3 → ^5.1.0 (switches to Nitro Modules) + New peer deps: react-native-nitro-modules (C1), react-native-nitro-image + (add as new dep). API changes: useCameraDevice hook signature changed, + some props renamed. Audit all Camera usages. + + Note: react-native-aes-crypto (3.0.3) does NOT use Nitro — verify separately. + +──────────────────────────────────────────────────────────────────────────────── +TRACK D — Safe minor bumps (batch into a single "pre-upgrade chore" PR) +──────────────────────────────────────────────────────────────────────────────── +All peer dep "*" or very wide. No expected breaking changes. One PR. + + react-native-localize 3.4.1 → ^3.7.0 + react-native-ble-plx 3.4.0 → ^3.5.1 + react-native-blob-util 0.19.9 → ^0.24.10 + react-native-svg 15.15.3 → ~15.15.5 + @react-native-clipboard/clipboard 1.16.1 → ^1.16.3 + @walletconnect/core 2.23.0 → ^2.23.10 (Hermes crash fix, JS-only) + @shopify/flash-list 2.0.2 → ^2.3.2 + lottie-react-native 7.3.1 → ~7.3.8 + detox 20.51.0 → ^20.51.4 (already tested vs RN 0.85.2) + @react-native-community/slider 5.1.2 → ^5.2.0 + react-native-keyboard-controller 1.20.7 → latest (Software Mansion, tracks RN) + @tanstack/react-query 4.43.0 → ^5.101.2 (if team agrees; major API change) + react-native-safe-area-context 5.6.0 → ~5.8.0 + +──────────────────────────────────────────────────────────────────────────────── +TRACK E — Investigate & decide (answers needed before upgrade PR opens) +──────────────────────────────────────────────────────────────────────────────── +These need a human decision. Block the RN upgrade PR until each has a verdict. + + E1. @react-native-cookies/cookies — ARCHIVED Jan 31, 2026 + MUST replace. Options: + a) react-native-cookie (maintained fork — verify) + b) Custom WebView cookie injection via onMessage bridge + c) @react-native-community/cookies (check if exists) + Decision needed: which replacement, how many call sites. + + E2. react-native-background-timer — check if abandoned + If no release in 2+ years and native code doesn't compile on 0.85: + → migrate to expo-background-fetch (Track A3) + + E3. react-native-default-preference — check if abandoned + If abandoned: → migrate to react-native-mmkv (Track C4, already upgraded) + + E4. react-native-svg-charts — likely abandoned + If confirmed: audit if it can be replaced with d3-shape (already in project) + or react-native-svg direct rendering. + + E5. react-native-render-html — check GitHub activity + If maintained: bump to latest and test. + If abandoned: replace with custom HTML renderer via WebView or dangerouslySetInnerHTML. + + E6. react-native-in-app-review — verify latest version on npm + Check peer dep. Likely no action needed but confirm. + + E7. react-native-linear-gradient — 3.0.0-beta.3 exists; 2.8.3 is last 2.x + Test whether 2.8.3 compiles on RN 0.85 during upgrade. If not, adopt beta. + Decision deferred to upgrade day. + + E8. react-native-video — v6.19.2 vs v7 beta + Test v6.19.2 on RN 0.85. If bridgeless mode crashes persist, migrate to v7. + Decision deferred to upgrade day. + + E9. react-native-aes-crypto — locate correct repo, check compile on 0.85 + If broken: replace with react-native-quick-crypto (already in project, upgraded in C3). + + E10. StyleSheet.absoluteFillObject — grep and fix NOW (on 0.83) + Backward-compatible change; RN 0.83 supports both. Safe to fix pre-upgrade. + Command: grep -r "absoluteFillObject" app/ --include="*.ts" --include="*.tsx" + +──────────────────────────────────────────────────────────────────────────────── +MUST WAIT — Only possible on/after RN 0.85 upgrade day +──────────────────────────────────────────────────────────────────────────────── + react-native 0.83.6 → 0.85.x + @react-native/babel-preset 0.83.0 → 0.85.x (must match RN version) + @react-native/metro-config 0.83.0 → 0.85.x (must match RN version) + @react-native/eslint-config 0.83.0 → 0.85.x (must match RN version) + @react-native/typescript-config 0.83.0 → 0.85.x (must match RN version) + metro-react-native-babel-preset 0.76.9 → ~0.85.x + expo ~55.0.0 → ~56.0.13 (SDK 56 peer-requires RN 0.85) + expo-apple-authentication → ~56.0.4 + expo-asset → ~56.0.18 + expo-auth-session → ~56.0.14 + expo-build-properties → ~56.0.20 + expo-dev-client → ~56.0.21 + expo-file-system → ~56.0.8 + expo-font → ~56.0.7 + expo-haptics → ~56.0.3 + expo-image → ~56.0.11 + expo-local-authentication → ~56.0.4 + expo-screen-orientation → ~56.0.5 + expo-sensors → ~56.0.6 + expo-splash-screen → ~56.0.11 + expo-updates → ~56.0.20 + expo-web-browser → ~56.0.5 + @expo/fingerprint → ~0.19.5 + react-native-screens 4.23.x → ^4.25.2 (peer-requires RN 0.85) + react-native-reanimated 4.2.1 → ~4.5.0 (safest to align with screens) + react-native-gesture-handler 2.30.x → ~2.31.1 (align with screens + reanimated) + react-native-pager-view 8.0.0 → ~8.0.2 (minor, do on upgrade day) + Jest preset migration (add @react-native/jest-preset devDep, + update jest.config.js files) + +──────────────────────────────────────────────────────────────────────────────── +RECOMMENDED PR SEQUENCE (pre-upgrade) +──────────────────────────────────────────────────────────────────────────────── + PR 1 — Track E investigations (no code, just verdicts documented) + PR 2 — Track A: Expo migrations (fs, get-random-values, replacements for abandoned) + PR 3 — Track C: Nitro Modules ecosystem (nitro-modules, mmkv, quick-crypto, + quick-base64, vision-camera — all together) + PR 4 — Track B1: Firebase 20 → 25 (isolated, highest risk, own PR) + PR 5 — Track B2+B3: Sentry + Braze (both have patches, group together) + PR 6 — Track B4+B9: react-native-permissions + netinfo (permission surface together) + PR 7 — Track B5+B6+B7+B11+B12: device-info, share, keychain, view-shot, + datetimepicker (native utils batch) + PR 8 — Track B8: async-storage (storage migration, own PR) + PR 9 — Track B10: react-native-vector-icons migration (mechanical codemod, own PR) + PR 10 — Track D: All safe minor bumps (single chore PR) + PR 11 — StyleSheet.absoluteFillObject grep + fix (can be part of PR 10) + ────────────────────────────────────────────────────── + PR 12 — RN 0.85 upgrade (react-native + @react-native/* tooling + Expo SDK 56 + + screens + reanimated + gesture-handler + jest preset) + +================================================================================ +SECTION 10 — ACTION PRIORITY ORDER +================================================================================ +P0 — Blocks first build: + 1. Bump react-native → 0.85.x + 2. Bump all Expo SDK 55 → SDK 56 packages (Section 2) + 3. Bump @react-native/* tooling (babel-preset, metro-config, etc.) + 4. Bump react-native-screens → ^4.25.2 + 5. Bump react-native-reanimated → ~4.5.0 + 6. Bump react-native-gesture-handler → ~2.31.1 + 7. Fix Jest preset migration + 8. Grep + fix StyleSheet.absoluteFillObject usages + +P1 — High risk but unblocking: + 9. Replace @react-native-cookies/cookies + 10. Sentry 7 → 8 migration + 11. Firebase 20 → 25 migration + 12. Braze 19 → 22 migration + +P2 — Nitro Modules ecosystem (interlinked): + 13. react-native-nitro-modules → ^0.36.1 + 14. react-native-mmkv → ^4.3.2 + 15. react-native-quick-crypto → ^1.1.5 + 16. react-native-quick-base64 → ^3.0.0 + 17. react-native-vision-camera → ^5.1.0 (+ react-native-nitro-image peer dep) + +P3 — Remaining major bumps: + 18. react-native-permissions → ^5.6.0 + 19. react-native-device-info → ^15.0.2 + 20. react-native-share → ^12.3.1 + 21. react-native-vector-icons → 13.x (import path migration) + 22. react-native-keychain → ^10.0.0 + 23. @react-native-async-storage/async-storage → ^3.1.1 + 24. @react-native-community/netinfo → ^12.0.1 + +P4 — Safe bumps (low risk, batch together): + 25. All libraries in Section 5 + +P5 — Investigation required before committing: + 26. All libraries in Section 6 diff --git a/yarn.lock b/yarn.lock index 19b4de699fc..1070685392f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12530,119 +12530,119 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-clean@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-clean@npm:20.0.0" +"@react-native-community/cli-clean@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-clean@npm:20.1.0" dependencies: - "@react-native-community/cli-tools": "npm:20.0.0" - chalk: "npm:^4.1.2" + "@react-native-community/cli-tools": "npm:20.1.0" execa: "npm:^5.0.0" fast-glob: "npm:^3.3.2" - checksum: 10/56a261a83eb4fc60e81778659ace53997cc5d045fc09c7e7a3a991eaae60347a7349868bcc5b45db73d3234fc714fe6adbaf641669eddd94cfcfe1037dd616c1 + picocolors: "npm:^1.1.1" + checksum: 10/d929c541e07e8d703c5633bce1a7f2c4ff249f5a5e508b8c11f2fcbf97d5bc27eff706cb36b56973f0405e3592e67bc04f4a7d736956427f129a8c88f9c2cfa5 languageName: node linkType: hard -"@react-native-community/cli-config-android@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-config-android@npm:20.0.0" +"@react-native-community/cli-config-android@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-config-android@npm:20.1.0" dependencies: - "@react-native-community/cli-tools": "npm:20.0.0" - chalk: "npm:^4.1.2" + "@react-native-community/cli-tools": "npm:20.1.0" fast-glob: "npm:^3.3.2" fast-xml-parser: "npm:^4.4.1" - checksum: 10/fbd897df48793b050429e77114b8fcf42364b8847a199873818977cb8102ce303bb3e4fbf1842fd66608d96409e27835111e19e80c670dc6067066e53d4c500f + picocolors: "npm:^1.1.1" + checksum: 10/d14b6c5d172c54a9a4ff7fda8feb91d2f644ca50f2bd1d5109b77d0cfd51c808aca4e6fd957500bb6aaf01bdb7b916ea6028a4658b46b2f8f72ee54bea3dfdd2 languageName: node linkType: hard -"@react-native-community/cli-config-apple@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-config-apple@npm:20.0.0" +"@react-native-community/cli-config-apple@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-config-apple@npm:20.1.0" dependencies: - "@react-native-community/cli-tools": "npm:20.0.0" - chalk: "npm:^4.1.2" + "@react-native-community/cli-tools": "npm:20.1.0" execa: "npm:^5.0.0" fast-glob: "npm:^3.3.2" - checksum: 10/7c4e01c894199db48c15265d6d336ece4e103bf23e282e09f08eaa9e03b2237e8dae659e41a2f5fe7f091c9b31f22b3756bdd0f92b8eb6483d279c71b7fc6c99 + picocolors: "npm:^1.1.1" + checksum: 10/5097011bb1831b9eff8d7e1f2964fe265bab3bb7e97ad681985368dc41a853811c474d235ea793edf5e31ad49810744f16bbfff3623e7629ef757eb80858a832 languageName: node linkType: hard -"@react-native-community/cli-config@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-config@npm:20.0.0" +"@react-native-community/cli-config@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-config@npm:20.1.0" dependencies: - "@react-native-community/cli-tools": "npm:20.0.0" - chalk: "npm:^4.1.2" + "@react-native-community/cli-tools": "npm:20.1.0" cosmiconfig: "npm:^9.0.0" deepmerge: "npm:^4.3.0" fast-glob: "npm:^3.3.2" joi: "npm:^17.2.1" - checksum: 10/aaf5e5cb07105abe0eb179b2ed230f24546068780cee02986b5d71447f928f5bff0e2fbc84e02302cf60f2795da8fa919eb204da41f9421f2cfaec9dc53c98c7 + picocolors: "npm:^1.1.1" + checksum: 10/8d53c31641527a245be566992c6a13dc6711d8cfee4f65293ba169e0466c45c71af08a36e00dd550edfa74c1207f702293a8f07acd9a09a36320440e5922bb51 languageName: node linkType: hard -"@react-native-community/cli-doctor@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-doctor@npm:20.0.0" +"@react-native-community/cli-doctor@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-doctor@npm:20.1.0" dependencies: - "@react-native-community/cli-config": "npm:20.0.0" - "@react-native-community/cli-platform-android": "npm:20.0.0" - "@react-native-community/cli-platform-apple": "npm:20.0.0" - "@react-native-community/cli-platform-ios": "npm:20.0.0" - "@react-native-community/cli-tools": "npm:20.0.0" - chalk: "npm:^4.1.2" + "@react-native-community/cli-config": "npm:20.1.0" + "@react-native-community/cli-platform-android": "npm:20.1.0" + "@react-native-community/cli-platform-apple": "npm:20.1.0" + "@react-native-community/cli-platform-ios": "npm:20.1.0" + "@react-native-community/cli-tools": "npm:20.1.0" command-exists: "npm:^1.2.8" deepmerge: "npm:^4.3.0" envinfo: "npm:^7.13.0" execa: "npm:^5.0.0" node-stream-zip: "npm:^1.9.1" ora: "npm:^5.4.1" + picocolors: "npm:^1.1.1" semver: "npm:^7.5.2" wcwidth: "npm:^1.0.1" yaml: "npm:^2.2.1" - checksum: 10/c78de0b83287c1db03e780123a83c3f26a8883dc54b5b3a1c34e2d3ed1050e39fbf597b95d8899f878b5ef61a89e05493c62d644e84293008eb4da73a4feb2a8 + checksum: 10/65101ca2da9d970245bcb09c4ce19ec9b75d9d8fac3dd3dfd857ed09a4e5336e4d4f10815b1a0e6211dfbfb66ef601a3df614aa20f2a57a869a09b71cd9850d8 languageName: node linkType: hard -"@react-native-community/cli-platform-android@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-platform-android@npm:20.0.0" +"@react-native-community/cli-platform-android@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-platform-android@npm:20.1.0" dependencies: - "@react-native-community/cli-config-android": "npm:20.0.0" - "@react-native-community/cli-tools": "npm:20.0.0" - chalk: "npm:^4.1.2" + "@react-native-community/cli-config-android": "npm:20.1.0" + "@react-native-community/cli-tools": "npm:20.1.0" execa: "npm:^5.0.0" logkitty: "npm:^0.7.1" - checksum: 10/a5b4da7a329e3723d4285f60b18068e78a18451cc948ef79088f1dfbfffc22413a7e94a3c3cc91aee27cf9438bb6b57212b5275e7e5d7af7db41011c4c628f12 + picocolors: "npm:^1.1.1" + checksum: 10/a98faac2a41272041d4643e81cd9950002b555a50bfb53567f72b4ea3e64295a0e5cb79c66fd06f1162a3c367d07114067a446a8849b71c8c4a1f8f0bdf7b199 languageName: node linkType: hard -"@react-native-community/cli-platform-apple@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-platform-apple@npm:20.0.0" +"@react-native-community/cli-platform-apple@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-platform-apple@npm:20.1.0" dependencies: - "@react-native-community/cli-config-apple": "npm:20.0.0" - "@react-native-community/cli-tools": "npm:20.0.0" - chalk: "npm:^4.1.2" + "@react-native-community/cli-config-apple": "npm:20.1.0" + "@react-native-community/cli-tools": "npm:20.1.0" execa: "npm:^5.0.0" fast-xml-parser: "npm:^4.4.1" - checksum: 10/a1a4c0fcdf9e3c819e0804de2447aed230d1f16c36107728374121deda60acd644550c0f5aeb98f6cd25846da9e6358617c67aaf895eab6e9a81cff1030cf8dd + picocolors: "npm:^1.1.1" + checksum: 10/8785ffa90d7c5398c1fa00dad37ad8e11b008bec56d6910b1d7d845e90a5b850da9fa51fd8296e7a604771d2e8623654e898f12c4c473ec027d02fc35e682f3b languageName: node linkType: hard -"@react-native-community/cli-platform-ios@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-platform-ios@npm:20.0.0" +"@react-native-community/cli-platform-ios@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-platform-ios@npm:20.1.0" dependencies: - "@react-native-community/cli-platform-apple": "npm:20.0.0" - checksum: 10/c7fc89332a7cb9fa71c1c5d4fe928d39b0514c74fdcc85251a7a35344f1f5e9e3b4cd23a85a70ce447dded6e6552a5edfa848cf07d8b26127a0c3b05ce3e1768 + "@react-native-community/cli-platform-apple": "npm:20.1.0" + checksum: 10/da425c68bb20ade47f6283eba247d210206ddd651c9f80191c1b6e92ee5978a35b69df7a96c323dad9a0cf4dce7236ab84f34d9a6c51aa1d776d61de48f657eb languageName: node linkType: hard -"@react-native-community/cli-server-api@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-server-api@npm:20.0.0" +"@react-native-community/cli-server-api@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-server-api@npm:20.1.0" dependencies: - "@react-native-community/cli-tools": "npm:20.0.0" + "@react-native-community/cli-tools": "npm:20.1.0" body-parser: "npm:^1.20.3" compression: "npm:^1.7.1" connect: "npm:^3.6.5" @@ -12652,7 +12652,7 @@ __metadata: pretty-format: "npm:^29.7.0" serve-static: "npm:^1.13.1" ws: "npm:^6.2.3" - checksum: 10/1d58c5a4a451c861db13065898f6c825b8c811fb37fa588fc76edede10d4899fd786055137339eda4033335db97630419017b4f843f4f36a1b00b37296710f47 + checksum: 10/cfa0fe00cb459459f254b94a770c85693b544e26f708a0ccf0b13bda76cfe8102a038ad9c81e2cf752b7abd4356c383180bdbb140ac2f9b063fdf53e48c411bf languageName: node linkType: hard @@ -12692,55 +12692,55 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-tools@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-tools@npm:20.0.0" +"@react-native-community/cli-tools@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-tools@npm:20.1.0" dependencies: "@vscode/sudo-prompt": "npm:^9.0.0" appdirsjs: "npm:^1.2.4" - chalk: "npm:^4.1.2" execa: "npm:^5.0.0" find-up: "npm:^5.0.0" launch-editor: "npm:^2.9.1" mime: "npm:^2.4.1" ora: "npm:^5.4.1" + picocolors: "npm:^1.1.1" prompts: "npm:^2.4.2" semver: "npm:^7.5.2" - checksum: 10/5418844eb46e159d05d6ca4af38e054ffd157ae016576eed4d10bb3bdc345bdb8ca30e3cc5a27aff4a7a49727fd4b1da88f7855469ebbfbbdd042ad58951b764 + checksum: 10/f773a183a078fe2077a14405370840fb16a96b77ce2f0b3789b3383840d425657979f64793f8b38e6e9051106a9fa0cca7d062919479e24b1bd3df1692435578 languageName: node linkType: hard -"@react-native-community/cli-types@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli-types@npm:20.0.0" +"@react-native-community/cli-types@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli-types@npm:20.1.0" dependencies: joi: "npm:^17.2.1" - checksum: 10/b64b03ff09eb3952c37ba96544156f0b6ffa76e616361a48254e645f914beaa844943ff77ee1fba46445ef8b45f726109fc9ad249afb9d360602cb03db846368 + checksum: 10/1ae86701a98ac21d0e67f2fcce3859e44c2315c55076aaf82cf80ebf19e91fe95f177208803fddd562f6578549f6ee816356406b5ce106fa0a4e7d30f5aafcdc languageName: node linkType: hard -"@react-native-community/cli@npm:20.0.0": - version: 20.0.0 - resolution: "@react-native-community/cli@npm:20.0.0" +"@react-native-community/cli@npm:20.1.0": + version: 20.1.0 + resolution: "@react-native-community/cli@npm:20.1.0" dependencies: - "@react-native-community/cli-clean": "npm:20.0.0" - "@react-native-community/cli-config": "npm:20.0.0" - "@react-native-community/cli-doctor": "npm:20.0.0" - "@react-native-community/cli-server-api": "npm:20.0.0" - "@react-native-community/cli-tools": "npm:20.0.0" - "@react-native-community/cli-types": "npm:20.0.0" - chalk: "npm:^4.1.2" + "@react-native-community/cli-clean": "npm:20.1.0" + "@react-native-community/cli-config": "npm:20.1.0" + "@react-native-community/cli-doctor": "npm:20.1.0" + "@react-native-community/cli-server-api": "npm:20.1.0" + "@react-native-community/cli-tools": "npm:20.1.0" + "@react-native-community/cli-types": "npm:20.1.0" commander: "npm:^9.4.1" deepmerge: "npm:^4.3.0" execa: "npm:^5.0.0" find-up: "npm:^5.0.0" fs-extra: "npm:^8.1.0" graceful-fs: "npm:^4.1.3" + picocolors: "npm:^1.1.1" prompts: "npm:^2.4.2" semver: "npm:^7.5.2" bin: rnc-cli: build/bin.js - checksum: 10/9f52dce4f6c25d414ba4549153b70daef7708f5603f88f90147c9ec4dd29118f62995294eb20cb3f7c4018367bda66dac344d25ed0e9ffaad6b62a94b29ba75b + checksum: 10/edd3e93b45b68c3a1f3cd623d350293505a256bdac39e4dc5760c27ca9bc0cc7330e31f95688a8a068fd32edff91a9bf620b2ed8fdb2ee8b53b362c18a022d59 languageName: node linkType: hard @@ -12851,20 +12851,10 @@ __metadata: languageName: node linkType: hard -"@react-native/assets-registry@npm:0.83.6": - version: 0.83.6 - resolution: "@react-native/assets-registry@npm:0.83.6" - checksum: 10/9ae3c3a4d8831149ec1c96aff7a93392505c22b3bbbddc55d9fa9ae6ff3ea7a8d824fbb923b07f4bd185c74afbd1c9dbc53f7c3a1a161f902a9df91430595c4c - languageName: node - linkType: hard - -"@react-native/babel-plugin-codegen@npm:0.83.0": - version: 0.83.0 - resolution: "@react-native/babel-plugin-codegen@npm:0.83.0" - dependencies: - "@babel/traverse": "npm:^7.25.3" - "@react-native/codegen": "npm:0.83.0" - checksum: 10/e43452305c2fcbfbc1647f1818241366a0924a6869ffae871cd86bffa7d6cd4d789edd1542f919a2f2906ebb2a425f4ad78766a4f3df8d5bc5317994d0a026f6 +"@react-native/assets-registry@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/assets-registry@npm:0.85.0" + checksum: 10/1aa1d0b4e5dcfc90e5f71415b41c14560e7a5d9e7a4b1aa84d9cf71aadef4c422d0a535048400ecd8deefea213f6cef23ef8bff2b45e071ea995e0714db662c4 languageName: node linkType: hard @@ -12878,9 +12868,19 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.83.0": - version: 0.83.0 - resolution: "@react-native/babel-preset@npm:0.83.0" +"@react-native/babel-plugin-codegen@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/babel-plugin-codegen@npm:0.85.0" + dependencies: + "@babel/traverse": "npm:^7.29.0" + "@react-native/codegen": "npm:0.85.0" + checksum: 10/339c0457b31d7f33ca559464067aa92498a38b6bff4d3fada133fafa70539e40eff4557abbd174ba5edec61385b4a016cfaf4cd5baaf81be206ca0a074777ecd + languageName: node + linkType: hard + +"@react-native/babel-preset@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/babel-preset@npm:0.83.6" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -12923,19 +12923,19 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.83.0" + "@react-native/babel-plugin-codegen": "npm:0.83.6" babel-plugin-syntax-hermes-parser: "npm:0.32.0" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/c68fcec86eabdce17c83b2f500d6bf09d5f25755dccb10d1c0117522152331474d605ccfc7f53e4b9e3df63482616e1143d554897b76fcd7154a1f2079192f32 + checksum: 10/204cf777078649203c18b5ed5765577641312ab47dbaa4415bb3805ec928c0ef36177e3036984d4d44dc986477e3bf68a0b59642e67b2a121831acf25b286a30 languageName: node linkType: hard -"@react-native/babel-preset@npm:0.83.6": - version: 0.83.6 - resolution: "@react-native/babel-preset@npm:0.83.6" +"@react-native/babel-preset@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/babel-preset@npm:0.85.0" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -12943,27 +12943,19 @@ __metadata: "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" "@babel/plugin-transform-block-scoping": "npm:^7.25.0" "@babel/plugin-transform-class-properties": "npm:^7.25.4" "@babel/plugin-transform-classes": "npm:^7.25.4" - "@babel/plugin-transform-computed-properties": "npm:^7.24.7" "@babel/plugin-transform-destructuring": "npm:^7.24.8" "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" "@babel/plugin-transform-for-of": "npm:^7.24.7" - "@babel/plugin-transform-function-name": "npm:^7.25.1" - "@babel/plugin-transform-literals": "npm:^7.25.2" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" - "@babel/plugin-transform-parameters": "npm:^7.24.7" "@babel/plugin-transform-private-methods": "npm:^7.24.7" "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" "@babel/plugin-transform-react-display-name": "npm:^7.24.7" @@ -12972,25 +12964,21 @@ __metadata: "@babel/plugin-transform-react-jsx-source": "npm:^7.24.7" "@babel/plugin-transform-regenerator": "npm:^7.24.7" "@babel/plugin-transform-runtime": "npm:^7.24.7" - "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" - "@babel/plugin-transform-spread": "npm:^7.24.7" - "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" - "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.83.6" - babel-plugin-syntax-hermes-parser: "npm:0.32.0" + "@react-native/babel-plugin-codegen": "npm:0.85.0" + babel-plugin-syntax-hermes-parser: "npm:0.33.3" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/204cf777078649203c18b5ed5765577641312ab47dbaa4415bb3805ec928c0ef36177e3036984d4d44dc986477e3bf68a0b59642e67b2a121831acf25b286a30 + checksum: 10/7240a55a57e65e0d6896d36273923a02fe1e804f35ddba17acbda6dce164c23b50b382eaa71e01ec2bf620b91820d39e1a62b20010c6db5a954de5899957a997 languageName: node linkType: hard -"@react-native/codegen@npm:0.83.0": - version: 0.83.0 - resolution: "@react-native/codegen@npm:0.83.0" +"@react-native/codegen@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/codegen@npm:0.83.6" dependencies: "@babel/core": "npm:^7.25.2" "@babel/parser": "npm:^7.25.3" @@ -13001,47 +12989,47 @@ __metadata: yargs: "npm:^17.6.2" peerDependencies: "@babel/core": "*" - checksum: 10/6a201c7760aa7404e869eca97ebbeb233eec318d4881c218b899a8c1534793bd1d17c6ff334c3ef827ccf5e43d90fbab6ca9d932af8f4bf19a8d5c8e9dc8f021 + checksum: 10/5f819725e455953b387ae098ab05da0950f790ab5337f1131c779895f0de576c4b491f1017b7ce10c3530e55566859d398386e0e65baaa19089c5c5edb430e37 languageName: node linkType: hard -"@react-native/codegen@npm:0.83.6": - version: 0.83.6 - resolution: "@react-native/codegen@npm:0.83.6" +"@react-native/codegen@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/codegen@npm:0.85.0" dependencies: "@babel/core": "npm:^7.25.2" - "@babel/parser": "npm:^7.25.3" - glob: "npm:^7.1.1" - hermes-parser: "npm:0.32.0" + "@babel/parser": "npm:^7.29.0" + hermes-parser: "npm:0.33.3" invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" + tinyglobby: "npm:^0.2.15" yargs: "npm:^17.6.2" peerDependencies: "@babel/core": "*" - checksum: 10/5f819725e455953b387ae098ab05da0950f790ab5337f1131c779895f0de576c4b491f1017b7ce10c3530e55566859d398386e0e65baaa19089c5c5edb430e37 + checksum: 10/0f40789be509c1d32b170a3bed9d1ade72d492c2ab4517b0e3daba39a0acdb00d68a2baa3232113e5d8cfb648702cf3e8f2dcc020cbb7c70ed7a3ff38af32d2c languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.83.6": - version: 0.83.6 - resolution: "@react-native/community-cli-plugin@npm:0.83.6" +"@react-native/community-cli-plugin@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/community-cli-plugin@npm:0.85.0" dependencies: - "@react-native/dev-middleware": "npm:0.83.6" + "@react-native/dev-middleware": "npm:0.85.0" debug: "npm:^4.4.0" invariant: "npm:^2.2.4" - metro: "npm:^0.83.6" - metro-config: "npm:^0.83.6" - metro-core: "npm:^0.83.6" + metro: "npm:^0.84.0" + metro-config: "npm:^0.84.0" + metro-core: "npm:^0.84.0" semver: "npm:^7.1.3" peerDependencies: "@react-native-community/cli": "*" - "@react-native/metro-config": "*" + "@react-native/metro-config": 0.85.0 peerDependenciesMeta: "@react-native-community/cli": optional: true "@react-native/metro-config": optional: true - checksum: 10/48ef4b15aa34d3b39217d8ce1b4508259f88da5526a08107cc92a38a07876c41cad09de1d8eb12955ac5e992b44492a071fd73b5a4315da8b1e9c276a349f479 + checksum: 10/06a6495b078df571b5ee62272f5869de419a0b19db98f2bdcc710523c49741f2fb88ab620842206987b8928b48c5234707e53fc7792d907bbbab889a0b639ff9 languageName: node linkType: hard @@ -13052,6 +13040,13 @@ __metadata: languageName: node linkType: hard +"@react-native/debugger-frontend@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/debugger-frontend@npm:0.85.0" + checksum: 10/08691010d80c7cba88171c900c75eb46d604a77356f504071bfadf7ce0028ccd71883aa7c44d97ffb0fefc5d0a2f4fb99e895d7edcbf672d00e3048678a5395e + languageName: node + linkType: hard + "@react-native/debugger-shell@npm:0.83.6": version: 0.83.6 resolution: "@react-native/debugger-shell@npm:0.83.6" @@ -13062,6 +13057,17 @@ __metadata: languageName: node linkType: hard +"@react-native/debugger-shell@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/debugger-shell@npm:0.85.0" + dependencies: + cross-spawn: "npm:^7.0.6" + debug: "npm:^4.4.0" + fb-dotslash: "npm:0.5.8" + checksum: 10/3bb4b52f03bf977a6a0a5f792200df38bc77366f822ff7e142dfc59e5a2a0fdc6a1ab4fe7637c65994c1df5a9c4d882f03b83de320e9045a5e5e94aa707f2661 + languageName: node + linkType: hard + "@react-native/dev-middleware@npm:0.83.6": version: 0.83.6 resolution: "@react-native/dev-middleware@npm:0.83.6" @@ -13082,80 +13088,108 @@ __metadata: languageName: node linkType: hard -"@react-native/eslint-config@npm:0.83.0": - version: 0.83.0 - resolution: "@react-native/eslint-config@npm:0.83.0" +"@react-native/dev-middleware@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/dev-middleware@npm:0.85.0" + dependencies: + "@isaacs/ttlcache": "npm:^1.4.1" + "@react-native/debugger-frontend": "npm:0.85.0" + "@react-native/debugger-shell": "npm:0.85.0" + chrome-launcher: "npm:^0.15.2" + chromium-edge-launcher: "npm:^0.3.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + open: "npm:^7.0.3" + serve-static: "npm:^1.16.2" + ws: "npm:^7.5.10" + checksum: 10/04528379c68d9d5acede6c75759f6c4541653b83697ceb61f86232313ed72f4ffd1edba7a2082a42ff4d2d3a2e2a5deaafe6f7be202cdd21b745257e3e435117 + languageName: node + linkType: hard + +"@react-native/eslint-config@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/eslint-config@npm:0.85.0" dependencies: "@babel/core": "npm:^7.25.2" "@babel/eslint-parser": "npm:^7.25.1" - "@react-native/eslint-plugin": "npm:0.83.0" + "@react-native/eslint-plugin": "npm:0.85.0" "@typescript-eslint/eslint-plugin": "npm:^8.36.0" "@typescript-eslint/parser": "npm:^8.36.0" eslint-config-prettier: "npm:^8.5.0" eslint-plugin-eslint-comments: "npm:^3.2.0" eslint-plugin-ft-flow: "npm:^2.0.1" eslint-plugin-jest: "npm:^29.0.1" - eslint-plugin-react: "npm:^7.30.1" + eslint-plugin-react: "npm:^7.37.5" eslint-plugin-react-hooks: "npm:^7.0.1" - eslint-plugin-react-native: "npm:^4.0.0" + eslint-plugin-react-native: "npm:^5.0.0" peerDependencies: - eslint: ">=8" + eslint: ^8.0.0 || ^9.0.0 prettier: ">=2" - checksum: 10/57499395d2438257830aa745da0b5ce520a8c5bded4b300c6b86fbc5695a56ffe2d684559071066ec04686b2c7a1bfb688913ade7f0754ac9dff03871964a63b + checksum: 10/4965bd7fcc34fc470ad8cb92a94568612f59efbc515ab4225ba3f5751f74ace84cdb7f7322349ba7546f6a448c3daebd252c065f7e9de6fe54dae7c056253883 languageName: node linkType: hard -"@react-native/eslint-plugin@npm:0.83.0": - version: 0.83.0 - resolution: "@react-native/eslint-plugin@npm:0.83.0" - checksum: 10/aa62a1157094926b1cc616ad73887045a189b63e8d3d9b021633019ff92f1bbe5188b5f3c9cd110ea4c33cd3f696ab6b578ed3c1b347f6dc48adef2cf1cb3ecc +"@react-native/eslint-plugin@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/eslint-plugin@npm:0.85.0" + checksum: 10/303dc290a410ffb17b6cf0db272cefd9888e99e4467693215b4ab7a82ee099b31ef7b025da352956a227a04630baffe3beb340a1d03e14b7979c244441f334c8 languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.83.6": - version: 0.83.6 - resolution: "@react-native/gradle-plugin@npm:0.83.6" - checksum: 10/b2d83f8277edd931e0ff228698e1ec6aefffcd71fa93cf23b9564b5a72788e8fbccc13543eb89f9510781ae86e5041e517d5f8f3e04a5a48925580edb0ab12a0 +"@react-native/gradle-plugin@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/gradle-plugin@npm:0.85.0" + checksum: 10/17879f55468445845256138b4658fdb38fad7c1ea2d7838d1f8af88dd240594573915bba77bcbf40b033d6299c67a9bcef912dcf2d81eca21a344bf12e616763 languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.83.0": - version: 0.83.0 - resolution: "@react-native/js-polyfills@npm:0.83.0" - checksum: 10/ce6b4d7586cb3abf866437f1590b496ab288bf19e4e4b9e58e5f6ccddb57926825cecad244ed80004f6624ad8a2b624c77becb3107c59cc27101791bf1807556 +"@react-native/jest-preset@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/jest-preset@npm:0.85.0" + dependencies: + "@jest/create-cache-key-function": "npm:^29.7.0" + "@react-native/js-polyfills": "npm:0.85.0" + babel-jest: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + regenerator-runtime: "npm:^0.13.2" + peerDependencies: + react: ^19.2.3 + checksum: 10/f9cfb6245c55366fdc03dc2c32965c1409a183ea680c3d5b4a12b0c6ffe8d07c3f9acd287c9529537eb454d6e1f2e4b804d4677ddb42f0e34d4364baf322872c languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.83.6": - version: 0.83.6 - resolution: "@react-native/js-polyfills@npm:0.83.6" - checksum: 10/455dd7f69ec7b187790c3a2db1bc128199cf340ea36702ebaaee87d37c20dbbcbf75c69c0c91e82f4b320af9bb7a70fe537b0842454f2add2040902edfdaf164 +"@react-native/js-polyfills@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/js-polyfills@npm:0.85.0" + checksum: 10/89fc6affadcb665053d7e2ffc3877a101b53635b8da370d2643fe37e766c4ab2e3a7d0c03fb6e85684494a46d8e4c568a83c893bc2bad346dc4b660afb8d5eb2 languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.83.0": - version: 0.83.0 - resolution: "@react-native/metro-babel-transformer@npm:0.83.0" +"@react-native/metro-babel-transformer@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/metro-babel-transformer@npm:0.85.0" dependencies: "@babel/core": "npm:^7.25.2" - "@react-native/babel-preset": "npm:0.83.0" - hermes-parser: "npm:0.32.0" + "@react-native/babel-preset": "npm:0.85.0" + hermes-parser: "npm:0.33.3" nullthrows: "npm:^1.1.1" peerDependencies: "@babel/core": "*" - checksum: 10/b87885155d6809ae5171a793a036e17b2c0489d1d5326f4852b07abedd6d8ee316c93466db451818d85f9f783dfd5652ece349a7bea9a9762e3eb829cc5598f8 + checksum: 10/2bc30eeadfdd60dfa215f4bd3eb22176246e243e50a1e4d3cd66678dda9ca748590f520837c5174af630a474a34dd362309d9b9455229a3dedb1340378d62d21 languageName: node linkType: hard -"@react-native/metro-config@npm:0.83.0": - version: 0.83.0 - resolution: "@react-native/metro-config@npm:0.83.0" +"@react-native/metro-config@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/metro-config@npm:0.85.0" dependencies: - "@react-native/js-polyfills": "npm:0.83.0" - "@react-native/metro-babel-transformer": "npm:0.83.0" - metro-config: "npm:^0.83.3" - metro-runtime: "npm:^0.83.3" - checksum: 10/7316d21730443a38195ec1222c1de27a09b219c310d1bc057e0b9a9af503213d71ec9df387c65bbc3cadbb0b4dd1d5ee9958ab3b6b499d1f71a281c13e522614 + "@react-native/js-polyfills": "npm:0.85.0" + "@react-native/metro-babel-transformer": "npm:0.85.0" + metro-config: "npm:^0.84.0" + metro-runtime: "npm:^0.84.0" + checksum: 10/4f34d2a5f243c88ff982a4d0970334d64c1ba95578895a2af4833f72e1d5b1adad317958b2dccbb48ef890cca98820485b4237d8ee1faf88bc7db5404e35d85b languageName: node linkType: hard @@ -13173,6 +13207,13 @@ __metadata: languageName: node linkType: hard +"@react-native/normalize-colors@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/normalize-colors@npm:0.85.0" + checksum: 10/510281bdcec47adf885eaf7917b4dc79f3f8da3c6e8f6007ec946664374a6e5228f6dc936903e9788d018d1d3c8595fdeb78f346b40d810ceb5a42097ad1832d + languageName: node + linkType: hard + "@react-native/normalize-colors@npm:^0.73.0": version: 0.73.2 resolution: "@react-native/normalize-colors@npm:0.73.2" @@ -13180,27 +13221,27 @@ __metadata: languageName: node linkType: hard -"@react-native/typescript-config@npm:0.83.0": - version: 0.83.0 - resolution: "@react-native/typescript-config@npm:0.83.0" - checksum: 10/ad256ffa3602a34539b5f94886c1ce7960537d6992a28d7bbc833996139394081dfbe2ae9f2e40cb505050e8d6c1c9d841330928218281637e34c1b9c5aa0366 +"@react-native/typescript-config@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/typescript-config@npm:0.85.0" + checksum: 10/89a17726b54f603505089cd9304413a3554f1bc41560a58268780a43a073090dd7299677c6efc4bead51bfb89a8291eedff29840539318cb73128e9a1800ef27 languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.83.6": - version: 0.83.6 - resolution: "@react-native/virtualized-lists@npm:0.83.6" +"@react-native/virtualized-lists@npm:0.85.0": + version: 0.85.0 + resolution: "@react-native/virtualized-lists@npm:0.85.0" dependencies: invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" peerDependencies: "@types/react": ^19.2.0 react: "*" - react-native: "*" + react-native: 0.85.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/1f888e09f09a16071978fc7e2c7aa69a2a212fbaf82fae69e74ecd181d8aa0e878a3942e42557bf3dc73e8c93e0f98b7c52fe30836228b33803e3053e39fb1dc + checksum: 10/fa2f5d49b0f92d6543b02a4586a4303a8921026333a3cbf6e87ddaf1ff8fecfc0f5793b0289745e71dc00cc988bbc2e96069282d69592f0e853b6dc8703b5e20 languageName: node linkType: hard @@ -23039,6 +23080,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:0.33.3": + version: 0.33.3 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.33.3" + dependencies: + hermes-parser: "npm:0.33.3" + checksum: 10/250394dbe9fc7b6b2235ed7d0eaed287c811fbb79ab122a6d1a74f212dd85307273a06ae72e0b7f164f908f57d93f45f06183236f51d9fc704083cc67bce78c6 + languageName: node + linkType: hard + "babel-plugin-syntax-hermes-parser@npm:^0.32.0": version: 0.32.1 resolution: "babel-plugin-syntax-hermes-parser@npm:0.32.1" @@ -24673,6 +24723,19 @@ __metadata: languageName: node linkType: hard +"chromium-edge-launcher@npm:^0.3.0": + version: 0.3.0 + resolution: "chromium-edge-launcher@npm:0.3.0" + dependencies: + "@types/node": "npm:*" + escape-string-regexp: "npm:^4.0.0" + is-wsl: "npm:^2.2.0" + lighthouse-logger: "npm:^1.0.0" + mkdirp: "npm:^1.0.4" + checksum: 10/1df5a42cb8bbcc01486b8ab4739341d493075e09715c2039fb2646056d6a6e533048a4274e53b7c4dcd477f205133e3dd4d8d095e0caaf08cefc2dc2627af9dc + languageName: node + linkType: hard + "ci-info@npm:^2.0.0": version: 2.0.0 resolution: "ci-info@npm:2.0.0" @@ -28287,6 +28350,17 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react-native@npm:^5.0.0": + version: 5.0.0 + resolution: "eslint-plugin-react-native@npm:5.0.0" + dependencies: + eslint-plugin-react-native-globals: "npm:^0.1.1" + peerDependencies: + eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 10/41e84d806b74e3b4906c5541cad0caf1c79e30031130a1f3e92f9c030fb12e9ee4b193ea7b6ed5c425f2d83795e7f3ca51ab357e7e8f1f3d89c12fd4613343be + languageName: node + linkType: hard + "eslint-plugin-react@npm:7.34.1": version: 7.34.1 resolution: "eslint-plugin-react@npm:7.34.1" @@ -28315,7 +28389,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react@npm:^7.30.1": +"eslint-plugin-react@npm:^7.37.5": version: 7.37.5 resolution: "eslint-plugin-react@npm:7.37.5" dependencies: @@ -31450,10 +31524,10 @@ __metadata: languageName: node linkType: hard -"hermes-compiler@npm:0.14.1": - version: 0.14.1 - resolution: "hermes-compiler@npm:0.14.1" - checksum: 10/dbb0f4886532b26262721fa34de5947502b265cea8574f6094915abf59d31c757da6a41730cb6f6d088ec7607d659e8b4036782d227dcf072e9a49152bbef756 +"hermes-compiler@npm:250829098.0.10": + version: 250829098.0.10 + resolution: "hermes-compiler@npm:250829098.0.10" + checksum: 10/7687ad73483d6f25e9056da647ade37e434dbb7f85700f0900f902078c106c9b0498a064446191347d16c20cf29c083f560805179caf49af21b12b8b6be1f16b languageName: node linkType: hard @@ -31485,6 +31559,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.33.3": + version: 0.33.3 + resolution: "hermes-estree@npm:0.33.3" + checksum: 10/dfaac7eb91e282cf04f26c8f557fcadbfb78f630062c7abc1e75b9765918103ebee1359dffbe6c5e42a52c7cee0b14420affda984d534f76ba3d7e8d9ba98215 + languageName: node + linkType: hard + "hermes-estree@npm:0.35.0": version: 0.35.0 resolution: "hermes-estree@npm:0.35.0" @@ -31519,6 +31600,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.33.3": + version: 0.33.3 + resolution: "hermes-parser@npm:0.33.3" + dependencies: + hermes-estree: "npm:0.33.3" + checksum: 10/709dac7283a9eab706f3fff5c6f09deee5197a1a38751da66fdf499a307120ba3ef14ce734715430a838145531973a8c0b69874bf5bc615cca10059ee87f5ff3 + languageName: node + linkType: hard + "hermes-parser@npm:0.35.0": version: 0.35.0 resolution: "hermes-parser@npm:0.35.0" @@ -35634,9 +35724,9 @@ __metadata: "@react-native-async-storage/async-storage": "npm:2.2.0" "@react-native-clipboard/clipboard": "npm:^1.16.1" "@react-native-community/checkbox": "npm:^0.5.20" - "@react-native-community/cli": "npm:20.0.0" - "@react-native-community/cli-platform-android": "npm:20.0.0" - "@react-native-community/cli-platform-ios": "npm:20.0.0" + "@react-native-community/cli": "npm:20.1.0" + "@react-native-community/cli-platform-android": "npm:20.1.0" + "@react-native-community/cli-platform-ios": "npm:20.1.0" "@react-native-community/cli-server-api": "npm:^17.0.0" "@react-native-community/datetimepicker": "npm:^8.5.1" "@react-native-community/netinfo": "npm:11.5.2" @@ -35645,10 +35735,11 @@ __metadata: "@react-native-firebase/app": "npm:^20.5.0" "@react-native-firebase/messaging": "npm:^20.5.0" "@react-native-masked-view/masked-view": "npm:^0.3.1" - "@react-native/babel-preset": "npm:0.83.0" - "@react-native/eslint-config": "npm:0.83.0" - "@react-native/metro-config": "npm:0.83.0" - "@react-native/typescript-config": "npm:0.83.0" + "@react-native/babel-preset": "npm:0.85.0" + "@react-native/eslint-config": "npm:0.85.0" + "@react-native/jest-preset": "npm:0.85.0" + "@react-native/metro-config": "npm:0.85.0" + "@react-native/typescript-config": "npm:0.85.0" "@react-navigation/bottom-tabs": "npm:^6.5.0" "@react-navigation/native": "npm:^6.1.0" "@react-navigation/native-stack": "npm:^6.0.0" @@ -35838,10 +35929,10 @@ __metadata: qs: "npm:6.15.2" query-string: "npm:^6.12.1" randomfill: "npm:^1.0.4" - react: "npm:19.2.0" + react: "npm:19.2.3" react-compiler-runtime: "npm:^19.1.0-rc.2" react-dom: "npm:19.2.0" - react-native: "patch:react-native@npm%3A0.83.6#~/.yarn/patches/react-native-npm-0.83.6-106e10c49d.patch" + react-native: "npm:0.85.0" react-native-aes-crypto: "npm:3.0.3" react-native-aes-crypto-forked: "patch:react-native-aes-crypto-forked@https%3A//github.com/MetaMask/react-native-aes-crypto-forked.git%23397d5db5250e8e7408294807965b5b9fd4ca6a25#~/.yarn/patches/react-native-aes-crypto-forked-https-9ebec3d485.patch" react-native-animatable: "npm:^1.3.3" @@ -35913,7 +36004,7 @@ __metadata: react-native-vision-camera: "npm:^4.7.3" react-native-worklets: "patch:react-native-worklets@npm%3A0.7.4#~/.yarn/patches/react-native-worklets-npm-0.7.4-072a5d46f9.patch" react-redux: "npm:^8.1.3" - react-test-renderer: "npm:19.2.0" + react-test-renderer: "npm:19.2.3" reactotron-react-native: "npm:^5.1.14" readable-stream: "npm:2.3.7" reassure: "npm:^1.4.0" @@ -35999,6 +36090,19 @@ __metadata: languageName: node linkType: hard +"metro-babel-transformer@npm:0.84.4": + version: 0.84.4 + resolution: "metro-babel-transformer@npm:0.84.4" + dependencies: + "@babel/core": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + hermes-parser: "npm:0.35.0" + metro-cache-key: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + checksum: 10/5e3c1b49d88db6e6219f3c47a1fa61dd6cf38def566d9f24a430a8117853009fb0e3f975c7fa5aa20c7af7f142b37ef37b4a22838f0d18324a92002237630fad + languageName: node + linkType: hard + "metro-cache-key@npm:0.83.7": version: 0.83.7 resolution: "metro-cache-key@npm:0.83.7" @@ -36008,6 +36112,15 @@ __metadata: languageName: node linkType: hard +"metro-cache-key@npm:0.84.4": + version: 0.84.4 + resolution: "metro-cache-key@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/381f330ec25ad3823ae843e5c21ed75aa5e34f4c92231aead526f4936f4280e1a73977a8d10fecc2b1ef8f11fc884323a76b650a93c699d6b02c706c17eea7ca + languageName: node + linkType: hard + "metro-cache@npm:0.83.7": version: 0.83.7 resolution: "metro-cache@npm:0.83.7" @@ -36020,7 +36133,19 @@ __metadata: languageName: node linkType: hard -"metro-config@npm:0.83.7, metro-config@npm:^0.83.3, metro-config@npm:^0.83.6": +"metro-cache@npm:0.84.4": + version: 0.84.4 + resolution: "metro-cache@npm:0.84.4" + dependencies: + exponential-backoff: "npm:^3.1.1" + flow-enums-runtime: "npm:^0.0.6" + https-proxy-agent: "npm:^7.0.5" + metro-core: "npm:0.84.4" + checksum: 10/e59dcc3c691b545ce574383ef22576e8d3e5b8e5e7ea9fbe9e0070d8d36406705c01458c30b4a31ca3b810e43082cd3a1948d389cbb13552f170c336dc651b7e + languageName: node + linkType: hard + +"metro-config@npm:0.83.7": version: 0.83.7 resolution: "metro-config@npm:0.83.7" dependencies: @@ -36036,7 +36161,23 @@ __metadata: languageName: node linkType: hard -"metro-core@npm:0.83.7, metro-core@npm:^0.83.6": +"metro-config@npm:0.84.4, metro-config@npm:^0.84.0": + version: 0.84.4 + resolution: "metro-config@npm:0.84.4" + dependencies: + connect: "npm:^3.6.5" + flow-enums-runtime: "npm:^0.0.6" + jest-validate: "npm:^29.7.0" + metro: "npm:0.84.4" + metro-cache: "npm:0.84.4" + metro-core: "npm:0.84.4" + metro-runtime: "npm:0.84.4" + yaml: "npm:^2.6.1" + checksum: 10/54c61d4794dcbe5444e65ef3bb28325449f143afd9972e1093d13871472ee9086094c38daf3735fc688448ab13b60e7800623f3cf5685063f7983956a5f55fcd + languageName: node + linkType: hard + +"metro-core@npm:0.83.7": version: 0.83.7 resolution: "metro-core@npm:0.83.7" dependencies: @@ -36047,6 +36188,17 @@ __metadata: languageName: node linkType: hard +"metro-core@npm:0.84.4, metro-core@npm:^0.84.0": + version: 0.84.4 + resolution: "metro-core@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + lodash.throttle: "npm:^4.1.1" + metro-resolver: "npm:0.84.4" + checksum: 10/9ee8513522277c5fe00a8d1ef6b698763b9fd2bd2cdc90786617eef36896d3e1e778a0fd8aadd42027d5ca222a54056e734a51f5adb321195878f06341692713 + languageName: node + linkType: hard + "metro-file-map@npm:0.83.7": version: 0.83.7 resolution: "metro-file-map@npm:0.83.7" @@ -36064,6 +36216,23 @@ __metadata: languageName: node linkType: hard +"metro-file-map@npm:0.84.4": + version: 0.84.4 + resolution: "metro-file-map@npm:0.84.4" + dependencies: + debug: "npm:^4.4.0" + fb-watchman: "npm:^2.0.0" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + nullthrows: "npm:^1.1.1" + walker: "npm:^1.0.7" + checksum: 10/ab4d01e5ab78cc78682603b8eaf68e45ccc00fe5e440e4e69d7e6102f79a13e126da3692ae6f3d4b379a8b05b284498fa18d10b1f9447046068e1aa1b658b2db + languageName: node + linkType: hard + "metro-minify-terser@npm:0.83.7": version: 0.83.7 resolution: "metro-minify-terser@npm:0.83.7" @@ -36074,6 +36243,16 @@ __metadata: languageName: node linkType: hard +"metro-minify-terser@npm:0.84.4": + version: 0.84.4 + resolution: "metro-minify-terser@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + terser: "npm:^5.15.0" + checksum: 10/e0893b5672a4ad2bc6e2c492f9994a3eae6e633e49f2e5a52738e80260e37bb5143219ce2c337c22dd16cee850e68b99d1ba4bc378d7cc8e9cd60d636aa051b5 + languageName: node + linkType: hard + "metro-react-native-babel-preset@npm:0.76.9, metro-react-native-babel-preset@npm:~0.76.9": version: 0.76.9 resolution: "metro-react-native-babel-preset@npm:0.76.9" @@ -36147,7 +36326,16 @@ __metadata: languageName: node linkType: hard -"metro-runtime@npm:0.83.7, metro-runtime@npm:^0.83.3, metro-runtime@npm:^0.83.6": +"metro-resolver@npm:0.84.4": + version: 0.84.4 + resolution: "metro-resolver@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/2234b8820ebebc70ae9688e3f4e4ec031f59bfefe51cd6171f7ce2063d97308663021292dccb2f34d80806d685f7f2583834eb718c8d5465a0385687f14b3996 + languageName: node + linkType: hard + +"metro-runtime@npm:0.83.7": version: 0.83.7 resolution: "metro-runtime@npm:0.83.7" dependencies: @@ -36157,7 +36345,17 @@ __metadata: languageName: node linkType: hard -"metro-source-map@npm:0.83.7, metro-source-map@npm:^0.83.6": +"metro-runtime@npm:0.84.4, metro-runtime@npm:^0.84.0": + version: 0.84.4 + resolution: "metro-runtime@npm:0.84.4" + dependencies: + "@babel/runtime": "npm:^7.25.0" + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/8c5818fdc67bd8ece9fc16bdcc848e115c76289f41b397efe30e401590dc04e36a4ea5af126682648f3b689ffbee27da20ba27ed261021aa4d222b75a40f353f + languageName: node + linkType: hard + +"metro-source-map@npm:0.83.7": version: 0.83.7 resolution: "metro-source-map@npm:0.83.7" dependencies: @@ -36174,6 +36372,23 @@ __metadata: languageName: node linkType: hard +"metro-source-map@npm:0.84.4, metro-source-map@npm:^0.84.0": + version: 0.84.4 + resolution: "metro-source-map@npm:0.84.4" + dependencies: + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-symbolicate: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + ob1: "npm:0.84.4" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + checksum: 10/675a4df8a85ef411a58cb334932bda6f8bd87a8e031f73ac1dfd76cfe89ebbe994c167fc36b66fc550c09e7bef1cfe405c5693ae4c20198db9753b6a7acae4fd + languageName: node + linkType: hard + "metro-symbolicate@npm:0.83.7": version: 0.83.7 resolution: "metro-symbolicate@npm:0.83.7" @@ -36190,6 +36405,22 @@ __metadata: languageName: node linkType: hard +"metro-symbolicate@npm:0.84.4": + version: 0.84.4 + resolution: "metro-symbolicate@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-source-map: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + bin: + metro-symbolicate: src/index.js + checksum: 10/a6aebc3a604aebd1c83dc090249c4f91f2bad25bcdd48c05c5f0cfc56ad223ac2c1ba558123b68ba6c3e97de7515d81b6ba9b048012746395f3eb68a9e90a189 + languageName: node + linkType: hard + "metro-transform-plugins@npm:0.83.7": version: 0.83.7 resolution: "metro-transform-plugins@npm:0.83.7" @@ -36204,6 +36435,20 @@ __metadata: languageName: node linkType: hard +"metro-transform-plugins@npm:0.84.4": + version: 0.84.4 + resolution: "metro-transform-plugins@npm:0.84.4" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + nullthrows: "npm:^1.1.1" + checksum: 10/ae83306fbb640392205e571ddfb69629ec6d2878d664de85da2150d23458949dba833feef03759d9b15a13c0a50b4191ede41c685d12554c16fb8d56609292d6 + languageName: node + linkType: hard + "metro-transform-worker@npm:0.83.7": version: 0.83.7 resolution: "metro-transform-worker@npm:0.83.7" @@ -36225,7 +36470,28 @@ __metadata: languageName: node linkType: hard -"metro@npm:0.83.7, metro@npm:^0.83.6": +"metro-transform-worker@npm:0.84.4": + version: 0.84.4 + resolution: "metro-transform-worker@npm:0.84.4" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + metro: "npm:0.84.4" + metro-babel-transformer: "npm:0.84.4" + metro-cache: "npm:0.84.4" + metro-cache-key: "npm:0.84.4" + metro-minify-terser: "npm:0.84.4" + metro-source-map: "npm:0.84.4" + metro-transform-plugins: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + checksum: 10/bacccf7a3a051a2216490b221c63f16db97f35845232c0bd32edd211f82befa93b319fd6eb00df47595c24b6d7c3ec1851849773ff532de96c76b931709faa2b + languageName: node + linkType: hard + +"metro@npm:0.83.7": version: 0.83.7 resolution: "metro@npm:0.83.7" dependencies: @@ -36274,6 +36540,55 @@ __metadata: languageName: node linkType: hard +"metro@npm:0.84.4, metro@npm:^0.84.0": + version: 0.84.4 + resolution: "metro@npm:0.84.4" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + accepts: "npm:^2.0.0" + ci-info: "npm:^2.0.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + error-stack-parser: "npm:^2.0.6" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + hermes-parser: "npm:0.35.0" + image-size: "npm:^1.0.2" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + jsc-safe-url: "npm:^0.2.2" + lodash.throttle: "npm:^4.1.1" + metro-babel-transformer: "npm:0.84.4" + metro-cache: "npm:0.84.4" + metro-cache-key: "npm:0.84.4" + metro-config: "npm:0.84.4" + metro-core: "npm:0.84.4" + metro-file-map: "npm:0.84.4" + metro-resolver: "npm:0.84.4" + metro-runtime: "npm:0.84.4" + metro-source-map: "npm:0.84.4" + metro-symbolicate: "npm:0.84.4" + metro-transform-plugins: "npm:0.84.4" + metro-transform-worker: "npm:0.84.4" + mime-types: "npm:^3.0.1" + nullthrows: "npm:^1.1.1" + serialize-error: "npm:^2.1.0" + source-map: "npm:^0.5.6" + throat: "npm:^5.0.0" + ws: "npm:^7.5.10" + yargs: "npm:^17.6.2" + bin: + metro: src/cli.js + checksum: 10/22369963a965398add8e79939852b6a8906565d81bcb2a764255526fc8548417aed2976e315ec44cc432e104ea03afc616879449a0a9e4c292cfe0e9f252649d + languageName: node + linkType: hard + "micro-ftch@npm:^0.3.1": version: 0.3.1 resolution: "micro-ftch@npm:0.3.1" @@ -37627,6 +37942,15 @@ __metadata: languageName: node linkType: hard +"ob1@npm:0.84.4": + version: 0.84.4 + resolution: "ob1@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/15621cfa2d6bb196c5046031b3f85259735a245d9d7087f41758be3c31589c464e6eef53d94ec3d680fd8286ef08944782b9112f18d790a99421fbc7e311bb32 + languageName: node + linkType: hard + "object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -39891,7 +40215,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^19.0.0, react-is@npm:^19.2.0": +"react-is@npm:^19.0.0, react-is@npm:^19.2.3": version: 19.2.7 resolution: "react-is@npm:19.2.7" checksum: 10/ae0d3ae7638aa2fa2a82a78a817daf2806e57fa0aef357d07e1e8d1e9a301902e5967168e9334b5816db0df8fa980a725cd57569ba5a9e6e76a71e117b18be04 @@ -40932,33 +41256,29 @@ __metadata: languageName: node linkType: hard -"react-native@npm:0.83.6": - version: 0.83.6 - resolution: "react-native@npm:0.83.6" +"react-native@npm:0.85.0": + version: 0.85.0 + resolution: "react-native@npm:0.85.0" dependencies: - "@jest/create-cache-key-function": "npm:^29.7.0" - "@react-native/assets-registry": "npm:0.83.6" - "@react-native/codegen": "npm:0.83.6" - "@react-native/community-cli-plugin": "npm:0.83.6" - "@react-native/gradle-plugin": "npm:0.83.6" - "@react-native/js-polyfills": "npm:0.83.6" - "@react-native/normalize-colors": "npm:0.83.6" - "@react-native/virtualized-lists": "npm:0.83.6" + "@react-native/assets-registry": "npm:0.85.0" + "@react-native/codegen": "npm:0.85.0" + "@react-native/community-cli-plugin": "npm:0.85.0" + "@react-native/gradle-plugin": "npm:0.85.0" + "@react-native/js-polyfills": "npm:0.85.0" + "@react-native/normalize-colors": "npm:0.85.0" + "@react-native/virtualized-lists": "npm:0.85.0" abort-controller: "npm:^3.0.0" anser: "npm:^1.4.9" ansi-regex: "npm:^5.0.0" - babel-jest: "npm:^29.7.0" - babel-plugin-syntax-hermes-parser: "npm:0.32.0" + babel-plugin-syntax-hermes-parser: "npm:0.33.3" base64-js: "npm:^1.5.1" commander: "npm:^12.0.0" flow-enums-runtime: "npm:^0.0.6" - glob: "npm:^7.1.1" - hermes-compiler: "npm:0.14.1" + hermes-compiler: "npm:250829098.0.10" invariant: "npm:^2.2.4" - jest-environment-node: "npm:^29.7.0" memoize-one: "npm:^5.0.0" - metro-runtime: "npm:^0.83.6" - metro-source-map: "npm:^0.83.6" + metro-runtime: "npm:^0.84.0" + metro-source-map: "npm:^0.84.0" nullthrows: "npm:^1.1.1" pretty-format: "npm:^29.7.0" promise: "npm:^8.3.0" @@ -40968,69 +41288,22 @@ __metadata: scheduler: "npm:0.27.0" semver: "npm:^7.1.3" stacktrace-parser: "npm:^0.1.10" + tinyglobby: "npm:^0.2.15" whatwg-fetch: "npm:^3.0.0" ws: "npm:^7.5.10" yargs: "npm:^17.6.2" peerDependencies: + "@react-native/jest-preset": 0.85.0 "@types/react": ^19.1.1 - react: ^19.2.0 + react: ^19.2.3 peerDependenciesMeta: - "@types/react": + "@react-native/jest-preset": optional: true - bin: - react-native: cli.js - checksum: 10/d57fc43d7a7c9e0e55efac941ebe6d5781f91d28db8f78eba822e74fe5decdc1f5a8f024b18d79dc08928e8dbc374469df1a910aa58f2241e2e7c637f1366f20 - languageName: node - linkType: hard - -"react-native@patch:react-native@npm%3A0.83.6#~/.yarn/patches/react-native-npm-0.83.6-106e10c49d.patch": - version: 0.83.6 - resolution: "react-native@patch:react-native@npm%3A0.83.6#~/.yarn/patches/react-native-npm-0.83.6-106e10c49d.patch::version=0.83.6&hash=4643c8" - dependencies: - "@jest/create-cache-key-function": "npm:^29.7.0" - "@react-native/assets-registry": "npm:0.83.6" - "@react-native/codegen": "npm:0.83.6" - "@react-native/community-cli-plugin": "npm:0.83.6" - "@react-native/gradle-plugin": "npm:0.83.6" - "@react-native/js-polyfills": "npm:0.83.6" - "@react-native/normalize-colors": "npm:0.83.6" - "@react-native/virtualized-lists": "npm:0.83.6" - abort-controller: "npm:^3.0.0" - anser: "npm:^1.4.9" - ansi-regex: "npm:^5.0.0" - babel-jest: "npm:^29.7.0" - babel-plugin-syntax-hermes-parser: "npm:0.32.0" - base64-js: "npm:^1.5.1" - commander: "npm:^12.0.0" - flow-enums-runtime: "npm:^0.0.6" - glob: "npm:^7.1.1" - hermes-compiler: "npm:0.14.1" - invariant: "npm:^2.2.4" - jest-environment-node: "npm:^29.7.0" - memoize-one: "npm:^5.0.0" - metro-runtime: "npm:^0.83.6" - metro-source-map: "npm:^0.83.6" - nullthrows: "npm:^1.1.1" - pretty-format: "npm:^29.7.0" - promise: "npm:^8.3.0" - react-devtools-core: "npm:^6.1.5" - react-refresh: "npm:^0.14.0" - regenerator-runtime: "npm:^0.13.2" - scheduler: "npm:0.27.0" - semver: "npm:^7.1.3" - stacktrace-parser: "npm:^0.1.10" - whatwg-fetch: "npm:^3.0.0" - ws: "npm:^7.5.10" - yargs: "npm:^17.6.2" - peerDependencies: - "@types/react": ^19.1.1 - react: ^19.2.0 - peerDependenciesMeta: "@types/react": optional: true bin: react-native: cli.js - checksum: 10/cbbfa9c834201ebd15bb60a382b608a8a31ef84a35278a1e3d1471441c761e05656ef881562b8ed3d2a7060d8c80c613bc31e4d0499615b01985895dade25b07 + checksum: 10/b318060f72eb95c5754eb8875d32b68245e13ea276a5a2ef61ec66a2514c6aab4639140930f846b62ca92d1d282a9495f0628194f2d0f3326cd32272fd311383 languageName: node linkType: hard @@ -41177,15 +41450,15 @@ __metadata: languageName: node linkType: hard -"react-test-renderer@npm:19.2.0": - version: 19.2.0 - resolution: "react-test-renderer@npm:19.2.0" +"react-test-renderer@npm:19.2.3": + version: 19.2.3 + resolution: "react-test-renderer@npm:19.2.3" dependencies: - react-is: "npm:^19.2.0" + react-is: "npm:^19.2.3" scheduler: "npm:^0.27.0" peerDependencies: - react: ^19.2.0 - checksum: 10/1a072bf5c383ee9cec1eed5872114a25d8029e8fabe17a9154cbb7b5d6e5570711efc3e80e336d170bb1f60e29d395087147891fa198743d17c29ff86782cde3 + react: ^19.2.3 + checksum: 10/a9de4d869b1555a54c02e8701be262dfa669eb366ff5cdb43ba49fa516beae439cbec2c3e5606c909e773c232328993e231b393af5eef25e87a845d4c7fb00dc languageName: node linkType: hard @@ -41218,10 +41491,10 @@ __metadata: languageName: node linkType: hard -"react@npm:19.2.0": - version: 19.2.0 - resolution: "react@npm:19.2.0" - checksum: 10/e13bcdb8e994c3cfa922743cb75ca8deb60531bf02f584d2d8dab940a8132ce8a2e6ef16f8ed7f372b4072e7a7eeff589b2812dabbedfa73e6e46201dac8a9d0 +"react@npm:19.2.3": + version: 19.2.3 + resolution: "react@npm:19.2.3" + checksum: 10/d16b7f35c0d35a56f63d9d1693819762e4abc479c57dd6310298920bed3820fcec7e17a99d44983416d8f5049143ea45b8005d3ab8324bae8973224400502b08 languageName: node linkType: hard