diff --git a/__mocks__/react-native.ts b/__mocks__/react-native.ts index 0d53bb3e38b4..c4e318a2131b 100644 --- a/__mocks__/react-native.ts +++ b/__mocks__/react-native.ts @@ -88,7 +88,9 @@ jest.doMock('react-native', () => { }, }, }, - ReactNative, + // The actual module, not the `import * as` namespace: Babel's wildcard interop copies only enumerable exports, and + // React Native 0.88 re-exports `Touchable` (still read by react-native-svg) as a non-enumerable property. + jest.requireActual('react-native'), ) as ReactNativeMock; return reactNativeMock; diff --git a/android/app/build.gradle b/android/app/build.gradle index 258868501e3a..ad7bbd7ba27c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -214,6 +214,19 @@ afterEvaluate { } } +// litert-support is an empty wrapper (no classes or resources) around litert-support-api and litert, and it declares +// the same org.tensorflow.lite.support namespace as litert-support-api, which AGP 9 rejects. Onfido depends on the wrapper +// and on litert directly, so resolving the wrapper to litert-support-api keeps the same classes. +// This can be removed once we migrate to @entrust.corporation/idvsdk-reactnative. +configurations.configureEach { + resolutionStrategy.eachDependency { details -> + if (details.requested.group == "com.google.ai.edge.litert" && details.requested.name == "litert-support") { + details.useTarget("com.google.ai.edge.litert:litert-support-api:${details.requested.version}") + details.because("litert-support duplicates the litert-support-api namespace") + } + } +} + dependencies { // The version of react-native is set by the React Native Gradle Plugin implementation("com.facebook.react:react-android") diff --git a/android/build.gradle b/android/build.gradle index 4e0199cc73fa..4ca14aef118d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { - buildToolsVersion = "36.0.0" + buildToolsVersion = "37.0.0" minSdkVersion = 24 compileSdkVersion = 37 targetSdkVersion = 36 @@ -39,6 +39,14 @@ buildscript { } +// RN088: unify ndkVersion. AGP 9 defaults libraries without their own ndkVersion to NDK 28.x, whose libc++ needs +// __cxa_init_primary_exception, while React Native (and this app) build with NDK 27.1 and ship that libc++_shared.so. +subprojects { sp -> + sp.plugins.withId('com.android.library') { + sp.android.ndkVersion = rootProject.ext.ndkVersion + } +} + allprojects { configurations.all { resolutionStrategy { diff --git a/android/gradle.properties b/android/gradle.properties index ccec9ab1f86f..cda3c6872de0 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -68,3 +68,11 @@ patchedArtifacts.forceBuildFromSource=false # This allows your app to draw behind system bars for an immersive UI. # Note: Only works with ReactActivity and should not be used with custom Activity. edgeToEdgeEnabled=true + +# AGP 9 defaults, turned off as in the RN 0.88 template: +# - builtInKotlin: many libraries (e.g. react-native-webview, react-native-vision-camera, @rnmapbox/maps, the nitro modules, +# and our own modules in modules/) still apply the kotlin-android plugin unconditionally, which fails with built-in Kotlin. +# - newDsl: app/build.gradle, Mobile-Expensify, @onfido/react-native-sdk and react-native-blob-util still use the legacy +# applicationVariants/libraryVariants API, which the new DSL removes. +android.builtInKotlin=false +android.newDsl=false diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 37f78a6af837..c61a118f7ddb 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-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/config/rsbuild/rsbuild.common.ts b/config/rsbuild/rsbuild.common.ts index 3d545f381378..a4668f13368d 100644 --- a/config/rsbuild/rsbuild.common.ts +++ b/config/rsbuild/rsbuild.common.ts @@ -192,6 +192,13 @@ const getSharedConfiguration = ({file = '.env', isDevServer = false}: Environmen 'victory-native': path.resolve(dirname, '../../node_modules/victory-native/src/index.ts'), // Required for @shopify/react-native-skia web support 'react-native/Libraries/Image/AssetRegistry': false, + // RN 0.87+ moved the asset registry into core (react-native/asset-registry, a Flow file) and no longer + // depends on @react-native/assets-registry. expo-asset/expo-image import the new path, react-native-svg + // still imports the old package. On web both should resolve to react-native-web's registry. + // Drop the @react-native/assets-registry alias (and the package in package.json and knip.json) once + // react-native-svg stops importing it on web: https://github.com/software-mansion/react-native-svg/issues/3087 + 'react-native/asset-registry': 'react-native-web/dist/modules/AssetRegistry', + '@react-native/assets-registry/registry': 'react-native-web/dist/modules/AssetRegistry', // @sentry/react-native references the optional expo-updates module. We do not install it, // so web/Storybook bundles should treat it as unavailable instead of failing resolution. 'expo-updates': false, diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 9a9c57fd8ebf..9104b03face2 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -699,8 +699,6 @@ "${PODS_XCFRAMEWORKS_BUILD_DIR}/Onfido/Onfido.framework/Onfido", "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL", "${PODS_XCFRAMEWORKS_BUILD_DIR}/Plaid/LinkKit.framework/LinkKit", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/React-Core-prebuilt/React.framework/React", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/ReactNativeDependencies/ReactNativeDependencies.framework/ReactNativeDependencies", "${PODS_XCFRAMEWORKS_BUILD_DIR}/Turf/Turf.framework/Turf", "${PODS_XCFRAMEWORKS_BUILD_DIR}/group-ib-fp/GIBMobileSdk.framework/GIBMobileSdk", "${PODS_XCFRAMEWORKS_BUILD_DIR}/group-ib-fp/FPAppsCapability.framework/FPAppsCapability", @@ -717,8 +715,6 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Onfido.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LinkKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/React.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactNativeDependencies.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Turf.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GIBMobileSdk.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FPAppsCapability.framework", @@ -817,13 +813,17 @@ "${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn/GoogleSignIn.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/RNPermissions/RNPermissionsPrivacyInfo.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-timing/React-timing_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/TrustKit/TrustKit.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/LottiePrivacyInfo.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/lottie-react-native/Lottie_React_Native_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", @@ -847,13 +847,17 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNPermissionsPrivacyInfo.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-timing_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TrustKit.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/LottiePrivacyInfo.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Lottie_React_Native_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", @@ -1041,6 +1045,14 @@ "${PODS_ROOT}/React-renderercss", "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/textlayoutmanager/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/text/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/textinput/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/switch/iosswitch", + "${PODS_CONFIGURATION_BUILD_DIR}/React-bridging/React_bridging.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxstableapi/React_cxxstableapi.framework/Headers", ); IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD = ""; @@ -2321,6 +2333,14 @@ "${PODS_ROOT}/React-renderercss", "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/textlayoutmanager/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/text/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/textinput/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/switch/iosswitch", + "${PODS_CONFIGURATION_BUILD_DIR}/React-bridging/React_bridging.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxstableapi/React_cxxstableapi.framework/Headers", ); IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD = ""; @@ -2425,6 +2445,14 @@ "${PODS_ROOT}/React-renderercss", "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/textlayoutmanager/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/text/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/textinput/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/switch/iosswitch", + "${PODS_CONFIGURATION_BUILD_DIR}/React-bridging/React_bridging.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxstableapi/React_cxxstableapi.framework/Headers", ); IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD = ""; @@ -2537,6 +2565,14 @@ "${PODS_ROOT}/React-renderercss", "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/textlayoutmanager/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/text/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/textinput/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/switch/iosswitch", + "${PODS_CONFIGURATION_BUILD_DIR}/React-bridging/React_bridging.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxstableapi/React_cxxstableapi.framework/Headers", ); IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD = ""; @@ -2688,6 +2724,14 @@ "${PODS_ROOT}/React-renderercss", "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/textlayoutmanager/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/text/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/textinput/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/switch/iosswitch", + "${PODS_CONFIGURATION_BUILD_DIR}/React-bridging/React_bridging.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxstableapi/React_cxxstableapi.framework/Headers", ); IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD = ""; @@ -2832,6 +2876,14 @@ "${PODS_ROOT}/React-renderercss", "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/textlayoutmanager/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/text/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/textinput/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/switch/iosswitch", + "${PODS_CONFIGURATION_BUILD_DIR}/React-bridging/React_bridging.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxstableapi/React_cxxstableapi.framework/Headers", ); IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD = ""; @@ -2975,6 +3027,14 @@ "${PODS_ROOT}/React-renderercss", "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/scrollview/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/textlayoutmanager/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/text/platform/cxx", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/textinput/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/components/switch/iosswitch", + "${PODS_CONFIGURATION_BUILD_DIR}/React-bridging/React_bridging.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxstableapi/React_cxxstableapi.framework/Headers", ); IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD = ""; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index be010cde2e8e..e49633d5a1ec 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -27,13 +27,22 @@ PODS: - AppAuth/ExternalUserAgent (1.7.6): - AppAuth/Core - AppLogs (0.1.0) + - boost (1.84.0) - callstack-repack (5.4.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - JWTDecode (~> 3.0.0) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -46,19 +55,27 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - SwiftyRSA (~> 1.7) - Yoga - - EXConstants (57.0.7): + - DoubleConversion (1.1.6) + - EXConstants (58.0.12): - ExpoModulesCore - expensify-react-native-background-task (0.0.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -71,17 +88,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - ExpensifyNitroUtils (0.0.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - NitroModules + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -94,18 +118,25 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - Expo (57.0.8): + - Expo (58.0.14): + - boost + - DoubleConversion - ExpoModulesCore - ExpoModulesJSI + - fast_float + - fmt + - glog - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -120,41 +151,48 @@ PODS: - React-utils - ReactAppDependencyProvider - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - ExpoAsset (57.0.7): + - ExpoAsset (58.0.16): - ExpoModulesCore - - ExpoAudio (57.0.3): + - ExpoAudio (58.0.9): - ExpoModulesCore - - ExpoDomWebView (57.0.1): + - ExpoDomWebView (58.0.2): - ExpoModulesCore - - ExpoFont (57.0.1): + - ExpoFont (58.0.8): - ExpoModulesCore - - ExpoGlassEffect (57.0.4): + - ExpoGlassEffect (58.0.5): - ExpoModulesCore - - ExpoImage (57.0.1): + - ExpoImage (58.0.15): - ExpoModulesCore - libavif/libdav1d - SDWebImage (~> 5.21.0) - SDWebImageAVIFCoder (~> 0.11.0) - SDWebImageSVGCoder (~> 1.7.0) - SDWebImageWebPCoder (~> 0.14.6) - - ExpoImageManipulator (57.0.6): + - ExpoImageManipulator (58.0.14): - ExpoModulesCore - SDWebImageWebPCoder - - ExpoLocation (57.0.6): + - ExpoLocation (58.0.17): - ExpoModulesCore - - ExpoLogBox (57.0.1): + - ExpoLogBox (58.0.12): - React-Core - - ExpoModulesCore (57.0.15): + - ExpoModulesCore (58.0.29): + - boost + - DoubleConversion - ExpoModulesJSI + - fast_float + - fmt + - glog - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -168,31 +206,31 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - ExpoModulesJSI (57.0.8): + - ExpoModulesJSI (58.0.21): - React-Core - ReactCommon - - ExpoModulesWorklets (57.0.15): + - ExpoModulesWorklets (58.0.29): - ExpoModulesCore - ExpoModulesJSI - - ExpoModulesWorkletsAdapter (57.0.15): + - ExpoModulesWorkletsAdapter (58.0.29): - ExpoModulesCore - ExpoModulesJSI - ExpoModulesWorklets - RNWorklets - - ExpoStoreReview (57.0.1): + - ExpoStoreReview (58.0.2): - ExpoModulesCore - - ExpoTaskManager (57.0.6): + - ExpoTaskManager (58.0.12): - ExpoModulesCore - UMAppLoader - - ExpoVideo (57.0.2): + - ExpoVideo (58.0.11): - ExpoModulesCore - - ExpoWebBrowser (57.0.2): + - ExpoWebBrowser (58.0.6): - ExpoModulesCore - - FBLazyVector (0.86.0) + - fast_float (8.0.0) + - FBLazyVector (0.88.0) - Firebase/Analytics (11.13.0): - Firebase/Core - Firebase/Core (11.13.0): @@ -229,15 +267,24 @@ PODS: - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) + - fmt (12.1.0) - ForkInputMask (7.3.3) - FullStory (1.76.0) - fullstory_react-native (1.10.2): + - boost + - DoubleConversion + - fast_float + - fmt - FullStory (~> 1.14) + - glog - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -250,10 +297,10 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga + - glog (0.3.5) - GoogleAppMeasurement (11.13.0): - GoogleAppMeasurement/AdIdSupport (= 11.13.0) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) @@ -306,11 +353,19 @@ PODS: - GoogleUtilities/Logger - GoogleUtilities/Privacy - group-ib-fp (2.6.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -323,18 +378,17 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - GTMAppAuth (4.1.1): - AppAuth/Core (~> 1.7) - GTMSessionFetcher/Core (< 4.0, >= 3.3) - GTMSessionFetcher/Core (3.5.0) - GzipSwift (5.1.1) - - hermes-engine (250829098.0.14): - - hermes-engine/Pre-built (= 250829098.0.14) - - hermes-engine/Pre-built (250829098.0.14) + - hermes-engine (260318099.0.4): + - hermes-engine/Pre-built (= 260318099.0.4) + - hermes-engine/Pre-built (260318099.0.4) - JWTDecode (3.0.1) - libavif/core (0.11.1) - libavif/libdav1d (0.11.1): @@ -355,12 +409,20 @@ PODS: - libwebp/sharpyuv - lottie-ios (4.6.0) - lottie-react-native (7.3.8): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - lottie-ios (= 4.6.0) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -373,9 +435,8 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - MapboxCommon (24.23.1): - Turf (= 4.0.0) @@ -391,13 +452,21 @@ PODS: - nanopb/decode (3.30910.0) - nanopb/encode (3.30910.0) - NitroFetch (1.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - NitroModules + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-callinvoker - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -410,18 +479,25 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - NitroImage (0.15.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - NitroModules + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-callinvoker - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -434,17 +510,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - NitroModules (0.37.1): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-callinvoker - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -457,9 +540,8 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - NWWebSocket (0.5.10) - Onfido (32.6.2) @@ -476,14 +558,22 @@ PODS: - NWWebSocket (~> 0.5.7) - TweetNacl (~> 1.0.0) - QuickCrypto (1.1.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - NitroModules - OpenSSL-Universal (~> 3.6.2000) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-callinvoker - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -496,38 +586,78 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - RCTDeprecation (0.86.0) - - RCTRequired (0.86.0) - - RCTSwiftUI (0.86.0) - - RCTSwiftUIWrapper (0.86.0): + - RCT-Folly (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 12.1.0) + - glog + - RCT-Folly/Default (= 2024.11.18.00) + - RCT-Folly/Default (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 12.1.0) + - glog + - RCT-Folly/Fabric (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 12.1.0) + - glog + - RCTDeprecation (0.88.0) + - RCTRequired (0.88.0) + - RCTSwiftUI (0.88.0) + - RCTSwiftUIWrapper (0.88.0): - RCTSwiftUI - - RCTTypeSafety (0.86.0): - - FBLazyVector (= 0.86.0) - - RCTRequired (= 0.86.0) - - React-Core (= 0.86.0) - - React (0.86.0): - - React-Core (= 0.86.0) - - React-Core/DevSupport (= 0.86.0) - - React-Core/RCTWebSocket (= 0.86.0) - - React-RCTActionSheet (= 0.86.0) - - React-RCTAnimation (= 0.86.0) - - React-RCTBlob (= 0.86.0) - - React-RCTImage (= 0.86.0) - - React-RCTLinking (= 0.86.0) - - React-RCTNetwork (= 0.86.0) - - React-RCTSettings (= 0.86.0) - - React-RCTText (= 0.86.0) - - React-RCTVibration (= 0.86.0) - - React-callinvoker (0.86.0) - - React-Core (0.86.0): - - hermes-engine + - RCTTypeSafety (0.88.0): + - FBLazyVector (= 0.88.0) + - RCTRequired (= 0.88.0) + - React-Core (= 0.88.0) + - React (0.88.0): + - React-Core (= 0.88.0) + - React-Core/DevSupport (= 0.88.0) + - React-Core/RCTWebSocket (= 0.88.0) + - React-RCTActionSheet (= 0.88.0) + - React-RCTAnimation (= 0.88.0) + - React-RCTBlob (= 0.88.0) + - React-RCTImage (= 0.88.0) + - React-RCTLinking (= 0.88.0) + - React-RCTNetwork (= 0.88.0) + - React-RCTSettings (= 0.88.0) + - React-RCTText (= 0.88.0) + - React-RCTVibration (= 0.88.0) + - React-bridging (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-jsi + - React-timing + - SocketRocket + - React-callinvoker (0.88.0): + - React-callinvoker/callinvokerUmbrella (= 0.88.0) + - React-cxxstableapi + - React-callinvoker/callinvokerUmbrella (0.88.0): + - React-cxxstableapi + - React-Core (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - - React-Core/Default (= 0.86.0) + - React-Core/Default (= 0.88.0) - React-cxxreact - React-featureflags - React-hermes @@ -541,14 +671,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core-prebuilt (0.86.0): - - ReactNativeDependencies - - React-Core/CoreModulesHeaders (0.86.0): - - hermes-engine + - React-Core/CoreModulesHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -563,12 +697,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/Default (0.86.0): - - hermes-engine + - React-Core/Default (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-cxxreact - React-featureflags - React-hermes @@ -582,14 +722,20 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/DevSupport (0.86.0): - - hermes-engine + - React-Core/DevSupport (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - - React-Core/Default (= 0.86.0) - - React-Core/RCTWebSocket (= 0.86.0) + - React-Core/Default (= 0.88.0) + - React-Core/RCTWebSocket (= 0.88.0) - React-cxxreact - React-featureflags - React-hermes @@ -603,12 +749,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTActionSheetHeaders (0.86.0): - - hermes-engine + - React-Core/RCTActionSheetHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -623,12 +775,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTAnimationHeaders (0.86.0): - - hermes-engine + - React-Core/RCTAnimationHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -643,12 +801,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTBlobHeaders (0.86.0): - - hermes-engine + - React-Core/RCTBlobHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -663,12 +827,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTImageHeaders (0.86.0): - - hermes-engine + - React-Core/RCTImageHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -683,12 +853,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTLinkingHeaders (0.86.0): - - hermes-engine + - React-Core/RCTLinkingHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -703,12 +879,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTNetworkHeaders (0.86.0): - - hermes-engine + - React-Core/RCTNetworkHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -723,12 +905,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTSettingsHeaders (0.86.0): - - hermes-engine + - React-Core/RCTSettingsHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -743,12 +931,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTTextHeaders (0.86.0): - - hermes-engine + - React-Core/RCTTextHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -763,12 +957,18 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTVibrationHeaders (0.86.0): - - hermes-engine + - React-Core/RCTVibrationHeaders (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -783,13 +983,19 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Core/RCTWebSocket (0.86.0): - - hermes-engine + - React-Core/RCTWebSocket (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTDeprecation - - React-Core-prebuilt - - React-Core/Default (= 0.86.0) + - React-Core/Default (= 0.88.0) - React-cxxreact - React-featureflags - React-hermes @@ -803,47 +1009,74 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-CoreModules (0.86.0): - - RCTTypeSafety (= 0.86.0) - - React-Core-prebuilt - - React-Core/CoreModulesHeaders (= 0.86.0) + - React-CoreModules (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety (= 0.88.0) + - React-Core/CoreModulesHeaders (= 0.88.0) - React-debug - React-featureflags - - React-jsi (= 0.86.0) + - React-jsi (= 0.88.0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-NativeModulesApple + - React-networking - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.86.0) + - React-RCTImage (= 0.88.0) - React-runtimeexecutor - React-utils - ReactCommon - - ReactNativeDependencies - - React-cxxreact (0.86.0): - - hermes-engine - - React-callinvoker (= 0.86.0) - - React-Core-prebuilt - - React-debug (= 0.86.0) - - React-jsi (= 0.86.0) + - SocketRocket + - React-cxxreact (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.88.0) + - React-debug (= 0.88.0) + - React-jserrorhandler (= 0.88.0) + - React-jsi (= 0.88.0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.86.0) - - React-perflogger (= 0.86.0) + - React-logger (= 0.88.0) + - React-perflogger (= 0.88.0) - React-runtimeexecutor - - React-timing (= 0.86.0) - - React-utils - - ReactNativeDependencies - - React-debug (0.86.0): - - React-debug/redbox (= 0.86.0) - - React-debug/redbox (0.86.0) - - React-defaultsnativemodule (0.86.0): - - hermes-engine - - React-Core-prebuilt + - React-timing (= 0.88.0) + - React-utils + - SocketRocket + - React-cxxstableapi (0.88.0) + - React-debug (0.88.0): + - React-cxxstableapi + - React-debug/debugUmbrella (= 0.88.0) + - React-debug/redbox (= 0.88.0) + - React-debug/debugUmbrella (0.88.0): + - React-cxxstableapi + - React-debug/redbox (0.88.0): + - React-cxxstableapi + - React-defaultsnativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-domnativemodule - React-Fabric/animated - React-featureflags @@ -855,13 +1088,22 @@ PODS: - React-microtasksnativemodule - React-mutationobservernativemodule - React-RCTFBReactNativeSpec + - React-resizeobservernativemodule - React-viewtransitionnativemodule - React-webperformancenativemodule - - ReactNativeDependencies + - SocketRocket - Yoga - - React-domnativemodule (0.86.0): - - hermes-engine - - React-Core-prebuilt + - React-domnativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging + - React-cxxstableapi - React-Fabric - React-Fabric/bridging - React-FabricComponents @@ -871,35 +1113,43 @@ PODS: - React-RCTFBReactNativeSpec - React-runtimeexecutor - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Fabric (0.86.0): - - hermes-engine + - React-Fabric (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - - React-Fabric/animated (= 0.86.0) - - React-Fabric/animationbackend (= 0.86.0) - - React-Fabric/animations (= 0.86.0) - - React-Fabric/attributedstring (= 0.86.0) - - React-Fabric/bridging (= 0.86.0) - - React-Fabric/componentregistry (= 0.86.0) - - React-Fabric/componentregistrynative (= 0.86.0) - - React-Fabric/components (= 0.86.0) - - React-Fabric/consistency (= 0.86.0) - - React-Fabric/core (= 0.86.0) - - React-Fabric/dom (= 0.86.0) - - React-Fabric/imagemanager (= 0.86.0) - - React-Fabric/leakchecker (= 0.86.0) - - React-Fabric/mounting (= 0.86.0) - - React-Fabric/observers (= 0.86.0) - - React-Fabric/scheduler (= 0.86.0) - - React-Fabric/telemetry (= 0.86.0) - - React-Fabric/uimanager (= 0.86.0) - - React-Fabric/viewtransition (= 0.86.0) + - React-Fabric/animated (= 0.88.0) + - React-Fabric/animationbackend (= 0.88.0) + - React-Fabric/animations (= 0.88.0) + - React-Fabric/attributedstring (= 0.88.0) + - React-Fabric/bridging (= 0.88.0) + - React-Fabric/componentregistry (= 0.88.0) + - React-Fabric/componentregistrynative (= 0.88.0) + - React-Fabric/components (= 0.88.0) + - React-Fabric/consistency (= 0.88.0) + - React-Fabric/core (= 0.88.0) + - React-Fabric/dom (= 0.88.0) + - React-Fabric/imagemanager (= 0.88.0) + - React-Fabric/leakchecker (= 0.88.0) + - React-Fabric/mounting (= 0.88.0) + - React-Fabric/observers (= 0.88.0) + - React-Fabric/scheduler (= 0.88.0) + - React-Fabric/telemetry (= 0.88.0) + - React-Fabric/uimanager (= 0.88.0) + - React-Fabric/viewtransition (= 0.88.0) - React-featureflags - React-graphics - React-jsi @@ -910,14 +1160,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/animated (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/animated (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric/animationbackend - React-featureflags @@ -930,14 +1188,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/animationbackend (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/animationbackend (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -949,14 +1215,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/animations (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/animations (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -968,14 +1242,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/attributedstring (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/attributedstring (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -987,14 +1269,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/bridging (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/bridging (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1006,14 +1296,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/componentregistry (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/componentregistry (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1025,14 +1323,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/componentregistrynative (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/componentregistrynative (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1044,19 +1350,28 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/components (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.86.0) - - React-Fabric/components/root (= 0.86.0) - - React-Fabric/components/scrollview (= 0.86.0) - - React-Fabric/components/view (= 0.86.0) + - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0) + - React-Fabric/components/root (= 0.88.0) + - React-Fabric/components/scrollview (= 0.88.0) + - React-Fabric/components/view (= 0.88.0) + - React-Fabric/components/viewUmbrella (= 0.88.0) - React-featureflags - React-graphics - React-jsi @@ -1067,14 +1382,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components/legacyviewmanagerinterop (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/components/legacyviewmanagerinterop (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1086,14 +1409,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components/root (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/components/root (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1105,14 +1436,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components/scrollview (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/components/scrollview (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1124,14 +1463,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components/view (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/components/view (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1144,15 +1491,23 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-Fabric/consistency (0.86.0): - - hermes-engine + - React-Fabric/components/viewUmbrella (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1164,14 +1519,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/core (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/consistency (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1183,14 +1546,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/dom (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/core (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1202,14 +1573,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/imagemanager (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/dom (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1221,14 +1600,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/leakchecker (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/imagemanager (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1240,14 +1627,49 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/mounting (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/leakchecker (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-cxxreact + - React-cxxstableapi + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/mounting (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1260,18 +1682,27 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/observers (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/observers (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - - React-Fabric/observers/events (= 0.86.0) - - React-Fabric/observers/intersection (= 0.86.0) - - React-Fabric/observers/mutation (= 0.86.0) + - React-Fabric/observers/events (= 0.88.0) + - React-Fabric/observers/intersection (= 0.88.0) + - React-Fabric/observers/mutation (= 0.88.0) + - React-Fabric/observers/resize (= 0.88.0) - React-featureflags - React-graphics - React-jsi @@ -1282,14 +1713,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/observers/events (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/observers/events (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1301,14 +1740,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/observers/intersection (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/observers/intersection (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1320,14 +1767,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/observers/mutation (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/observers/mutation (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1339,79 +1794,110 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/scheduler (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/observers/resize (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - - React-Fabric/animationbackend - - React-Fabric/observers/events - - React-Fabric/viewtransition - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - - React-performancecdpmetrics - - React-performancetimeline - React-rendererdebug - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/telemetry (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/scheduler (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug + - React-Fabric/animationbackend + - React-Fabric/observers/events + - React-Fabric/viewtransition - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-performancecdpmetrics + - React-performancetimeline - React-rendererdebug - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/uimanager (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/telemetry (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - - React-Fabric/uimanager/consistency (= 0.86.0) - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - - React-rendererconsistency - React-rendererdebug - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/uimanager/consistency (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/uimanager (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug + - React-Fabric/uimanager/consistency (= 0.88.0) - React-featureflags - React-graphics - React-jsi @@ -1423,69 +1909,80 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/viewtransition (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/uimanager/consistency (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-rendererconsistency - React-rendererdebug - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-FabricComponents (0.86.0): - - hermes-engine + - SocketRocket + - React-Fabric/viewtransition (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - - React-Fabric - - React-FabricComponents/components (= 0.86.0) - - React-FabricComponents/textlayoutmanager (= 0.86.0) - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - - React-RCTFBReactNativeSpec - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components (0.86.0): - - hermes-engine + - SocketRocket + - React-FabricComponents (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.86.0) - - React-FabricComponents/components/iostextinput (= 0.86.0) - - React-FabricComponents/components/modal (= 0.86.0) - - React-FabricComponents/components/rncore (= 0.86.0) - - React-FabricComponents/components/safeareaview (= 0.86.0) - - React-FabricComponents/components/scrollview (= 0.86.0) - - React-FabricComponents/components/switch (= 0.86.0) - - React-FabricComponents/components/text (= 0.86.0) - - React-FabricComponents/components/textinput (= 0.86.0) - - React-FabricComponents/components/unimplementedview (= 0.86.0) - - React-FabricComponents/components/virtualview (= 0.86.0) + - React-FabricComponents/components (= 0.88.0) + - React-FabricComponents/textlayoutmanager (= 0.88.0) - React-featureflags - React-graphics - React-jsi @@ -1496,17 +1993,34 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/inputaccessory (0.86.0): - - hermes-engine + - React-FabricComponents/components (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.88.0) + - React-FabricComponents/components/iostextinput (= 0.88.0) + - React-FabricComponents/components/modal (= 0.88.0) + - React-FabricComponents/components/rncore (= 0.88.0) + - React-FabricComponents/components/safeareaview (= 0.88.0) + - React-FabricComponents/components/switch (= 0.88.0) + - React-FabricComponents/components/text (= 0.88.0) + - React-FabricComponents/components/textinput (= 0.88.0) + - React-FabricComponents/components/unimplementedview (= 0.88.0) + - React-FabricComponents/components/virtualview (= 0.88.0) - React-featureflags - React-graphics - React-jsi @@ -1517,15 +2031,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/iostextinput (0.86.0): - - hermes-engine + - React-FabricComponents/components/inputaccessory (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1538,15 +2059,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/modal (0.86.0): - - hermes-engine + - React-FabricComponents/components/iostextinput (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1559,15 +2087,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/rncore (0.86.0): - - hermes-engine + - React-FabricComponents/components/modal (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1580,15 +2115,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/safeareaview (0.86.0): - - hermes-engine + - React-FabricComponents/components/rncore (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1601,15 +2143,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/scrollview (0.86.0): - - hermes-engine + - React-FabricComponents/components/safeareaview (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1622,15 +2171,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/switch (0.86.0): - - hermes-engine + - React-FabricComponents/components/switch (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1643,15 +2199,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/text (0.86.0): - - hermes-engine + - React-FabricComponents/components/text (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1664,15 +2227,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/textinput (0.86.0): - - hermes-engine + - React-FabricComponents/components/textinput (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1685,15 +2255,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/unimplementedview (0.86.0): - - hermes-engine + - React-FabricComponents/components/unimplementedview (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1706,15 +2283,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/components/virtualview (0.86.0): - - hermes-engine + - React-FabricComponents/components/virtualview (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1727,15 +2311,22 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricComponents/textlayoutmanager (0.86.0): - - hermes-engine + - React-FabricComponents/textlayoutmanager (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1748,83 +2339,151 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-FabricImage (0.86.0): - - hermes-engine - - RCTRequired (= 0.86.0) - - RCTTypeSafety (= 0.86.0) - - React-Core-prebuilt + - React-FabricImage (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired (= 0.88.0) + - RCTTypeSafety (= 0.88.0) + - React-cxxstableapi - React-Fabric - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.86.0) + - React-jsiexecutor (= 0.88.0) - React-logger - React-rendererdebug - React-utils - ReactCommon - - ReactNativeDependencies + - SocketRocket - Yoga - - React-featureflags (0.86.0): - - React-Core-prebuilt - - ReactNativeDependencies - - React-featureflagsnativemodule (0.86.0): - - hermes-engine - - React-Core-prebuilt + - React-featureflags (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi + - React-featureflags/featureflagsUmbrella (= 0.88.0) + - SocketRocket + - React-featureflags/featureflagsUmbrella (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi + - SocketRocket + - React-featureflagsnativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-featureflags - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-graphics (0.86.0): + - SocketRocket + - React-graphics (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - - React-Core-prebuilt + - RCT-Folly + - RCT-Folly/Fabric - React-featureflags - React-jsi - React-jsiexecutor - React-rendererdebug - React-utils - - ReactNativeDependencies - - React-hermes (0.86.0): + - SocketRocket + - React-hermes (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - - React-Core-prebuilt - - React-cxxreact (= 0.86.0) + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.88.0) + - React-cxxstableapi - React-jsi - - React-jsiexecutor (= 0.86.0) + - React-jsiexecutor (= 0.88.0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-oscompat - - React-perflogger (= 0.86.0) + - React-perflogger (= 0.88.0) - React-runtimeexecutor - - ReactNativeDependencies - - React-idlecallbacksnativemodule (0.86.0): - - hermes-engine - - React-Core-prebuilt + - SocketRocket + - React-idlecallbacksnativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging + - React-cxxstableapi - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - React-runtimeexecutor - React-runtimescheduler - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-ImageManager (0.86.0): - - React-Core-prebuilt + - SocketRocket + - React-ImageManager (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric - React-Core/Default + - React-cxxstableapi - React-debug - React-Fabric - React-graphics - React-rendererdebug - React-utils - - ReactNativeDependencies - - React-intersectionobservernativemodule (0.86.0): - - hermes-engine - - React-Core-prebuilt + - SocketRocket + - React-intersectionobservernativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging - React-cxxreact + - React-cxxstableapi - React-Fabric - React-Fabric/bridging - React-graphics @@ -1834,25 +2493,44 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-jserrorhandler (0.86.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxreact + - React-jserrorhandler (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging + - React-cxxstableapi - React-debug - React-featureflags - React-jsi - - ReactCommon/turbomodule/bridging - - ReactNativeDependencies - - React-jsi (0.86.0): - - hermes-engine - - React-Core-prebuilt - - ReactNativeDependencies - - React-jsiexecutor (0.86.0): - - hermes-engine - - React-Core-prebuilt + - SocketRocket + - React-jsi (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsiexecutor (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - React-cxxreact + - React-cxxstableapi - React-debug - React-jserrorhandler - React-jsi @@ -1863,69 +2541,143 @@ PODS: - React-perflogger - React-runtimeexecutor - React-utils - - ReactNativeDependencies - - React-jsinspector (0.86.0): + - SocketRocket + - React-jsinspector (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - - React-Core-prebuilt + - RCT-Folly + - RCT-Folly/Fabric - React-featureflags - React-jsi - React-jsinspectorcdp - React-jsinspectornetwork - React-jsinspectortracing - React-oscompat - - React-perflogger (= 0.86.0) + - React-perflogger (= 0.88.0) - React-runtimeexecutor - React-utils - - ReactNativeDependencies - - React-jsinspectorcdp (0.86.0): - - React-Core-prebuilt - - ReactNativeDependencies - - React-jsinspectornetwork (0.86.0): - - React-Core-prebuilt + - SocketRocket + - React-jsinspectorcdp (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi + - SocketRocket + - React-jsinspectornetwork (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-jsinspectorcdp - - ReactNativeDependencies - - React-jsinspectortracing (0.86.0): - - hermes-engine - - React-Core-prebuilt + - SocketRocket + - React-jsinspectortracing (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-jsi - React-jsinspectornetwork - React-oscompat - React-timing - React-utils - - ReactNativeDependencies - - React-jsitooling (0.86.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxreact (= 0.86.0) + - SocketRocket + - React-jsitooling (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.88.0) + - React-cxxstableapi - React-debug - - React-jsi (= 0.86.0) + - React-jsi (= 0.88.0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-runtimeexecutor - React-utils - - ReactNativeDependencies - - React-jsitracing (0.86.0): - - React-jsi - - React-logger (0.86.0): - - React-Core-prebuilt - - ReactNativeDependencies - - React-Mapbuffer (0.86.0): - - React-Core-prebuilt + - SocketRocket + - React-jsitracing (0.88.0): + - React-jsi + - React-logger (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-Mapbuffer (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-debug - - ReactNativeDependencies - - React-microtasksnativemodule (0.86.0): - - hermes-engine - - React-Core-prebuilt + - React-Mapbuffer/mapbufferUmbrella (= 0.88.0) + - SocketRocket + - React-Mapbuffer/mapbufferUmbrella (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi + - React-debug + - SocketRocket + - React-microtasksnativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-mutationobservernativemodule (0.86.0): - - hermes-engine - - React-Core-prebuilt + - SocketRocket + - React-mutationobservernativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging - React-cxxreact + - React-cxxstableapi - React-Fabric - React-Fabric/bridging - React-Fabric/observers/mutation @@ -1935,15 +2687,23 @@ PODS: - React-RCTFBReactNativeSpec - React-runtimeexecutor - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-advanced-input-mask (1.4.6): + - boost + - DoubleConversion + - fast_float + - fmt - ForkInputMask (~> 7.3.2) + - glog - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1956,17 +2716,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-airship (26.7.0): - AirshipFrameworkProxy (= 15.10.0) - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1979,16 +2746,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-app-logs (0.3.1): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2001,16 +2775,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-blob-util (0.24.12): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2023,16 +2804,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-cameraroll (7.4.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2045,18 +2833,25 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-config (1.5.3): - react-native-config/App (= 1.5.3) - react-native-config/App (1.5.3): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2069,16 +2864,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - react-native-document-picker (10.1.3): - - hermes-engine + - react-native-document-picker (12.0.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2091,16 +2893,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-image-picker (7.1.2): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2113,16 +2922,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-key-command (1.0.14): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2135,16 +2951,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-keyboard-controller (1.22.4): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2158,16 +2981,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-keyboard-controller/common (1.22.4): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2180,16 +3010,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-netinfo (11.4.1): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2202,16 +3039,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-pager-view (9.0.4): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2224,17 +3068,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - SwiftUIIntrospect (~> 1.0) - Yoga - react-native-pdf (7.0.2): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2247,17 +3098,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-plaid-link-sdk (12.5.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - Plaid (~> 6.4.0) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2270,16 +3128,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-quick-base64 (3.0.1): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2292,16 +3157,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-safe-area-context (5.9.1): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2316,16 +3188,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-safe-area-context/common (5.9.1): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2338,16 +3217,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-safe-area-context/fabric (5.9.1): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2361,18 +3247,25 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-skia (2.11.2): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React + - React-bridging - React-callinvoker - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2385,16 +3278,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-view-shot (5.1.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2407,16 +3307,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-wallet (0.1.41): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2429,16 +3336,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - react-native-webview (16.0.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2451,15 +3365,21 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-NativeModulesApple (0.86.0): - - hermes-engine + - React-NativeModulesApple (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging - React-callinvoker - React-Core - - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -2467,41 +3387,89 @@ PODS: - React-jsinspector - React-jsinspectorcdp - React-runtimeexecutor - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-networking (0.86.0): - - React-Core-prebuilt + - SocketRocket + - React-networking (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-jsinspectornetwork - React-jsinspectortracing - React-performancetimeline - React-timing - - ReactNativeDependencies - - React-oscompat (0.86.0) - - React-perflogger (0.86.0): - - React-Core-prebuilt - - ReactNativeDependencies - - React-performancecdpmetrics (0.86.0): - - hermes-engine - - React-Core-prebuilt + - SocketRocket + - React-oscompat (0.88.0): + - React-cxxstableapi + - React-perflogger (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-performancecdpmetrics (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-jsi - React-performancetimeline - React-runtimeexecutor - React-timing - - ReactNativeDependencies - - React-performancetimeline (0.86.0): - - React-Core-prebuilt + - SocketRocket + - React-performancetimeline (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-featureflags - React-jsinspector - React-jsinspectortracing - React-perflogger - React-timing - - ReactNativeDependencies - - React-RCTActionSheet (0.86.0): - - React-Core/RCTActionSheetHeaders (= 0.86.0) - - React-RCTAnimation (0.86.0): + - SocketRocket + - React-RCTActionSheet (0.88.0): + - React-Core/RCTActionSheetHeaders (= 0.88.0) + - React-RCTAnimatedModuleProvider (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-Fabric/animated + - React-featureflags + - ReactCommon + - SocketRocket + - Yoga + - React-RCTAnimation (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric - RCTTypeSafety - - React-Core-prebuilt - React-Core/RCTAnimationHeaders - React-debug - React-featureflags @@ -2509,13 +3477,19 @@ PODS: - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactNativeDependencies - - React-RCTAppDelegate (0.86.0): - - hermes-engine + - SocketRocket + - React-RCTAppDelegate (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-Core-prebuilt - React-CoreModules - React-debug - React-defaultsnativemodule @@ -2525,9 +3499,11 @@ PODS: - React-hermes - React-jsitooling - React-NativeModulesApple + - React-RCTAnimatedModuleProvider - React-RCTFabric - React-RCTFBReactNativeSpec - React-RCTImage + - React-RCTLinking - React-RCTNetwork - React-RCTRuntime - React-rendererdebug @@ -2537,10 +3513,16 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon - - ReactNativeDependencies - - React-RCTBlob (0.86.0): - - hermes-engine - - React-Core-prebuilt + - SocketRocket + - React-RCTBlob (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - React-Core/RCTBlobHeaders - React-Core/RCTWebSocket - React-jsi @@ -2550,12 +3532,19 @@ PODS: - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - ReactNativeDependencies - - React-RCTFabric (0.86.0): - - hermes-engine + - SocketRocket + - React-RCTFabric (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTSwiftUIWrapper - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-FabricComponents @@ -2580,25 +3569,40 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies + - SocketRocket - Yoga - - React-RCTFBReactNativeSpec (0.86.0): - - hermes-engine + - React-RCTFBReactNativeSpec (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-jsi - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 0.86.0) + - React-RCTFBReactNativeSpec/components (= 0.88.0) - ReactCommon - - ReactNativeDependencies - - React-RCTFBReactNativeSpec/components (0.86.0): - - hermes-engine + - SocketRocket + - React-RCTFBReactNativeSpec/components (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2608,28 +3612,40 @@ PODS: - React-rendererdebug - React-utils - ReactCommon - - ReactNativeDependencies + - SocketRocket - Yoga - - React-RCTImage (0.86.0): + - React-RCTImage (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric - RCTTypeSafety - - React-Core-prebuilt - React-Core/RCTImageHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - ReactNativeDependencies - - React-RCTLinking (0.86.0): - - React-Core/RCTLinkingHeaders (= 0.86.0) - - React-jsi (= 0.86.0) + - SocketRocket + - React-RCTLinking (0.88.0): + - React-Core/RCTLinkingHeaders (= 0.88.0) + - React-jsi (= 0.88.0) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.86.0) - - React-RCTNetwork (0.86.0): + - ReactCommon/turbomodule/core (= 0.88.0) + - React-RCTNetwork (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric - RCTTypeSafety - - React-Core-prebuilt - React-Core/RCTNetworkHeaders - React-debug - React-featureflags @@ -2640,11 +3656,17 @@ PODS: - React-networking - React-RCTFBReactNativeSpec - ReactCommon - - ReactNativeDependencies - - React-RCTRuntime (0.86.0): - - hermes-engine + - SocketRocket + - React-RCTRuntime (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - React-Core - - React-Core-prebuilt - React-debug - React-jsi - React-jsinspector @@ -2656,42 +3678,91 @@ PODS: - React-runtimeexecutor - React-RuntimeHermes - React-utils - - ReactNativeDependencies - - React-RCTSettings (0.86.0): + - SocketRocket + - React-RCTSettings (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric - RCTTypeSafety - - React-Core-prebuilt - React-Core/RCTSettingsHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactNativeDependencies - - React-RCTText (0.86.0): - - React-Core/RCTTextHeaders (= 0.86.0) + - SocketRocket + - React-RCTText (0.88.0): + - React-Core/RCTTextHeaders (= 0.88.0) - Yoga - - React-RCTVibration (0.86.0): - - React-Core-prebuilt + - React-RCTVibration (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric - React-Core/RCTVibrationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactNativeDependencies - - React-rendererconsistency (0.86.0) - - React-renderercss (0.86.0): + - SocketRocket + - React-rendererconsistency (0.88.0) + - React-renderercss (0.88.0): - React-debug - React-utils - - React-rendererdebug (0.86.0): - - React-Core-prebuilt + - React-rendererdebug (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric - React-debug - - ReactNativeDependencies - - React-RuntimeApple (0.86.0): - - hermes-engine + - SocketRocket + - React-resizeobservernativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging + - React-cxxreact + - React-cxxstableapi + - React-Fabric + - React-Fabric/bridging + - React-Fabric/observers/resize + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-RuntimeApple (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - React-callinvoker - - React-Core-prebuilt - React-Core/Default - React-CoreModules - React-cxxreact + - React-cxxstableapi - React-featureflags - React-jserrorhandler - React-jsi @@ -2707,11 +3778,18 @@ PODS: - React-RuntimeHermes - React-runtimescheduler - React-utils - - ReactNativeDependencies - - React-RuntimeCore (0.86.0): + - SocketRocket + - React-RuntimeCore (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - - React-Core-prebuilt + - RCT-Folly + - RCT-Folly/Fabric - React-cxxreact + - React-cxxstableapi - React-Fabric - React-featureflags - React-jserrorhandler @@ -2723,17 +3801,30 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactNativeDependencies - - React-runtimeexecutor (0.86.0): - - React-Core-prebuilt + - SocketRocket + - React-runtimeexecutor (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric - React-debug - React-featureflags - - React-jsi (= 0.86.0) + - React-jsi (= 0.88.0) - React-utils - - ReactNativeDependencies - - React-RuntimeHermes (0.86.0): + - SocketRocket + - React-RuntimeHermes (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - - React-Core-prebuilt + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi - React-featureflags - React-hermes - React-jsi @@ -2745,14 +3836,22 @@ PODS: - React-RuntimeCore - React-runtimeexecutor - React-utils - - ReactNativeDependencies - - React-runtimescheduler (0.86.0): + - SocketRocket + - React-runtimescheduler (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - React-callinvoker - - React-Core-prebuilt - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags + - React-jserrorhandler - React-jsi - React-jsinspectortracing - React-performancetimeline @@ -2761,18 +3860,35 @@ PODS: - React-runtimeexecutor - React-timing - React-utils - - ReactNativeDependencies - - React-timing (0.86.0): + - SocketRocket + - React-timing (0.88.0): + - React-cxxstableapi - React-debug - - React-utils (0.86.0): - - hermes-engine - - React-Core-prebuilt + - React-timing/timingUmbrella (= 0.88.0) + - React-timing/timingUmbrella (0.88.0): + - React-cxxstableapi - React-debug - - React-jsi (= 0.86.0) - - ReactNativeDependencies - - React-viewtransitionnativemodule (0.86.0): - - hermes-engine - - React-Core-prebuilt + - React-utils (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-jsi (= 0.88.0) + - SocketRocket + - React-viewtransitionnativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - React-Fabric - React-Fabric/bridging - React-jsi @@ -2780,27 +3896,42 @@ PODS: - React-RCTFBReactNativeSpec - React-runtimeexecutor - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - React-webperformancenativemodule (0.86.0): - - hermes-engine - - React-Core-prebuilt + - React-webperformancenativemodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging - React-cxxreact + - React-cxxstableapi - React-jsi - React-jsiexecutor - React-performancetimeline - React-RCTFBReactNativeSpec - React-runtimeexecutor - ReactCommon/turbomodule/core - - ReactNativeDependencies - - ReactAppDependencyProvider (0.86.0): + - SocketRocket + - ReactAppDependencyProvider (0.88.0): - ReactCodegen - - ReactCodegen (0.86.0): - - hermes-engine + - ReactCodegen (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt - React-debug - React-Fabric - React-FabricImage @@ -2812,51 +3943,66 @@ PODS: - React-RCTAppDelegate - React-rendererdebug - React-utils - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - - ReactCommon (0.86.0): - - React-Core-prebuilt - - ReactCommon/turbomodule (= 0.86.0) - - ReactNativeDependencies - - ReactCommon/turbomodule (0.86.0): - - hermes-engine - - React-callinvoker (= 0.86.0) - - React-Core-prebuilt - - React-cxxreact (= 0.86.0) - - React-jsi (= 0.86.0) - - React-logger (= 0.86.0) - - React-perflogger (= 0.86.0) - - ReactCommon/turbomodule/bridging (= 0.86.0) - - ReactCommon/turbomodule/core (= 0.86.0) - - ReactNativeDependencies - - ReactCommon/turbomodule/bridging (0.86.0): - - hermes-engine - - React-callinvoker (= 0.86.0) - - React-Core-prebuilt - - React-cxxreact (= 0.86.0) - - React-jsi (= 0.86.0) - - React-logger (= 0.86.0) - - React-perflogger (= 0.86.0) - - ReactNativeDependencies - - ReactCommon/turbomodule/core (0.86.0): - - hermes-engine - - React-callinvoker (= 0.86.0) - - React-Core-prebuilt - - React-cxxreact (= 0.86.0) - - React-debug (= 0.86.0) - - React-featureflags (= 0.86.0) - - React-jsi (= 0.86.0) - - React-logger (= 0.86.0) - - React-perflogger (= 0.86.0) - - React-utils (= 0.86.0) - - ReactNativeDependencies + - SocketRocket + - ReactCommon (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - ReactCommon/turbomodule (= 0.88.0) + - SocketRocket + - ReactCommon/turbomodule (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.88.0) + - React-jsi (= 0.88.0) + - React-logger (= 0.88.0) + - React-perflogger (= 0.88.0) + - ReactCommon/turbomodule/core (= 0.88.0) + - SocketRocket + - ReactCommon/turbomodule/core (0.88.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging + - React-callinvoker (= 0.88.0) + - React-cxxreact (= 0.88.0) + - React-debug (= 0.88.0) + - React-featureflags (= 0.88.0) + - React-jsi (= 0.88.0) + - React-logger (= 0.88.0) + - React-perflogger (= 0.88.0) + - React-utils (= 0.88.0) + - SocketRocket - ReactNativeBiometrics (0.15.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2869,17 +4015,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - - ReactNativeDependencies (0.86.0) - ReactNativeHybridApp (0.0.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2892,18 +4044,25 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNAppleAuthentication (2.5.0): - React-Core - RNCClipboard (1.16.3): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2916,16 +4075,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNCPicker (2.11.3): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2938,16 +4104,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNDeviceInfo (10.3.1): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2960,9 +4133,8 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNFBAnalytics (22.2.1): - Firebase/Analytics (= 11.13.0) @@ -2974,11 +4146,19 @@ PODS: - RNFS (2.20.0): - React-Core - RNGestureHandler (3.3.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-FabricComponents @@ -2992,20 +4172,27 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - RNWorklets (>= 0.8.0) + - SocketRocket - Yoga - RNGoogleSignin (10.0.1): - GoogleSignIn (~> 7.0) - React-Core - RNLiveMarkdown (0.1.371): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-FabricComponents @@ -3020,17 +4207,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - RNWorklets + - SocketRocket - Yoga - RNLocalize (3.5.4): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3043,9 +4237,8 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - rnmapbox-maps (10.3.10): - MapboxMaps (~> 11.23.1) @@ -3054,13 +4247,20 @@ PODS: - rnmapbox-maps/DynamicLibrary (= 10.3.10) - Turf - rnmapbox-maps/DynamicLibrary (10.3.10): + - boost + - DoubleConversion + - fast_float + - fmt - hermes-engine - MapboxMaps (~> 11.23.1) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-featureflags - React-ImageManager - React-jsi @@ -3069,18 +4269,25 @@ PODS: - React-renderercss - React-rendererdebug - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Turf - Yoga - RNNitroSQLite (10.2.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - NitroModules + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3093,16 +4300,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNPermissions (5.4.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3115,16 +4329,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNReactNativeHapticFeedback (2.3.3): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3137,16 +4358,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNReanimated (4.7.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3160,20 +4388,27 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - RNReanimated/apple (= 4.7.0) - RNReanimated/common (= 4.7.0) - RNReanimated/view (= 4.7.0) - RNWorklets + - SocketRocket - Yoga - RNReanimated/apple (4.7.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3187,17 +4422,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - RNWorklets + - SocketRocket - Yoga - RNReanimated/common (4.7.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3211,17 +4453,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - RNWorklets + - SocketRocket - Yoga - RNReanimated/view (4.7.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3235,17 +4484,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - RNWorklets + - SocketRocket - Yoga - RNScreens (4.28.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3259,17 +4515,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - RNScreens/common (= 4.28.0) + - SocketRocket - Yoga - RNScreens/common (4.28.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3283,16 +4546,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNSentry (8.32.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3306,16 +4576,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNShare (11.0.2): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3328,16 +4605,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNSVG (15.15.5): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3350,17 +4634,24 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - RNSVG/common (= 15.15.5) + - SocketRocket - Yoga - RNSVG/common (15.15.5): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3373,16 +4664,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNWorklets (0.13.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3396,18 +4694,25 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies - RNWorklets/apple (= 0.13.0) - RNWorklets/common (= 0.13.0) + - SocketRocket - Yoga - RNWorklets/apple (0.13.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3421,16 +4726,23 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - RNWorklets/common (0.13.0): - - hermes-engine + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3444,9 +4756,8 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - SDWebImage (5.21.3): - SDWebImage/Core (= 5.21.3) @@ -3459,6 +4770,7 @@ PODS: - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) + - SocketRocket (0.7.1) - SwiftUIIntrospect (1.3.0) - SwiftyRSA (1.7.0): - SwiftyRSA/ObjC (= 1.7.0) @@ -3466,16 +4778,24 @@ PODS: - TrustKit (3.0.7) - Turf (4.0.0) - TweetNacl (1.0.2) - - UMAppLoader (57.0.1) + - UMAppLoader (58.0.2) - VisionCamera (5.2.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog - hermes-engine - NitroImage - NitroModules + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-bridging - React-callinvoker - React-Core - - React-Core-prebuilt + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -3488,16 +4808,17 @@ PODS: - React-rendererdebug - React-utils - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactNativeDependencies + - SocketRocket - Yoga - Yoga (0.0.0) DEPENDENCIES: - AirshipServiceExtension - AppLogs (from `../node_modules/react-native-app-logs/AppLogsPod`) + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - "callstack-repack (from `../node_modules/@callstack/repack`)" + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - EXConstants (from `../node_modules/expo-constants/ios`) - "expensify-react-native-background-task (from `../node_modules/@expensify/react-native-background-task`)" - "ExpensifyNitroUtils (from `../node_modules/@expensify/nitro-utils`)" @@ -3519,9 +4840,12 @@ DEPENDENCIES: - ExpoTaskManager (from `../node_modules/expo-task-manager/ios`) - ExpoVideo (from `../node_modules/expo-video/ios`) - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) + - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) - "FullStory (from `{http: \"https://ios-releases.fullstory.com/fullstory-1.76.0-xcframework.tar.gz\"}`)" - "fullstory_react-native (from `../node_modules/@fullstory/react-native`)" + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - group-ib-fp (from `../node_modules/group-ib-fp`) - GzipSwift - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) @@ -3533,18 +4857,20 @@ DEPENDENCIES: - "onfido-react-native-sdk (from `../node_modules/@onfido/react-native-sdk`)" - "pusher-websocket-react-native (from `../node_modules/@pusher/pusher-websocket-react-native`)" - QuickCrypto (from `../node_modules/react-native-quick-crypto`) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) - RCTRequired (from `../node_modules/react-native/Libraries/Required`) - RCTSwiftUI (from `../node_modules/react-native/ReactApple/RCTSwiftUI`) - RCTSwiftUIWrapper (from `../node_modules/react-native/ReactApple/RCTSwiftUIWrapper`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - React (from `../node_modules/react-native/`) + - React-bridging (from `../node_modules/react-native/ReactCommon/react/bridging`) - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - React-Core (from `../node_modules/react-native/`) - - React-Core-prebuilt (from `../node_modules/react-native/React-Core-prebuilt.podspec`) - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-cxxstableapi (from `../node_modules/react-native/ReactCommon/react/cxxstableapi`) - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) @@ -3598,6 +4924,7 @@ DEPENDENCIES: - React-performancecdpmetrics (from `../node_modules/react-native/ReactCommon/react/performance/cdpmetrics`) - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimatedModuleProvider (from `../node_modules/react-native/ReactApple/RCTAnimatedModuleProvider`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) @@ -3613,6 +4940,7 @@ DEPENDENCIES: - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) - React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-resizeobservernativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/resizeobserver`) - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) @@ -3626,7 +4954,6 @@ DEPENDENCIES: - ReactCodegen (from `build/generated/ios/ReactCodegen`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - "ReactNativeBiometrics (from `../node_modules/@sbaiahmed1/react-native-biometrics`)" - - ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) - "ReactNativeHybridApp (from `../node_modules/@expensify/react-native-hybrid-app`)" - "RNAppleAuthentication (from `../node_modules/@invertase/react-native-apple-authentication`)" - "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)" @@ -3649,6 +4976,7 @@ DEPENDENCIES: - RNShare (from `../node_modules/react-native-share`) - RNSVG (from `../node_modules/react-native-svg`) - RNWorklets (from `../node_modules/react-native-worklets`) + - SocketRocket (~> 0.7.1) - TrustKit (~> 3.0) - UMAppLoader (from `../node_modules/unimodules-app-loader/ios`) - VisionCamera (from `../node_modules/react-native-vision-camera`) @@ -3691,6 +5019,7 @@ SPEC REPOS: - SDWebImageAVIFCoder - SDWebImageSVGCoder - SDWebImageWebPCoder + - SocketRocket - SwiftUIIntrospect - SwiftyRSA - TrustKit @@ -3700,8 +5029,12 @@ SPEC REPOS: EXTERNAL SOURCES: AppLogs: :path: "../node_modules/react-native-app-logs/AppLogsPod" + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" callstack-repack: :path: "../node_modules/@callstack/repack" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" EXConstants: :path: "../node_modules/expo-constants/ios" expensify-react-native-background-task: @@ -3744,17 +5077,23 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-video/ios" ExpoWebBrowser: :path: "../node_modules/expo-web-browser/ios" + fast_float: + :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" + fmt: + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" FullStory: :http: https://ios-releases.fullstory.com/fullstory-1.76.0-xcframework.tar.gz fullstory_react-native: :path: "../node_modules/@fullstory/react-native" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" group-ib-fp: :path: "../node_modules/group-ib-fp" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-v250829098.0.14 + :tag: hermes-v260318099.0.2 lottie-react-native: :path: "../node_modules/lottie-react-native" NitroFetch: @@ -3769,6 +5108,8 @@ EXTERNAL SOURCES: :path: "../node_modules/@pusher/pusher-websocket-react-native" QuickCrypto: :path: "../node_modules/react-native-quick-crypto" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: @@ -3781,16 +5122,18 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/TypeSafety" React: :path: "../node_modules/react-native/" + React-bridging: + :path: "../node_modules/react-native/ReactCommon/react/bridging" React-callinvoker: :path: "../node_modules/react-native/ReactCommon/callinvoker" React-Core: :path: "../node_modules/react-native/" - React-Core-prebuilt: - :podspec: "../node_modules/react-native/React-Core-prebuilt.podspec" React-CoreModules: :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-cxxstableapi: + :path: "../node_modules/react-native/ReactCommon/react/cxxstableapi" React-debug: :path: "../node_modules/react-native/ReactCommon/react/debug" React-defaultsnativemodule: @@ -3897,6 +5240,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimatedModuleProvider: + :path: "../node_modules/react-native/ReactApple/RCTAnimatedModuleProvider" React-RCTAnimation: :path: "../node_modules/react-native/Libraries/NativeAnimation" React-RCTAppDelegate: @@ -3927,6 +5272,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/renderer/css" React-rendererdebug: :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + React-resizeobservernativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/resizeobserver" React-RuntimeApple: :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" React-RuntimeCore: @@ -3953,8 +5300,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" ReactNativeBiometrics: :path: "../node_modules/@sbaiahmed1/react-native-biometrics" - ReactNativeDependencies: - :podspec: "../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" ReactNativeHybridApp: :path: "../node_modules/@expensify/react-native-hybrid-app" RNAppleAuthentication: @@ -4016,58 +5361,63 @@ SPEC CHECKSUMS: AirshipServiceExtension: 50d11b2f62c4a490d4e81a1c36f70e2ecb70a27e AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 AppLogs: 3bc4e9b141dbf265b9464409caaa40416a9ee0e0 - callstack-repack: 391af9d65585f106b57ca693880593dc2c89db5c - EXConstants: fa5647482320b7bde855057f8b86580456d4b9f0 - expensify-react-native-background-task: 36103a7c2d62b3f5682a6e2773186d08e46338c5 - ExpensifyNitroUtils: d627f58d9dd38c2dd4833f59b2c078cf61ad0171 - Expo: ce613ebd8e7f9dcd68bae3ec53038db24d3a6ec4 - ExpoAsset: 98143758ff37e14c9ff2a4e7673097db00473011 - ExpoAudio: b69f36525132edba8d87a715b3a20c678ef78b30 - ExpoDomWebView: beaec034e51bd028428b98bb1f2633ab79c6d095 - ExpoFont: 59e1faf66ba9bcd232ae1e2ce58d202a48b6f65e - ExpoGlassEffect: 310dc75c8d862de1c4b3ff15a90439ba51a39798 - ExpoImage: 4c1e7634db6033185a98959fb028d8d4b1c89695 - ExpoImageManipulator: d3c962dabd86b331980f8ec6794c6073b3cb541a - ExpoLocation: 187949911b868f72e34a8a6f8f487207ba86388a - ExpoLogBox: 8a3cfa2897e088083cd49fc1ff7fdb2de4385547 - ExpoModulesCore: 9c02efc618119023146b9b8db9c0930e43ac977d - ExpoModulesJSI: 4f849c58e99b57c2438b21ed6bc2fcb6f984a0d1 - ExpoModulesWorklets: 5e70b46d570c5b1b702c18bc8ac8d1af0171450e - ExpoModulesWorkletsAdapter: 536e81cd66f1b69c9301c5df6099b4e172a3702d - ExpoStoreReview: 2a0f6b8e04112aea2f6e3e1cb84109d78f4d041f - ExpoTaskManager: f68326227852a30148700965c37c058c1473c6a2 - ExpoVideo: b1d9a325ddcd4f3ed8ccb374c01b688e98bc6a04 - ExpoWebBrowser: 9b98d939d5f1c5dd8f523f0a0683056fb1204434 - FBLazyVector: b3e7ad108f0d882e30445c5527d774e3fd432f3d + boost: 659a89341ea4ab3df8259733813b52f26d8be9a5 + callstack-repack: 8883aaf395ac45d84c368bd3c0618dcf0aa5eb5c + DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb + EXConstants: ff5c226215048137ea31d39fa460027a6daeeadc + expensify-react-native-background-task: ea4509ba555095f21485d6a5a5adfdc6bb92accc + ExpensifyNitroUtils: fa9208bdf51cd33763d4039407650aa6c650f5c5 + Expo: f5f4aeb87a0cc2c6f7200fc7c2aea28efc752e85 + ExpoAsset: 7c69bf16ddb143a238c9d6a55b9f699cc60b72cf + ExpoAudio: 7963cae3818d0a9f9b6ac927b7f5401b2539daa6 + ExpoDomWebView: b2a6d681b9d34c23b1f584321386ca8da1d36afb + ExpoFont: 8c11c15724418e0fc2f4cd410afa49686d55a6c4 + ExpoGlassEffect: 6594e055df1e0b88d34cc189ba0b21589adec6bf + ExpoImage: 0765d30c52245e378639f83dd2c39f12dfa059f6 + ExpoImageManipulator: d3a5f1755634d963c526f66cc2ef878dbe4e4306 + ExpoLocation: 8bd5f5af8ce2f6abb310446344239f86975afe54 + ExpoLogBox: 14c42e5429c85e1e2acfb9316b4e821db8e40d42 + ExpoModulesCore: 2c4da1a3b3723fe6f75f6cac3c9e1ff20f768a6b + ExpoModulesJSI: cde3d94ff303a13645439ee8637a445650ebc676 + ExpoModulesWorklets: 8908bee33c6f95479b209bc05ea24346da9ff606 + ExpoModulesWorkletsAdapter: 0ce5b924ef8b77205b388606d2fcf046542e3895 + ExpoStoreReview: baec43b9560cbe6e03171afb26a011ffdd68cad5 + ExpoTaskManager: a9a9c3ccecdf3e0b76d11c35893a5ee0989ccd7a + ExpoVideo: 1281a010245cad04faf0106cbfeb2c643bbdc403 + ExpoWebBrowser: 2999ed3f2ee8c06985cb37b4ac566328ca0e4c7a + fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 + FBLazyVector: 7f2e79a18f9e32521fffdda4a2e3375c969b6502 Firebase: 3435bc66b4d494c2f22c79fd3aae4c1db6662327 FirebaseAnalytics: 630349facf4a114a0977e5d7570e104261973287 FirebaseCore: c692c7f1c75305ab6aff2b367f25e11d73aa8bd0 FirebaseCoreInternal: 29d7b3af4aaf0b8f3ed20b568c13df399b06f68c FirebaseInstallations: 0ee9074f2c1e86561ace168ee1470dc67aabaf02 + fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac ForkInputMask: 55e3fbab504b22da98483e9f9a6514b98fdd2f3c FullStory: 19b5e39993793fda1b85a743bb35cadda35b1faa - fullstory_react-native: 4db29340d6e5a4d5f03104b666a75481176d9ae2 + fullstory_react-native: b8d1d4df82c9dda4f06c15fd4184a085b25e3f11 + glog: e56ede4028c4b7418e6b1195a36b1656bb35e225 GoogleAppMeasurement: 0dfca1a4b534d123de3945e28f77869d10d0d600 GoogleSignIn: d4281ab6cf21542b1cfaff85c191f230b399d2db GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - group-ib-fp: 74f62a9aa3345bac07e75dec9c4d916856652f3b + group-ib-fp: d3084fc2b9082a9fb65cdf09a255cf99f8b7e391 GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 GzipSwift: 893f3e48e597a1a4f62fafcb6514220fcf8287fa - hermes-engine: 4749bc1144addfa799bc34648e721fc85989901d + hermes-engine: a1158910bb7e300b9e3d2f1e2d433f817ec1a4b5 JWTDecode: 2eed97c2fa46ccaf3049a787004eedf0be474a87 libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 lottie-ios: 8f959969761e9c45d70353667d00af0e5b9cadb3 - lottie-react-native: 5ff8edf0bf953f4e85657ca571c81956281e91ad + lottie-react-native: 2e1c82c111783e515fda6630efb31ef52268d36c MapboxCommon: d006256c4643860a7b3046af45d1671569b6c5ac MapboxCoreMaps: de1a4461d0ab5d65d907f06e8d82fdbe06bb3213 MapboxMaps: 22340ae0e0d47b2e4761019b1d6c569ab04e088d nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - NitroFetch: 42521ebe6c3f291b2be0e1d73c7fe95c4e4ea0b8 - NitroImage: 03c650b246b841609b53236df5c03549d156e9ad - NitroModules: 6232dc95a28a7a221227e618733ce0e674e8753b + NitroFetch: dd6d49c591478065d2dac1561f884a2f9752e11d + NitroImage: c74bccf2037c74d6495ad027e7d92b0ce2920a8b + NitroModules: a6203d5f387596e9d956ef0feda35ae3a4f1909c NWWebSocket: 873eb4b18acd0317da70cdba388d792a3187ce00 Onfido: 65454f91d10758193c857fd149417f6efbea84c5 onfido-react-native-sdk: bb8cfd9198e2e97978461d969497d18b37e45ca7 @@ -4076,134 +5426,138 @@ SPEC CHECKSUMS: PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 pusher-websocket-react-native: 31b5fdd632bfa6d417f9ad0bceefe403ab41825d PusherSwift: fa3d5f6587c20ad5790de87a5c9b150367b5f0f5 - QuickCrypto: a66c5cddf000c17a168f1983e5a266ff8ab4d332 - RCTDeprecation: 2a74a2c57675e64419bd89078efde81f7c1de90b - RCTRequired: 30451112e6fef4e6f31b4e7eee0845156e35e4b0 - RCTSwiftUI: 5aaf0b07e747ba749dc6acc94d8bd41eea4b570f - RCTSwiftUIWrapper: ab2ca548be15d63afa95103afc8685a7c3eab78b - RCTTypeSafety: 3eaed17dbddb0b989208b062ea14c44d412b9780 - React: 2574546f2d017abd14d0c9b48cf2b6a0547c2591 - React-callinvoker: 03cd4b931d1d583d87aae99b8f7b6fe26bf571ee - React-Core: c89de4458bd868093d796fef3f4589ff4798df61 - React-Core-prebuilt: df2215d5387f03898c940262af212a63f190c9fe - React-CoreModules: 2f9ed75bca7f6dea2b70e8a1f4a5ca9b6be52d76 - React-cxxreact: 7103d5ba69848c039e11079e74ceede05efe795e - React-debug: e47fe49e67816470d183595746b1d0e20cd09fab - React-defaultsnativemodule: bbdc7580f4de664e724b301a8f90f361a935e2c8 - React-domnativemodule: d908358936dfea6d8501ecd188a0e1a6b20736bd - React-Fabric: be25f53eab48992eede759f526cfe6395cf36166 - React-FabricComponents: 7cc2657948de5996048cd99f9d9129e2e3aa76fa - React-FabricImage: 511b8cd207f00cd69cf8f4ff9201ed5986069401 - React-featureflags: 9baabb633b957a8156deb659dfc11446d4072fd5 - React-featureflagsnativemodule: b2c0c243b27ef9c8f3f7abce38ee5e0e0be8061e - React-graphics: b430aa8fa179ff249e0cfbb93d060bb40ffbc14c - React-hermes: ae4685ca9fa5f47003bc594d3f146e29284136d1 - React-idlecallbacksnativemodule: e3262b84602f60df0ecd5ee09b150ced4d469dd6 - React-ImageManager: 46f07fc5e779023874a17d38125563efd984b217 - React-intersectionobservernativemodule: 3076f9d9c5ae57d01787a62855b44b521a157e20 - React-jserrorhandler: 79eca081e24b814692cb5d51f1a3534a86abd010 - React-jsi: c4b6daf8a31ac54f2db49cd6cce29720fec1f3a8 - React-jsiexecutor: acdc1a217b7ea29bcf6315b770d01e6b1c2fca14 - React-jsinspector: 58817ac80f434c07684ca61ba6a2d68fff49e4c8 - React-jsinspectorcdp: 1764d1dfb1a9a918328771513f4e1e338637ef0a - React-jsinspectornetwork: 202626ea71170fb8d96ae9b8ed42b8bde432ac91 - React-jsinspectortracing: 466247ce4d42002d72683a362926a9a2ebd25072 - React-jsitooling: d7cb3dddcd66c1adcaf4cf9a8b0fa2a7154f0b59 - React-jsitracing: 50e5780a3428985944b3e694abd8239119194031 - React-logger: fff73f4ceecad968c97baafdc77dcf84befc38b6 - React-Mapbuffer: 1a42eda3f9d415ba9f7dcd7f1fe19d4f27925751 - React-microtasksnativemodule: 354ab193a7ed66e42869c8a0c2c0d844e8e22f67 - React-mutationobservernativemodule: f53ad06cbe4b44d2a33df6aa3f01ca8e9b57e83b - react-native-advanced-input-mask: d42c73e0d71141101fa74f16b6a7b55a8420c5a1 - react-native-airship: 25d3e960fb5eadb510682709175267c209f166ed - react-native-app-logs: ddcfb542d3cfb4ab3210fcd52acf4e6f2e12e3e9 - react-native-blob-util: 0091cf4599c9cc14d79c9f31be887df4d3d3cf59 - react-native-cameraroll: 8fd837cd3e2c96ca378d85eb4340134381797309 - react-native-config: 06c97ec20d877e11bb128d8cdc11329f18494ecb - react-native-document-picker: ee9a7692303f36eef1798dcf43f38f51b1382ad1 - react-native-image-picker: 08847883972f3fe37e31896ac2f864286737b4d4 - react-native-key-command: 9a1d8369da3fc9668b6f5389c9d7412189591217 - react-native-keyboard-controller: d07e8ba4e72859601941cc6c508fdd37a635ba04 - react-native-netinfo: 2201a3619279a5e2327244048bf024638c8d4399 - react-native-pager-view: 394558f9cc1f8aa0c8671d2d0679035265dc10c6 - react-native-pdf: f5336904e04a95103a90fcdf349bbd8e278350b9 - react-native-plaid-link-sdk: a2df4f145f61869507d730062764abca085b6a00 - react-native-quick-base64: e254a406ac7d7f20857c9fbcbfb57fbf91ae21be - react-native-safe-area-context: 6acf61f42ee0862bbe00ed7e6c11cd0b81b7f6e3 - react-native-skia: b3c25cbcfdc2d4f68b73390ff1b50ef2a9bc5968 - react-native-view-shot: 6da2aaa0404b8d617ab1689550acdb251d759af9 - react-native-wallet: 8857943314bcf703480d3ca8051a5072ed3898fe - react-native-webview: 36fd14012dd0352c90b960ea7860fbc53876593b - React-NativeModulesApple: a092d89b58f635ebfab88048b0eda9fb516819fd - React-networking: ee8e1504d7c1c73a3655bf545ca1184bebae4c7f - React-oscompat: 0b72a7e926954a0415ccd83e0748b6561fe45367 - React-perflogger: 2498c798fb4209483cab9ee8ffa334b72a3b6f1e - React-performancecdpmetrics: 88a3c32833d5d50bd35be98577298253f0404a34 - React-performancetimeline: 74b781fef76a2e8d461cc899760e9a52b6323d8c - React-RCTActionSheet: 902c79deec52f99cc48b1051b59bcbe86787d339 - React-RCTAnimation: 09cf722039ae30ff5d64e2b011ff054ae651c3b6 - React-RCTAppDelegate: a47de6fddb7eb0c028abba83138a5ce283bd7e77 - React-RCTBlob: 38c418d067e0c61818223503063310122e44c588 - React-RCTFabric: 394ceb66233b460e9db2112d7db35d6ce762d841 - React-RCTFBReactNativeSpec: 55b98a66521548287e08cabd92f993c20eeff369 - React-RCTImage: 3ce36f82441b76b715818ee7ee95f6f5b34f9ee1 - React-RCTLinking: 2f7b5ed4983122e5115732d25a4360960eab583c - React-RCTNetwork: dcd3b180f33da86f5dc5e928a816eb5464fa7f16 - React-RCTRuntime: 4ba98336cafb41a25fee39618a0d9994595cbf82 - React-RCTSettings: b97727ec8c55c35bd284457a647c938c040b942b - React-RCTText: 4d1b88f6d3e1a43afe46706d956ec6664c87b984 - React-RCTVibration: 415d14d6a1a64bf947fcef6b193915a494431168 - React-rendererconsistency: c13799138f5208bbaad0afad6b9595357af8fbfb - React-renderercss: cd4e8a7a9e41d02a0bc968c64182bbfe2e29cb8d - React-rendererdebug: 31560fc7e22ca8cca17382767d9a1bf31311f915 - React-RuntimeApple: d879aefebf1067ad37de2fdd886b47a62cda9896 - React-RuntimeCore: dd37f98c158275a6117211bac5a94d0204ff30e0 - React-runtimeexecutor: ea0dad34ec733736d8aeeb6fe34dbfb306afb2a9 - React-RuntimeHermes: 6e19c1a247d43b6978e231673ee8fd4c5c52643b - React-runtimescheduler: d767e75db2694a0545784f2155303970c4b76df5 - React-timing: 942b1204ed892dad1095e1a34842aeecf5ec4e68 - React-utils: 2927e2a1f437cd0fd5e3a2f0aa9d2a9ceacbeddf - React-viewtransitionnativemodule: 6c82bccff3c5649a27134b660bfe7106f741b1f8 - React-webperformancenativemodule: f07a77f0b2407765f3b4e1e71bcb421093ccd35f - ReactAppDependencyProvider: dcdd0e1b9559a6d8d8aea05286f4ed085091978e - ReactCodegen: cd296de5e1c422deebafff34134d1721b5c29704 - ReactCommon: d5c1bb4427bf51c443de5926aac332c89ddd9363 - ReactNativeBiometrics: 1fb6ad206cfd39900e952b1abcdcdba22bdd6fd9 - ReactNativeDependencies: 4227659c64db3eab64c6ea87b5695fd329922798 - ReactNativeHybridApp: a35e7f25b54a370ada94c01309ccb1ff0954b949 + QuickCrypto: 9976c1844f72049934c7739423f7e53f746e5c51 + RCT-Folly: 36c4f904fb6cd0219dcb76b94e9502d2a72fab0b + RCTDeprecation: 2bd5800f105cb2e604fc8be5e71198f301c5a501 + RCTRequired: 7a58da4e11c1404901da9c6bd9e34f307916383b + RCTSwiftUI: 2d66e0cb3af7fb1d6d7888ae906b6e6c176f73cb + RCTSwiftUIWrapper: 2b0ed2c43aba0470a6746e513623003d3ad6f570 + RCTTypeSafety: 805910c16ad0e3790e1e431c2654523e64e805ae + React: 8dafd0ef058191e9e7238cfa6b3deaa24398e5dd + React-bridging: 7e80e058a888b1ea5a30bc11ee7c2af0178dd7b4 + React-callinvoker: c356fde44cacb9bbc7718f3d04e9e52cc693e0cf + React-Core: 829e558acc9ff5d48137ee952c30142baac6c0d2 + React-CoreModules: 2bbbf92fdc366fb6d3b0289da8f50e95e537f9ae + React-cxxreact: 304c4f4cce686ea63b82e999f81d242cb9a7b6df + React-cxxstableapi: 7ff7c2083ba9dff609503c82b2f7f47acbe92db1 + React-debug: fceba94b9d95e2a8e21df9b0582f1decd7f68567 + React-defaultsnativemodule: 64e07c49dc81c78055f3eb055d158cb34bca5f70 + React-domnativemodule: cccbee6c1097eec810121eb9d46b01b27c11399b + React-Fabric: 80cab428cbdb197ecfadd200db15e09f1040b29d + React-FabricComponents: 80f1b6767e4e7d2c5c1c3dcc66a8341313ef0b9f + React-FabricImage: 5cb840cb743294900a9e6eaed090fa3acd2b1ca3 + React-featureflags: fe9096b1b2f4352eba7d04ba55c51c71f8cec0fd + React-featureflagsnativemodule: 336b5d86ac1e3c0c5cc2b83101522b0599cd5453 + React-graphics: b101431915cc385002c7c229809748dd02432e6f + React-hermes: f7bf0ef528f368cceed0efa50153b1ce80d0a1b3 + React-idlecallbacksnativemodule: fb9001c02baef6ec499e7e35a527e1fc1dace1d9 + React-ImageManager: 7efe8b4bf6b2e49aad47ffb55a738e47915a0536 + React-intersectionobservernativemodule: b2692ea24de270a995ef2e979329e035c31e7629 + React-jserrorhandler: ffef7b6bc1a0a329abf177cacaa6d9b7aeed986f + React-jsi: e923fff4f10f9cf0d5c879af75c2db93aaf1000e + React-jsiexecutor: 212b0f39ab8c350ed886934bd62834630a35af13 + React-jsinspector: 464625eec4ee4c4d94a482661559f8df582d7147 + React-jsinspectorcdp: 909cb0f235d59b3c53f63f371f5fef9327e5e5f4 + React-jsinspectornetwork: 3c3721b0b5421767fc16ed8f0093786f04a7704c + React-jsinspectortracing: 77741271bb4d9f0af359676f13e4e6cffbd012ed + React-jsitooling: a646a0937aaa9a9d8b1a505b6c01f1f364563c53 + React-jsitracing: b70e848c7982db9373dc6a9a8f4454ddf6d27154 + React-logger: d741b932aa3aacee0efc43a7a96390b8887d45bf + React-Mapbuffer: 5fecb8b9fc5a733bb590f396f85d850f388ebe08 + React-microtasksnativemodule: 80533c11ba4a0845c7aea88017bbb835eafa853a + React-mutationobservernativemodule: 5006a2ea894ba45cdf529cf21cef88a5be755ce8 + react-native-advanced-input-mask: ab699501696c06f5afdeace0ff02c19ceffd4d4c + react-native-airship: a2142cdebd8b2c8385c0366d862c7dbe35884dbc + react-native-app-logs: a8a6096a42fb47086b24410e2a15945c5b2d9089 + react-native-blob-util: bfb49875b35b64e5b94dd0081509eb9affdbee5e + react-native-cameraroll: 5a97a5d58b7fda947e48654f310bb7344952b47b + react-native-config: aac11ad60d8dd87c3b071ebd3bc1e5a0f101b2bc + react-native-document-picker: 8cae7ba456415147970963963ab596d7bcb5bf40 + react-native-image-picker: ced7cb8ea317e2911e8c060f10cad2ce0d519256 + react-native-key-command: 146d1c22f0bb1604a1460497eed95ffa40208815 + react-native-keyboard-controller: 26e798f6ef3a5f780ceb6e32be2bba6154a309e1 + react-native-netinfo: 1a5a06e8cb1f5a74f39bcb3d11f462541295dc91 + react-native-pager-view: e538b8525905558017236f07ef154699998efff4 + react-native-pdf: 12f7907f237869513bb5622f5eab1add1d16a18c + react-native-plaid-link-sdk: 7f78a525e34c339d6b2397b09b5b398ff3cf5d44 + react-native-quick-base64: 38818f6dcca96d3306bf2ba0d72f19b774467a59 + react-native-safe-area-context: 13f162b385540f4d5d9374dd4d02bee388b29a66 + react-native-skia: 5c913945db2625791c22a9a94e9207951841983b + react-native-view-shot: 0c80b98f04886e2742a2d6d106e244fa44be1afb + react-native-wallet: 50c731341734b7d0ca2e58187c638c3b8d4df23d + react-native-webview: 1d38615b215351b3c5a3403986603e885949ec8e + React-NativeModulesApple: 4810858cbb1004af4b91a965e0b27cb770b52df6 + React-networking: c448d6325dacf3733d1b40912babcf7c219db974 + React-oscompat: 6052e6296ca28b72e6dd3ec1cecb7a4bbfc7d22f + React-perflogger: 2e9e6e38446298324721b2ca065af2ce9e7bd0c7 + React-performancecdpmetrics: 2c0bca79b494bc271778e7a5180ae7809956a3f3 + React-performancetimeline: 94ddb9a0ad1ae473a3a6a56935d92186204e1a98 + React-RCTActionSheet: 2947f27048e4d71f30212599f70a8208d00fe2c1 + React-RCTAnimatedModuleProvider: e7bb5f8ec899c359cda7c2a98cf0ccfa76e2ad7e + React-RCTAnimation: 2e1ed780bddf4474c922df1233d965fec3d69e9c + React-RCTAppDelegate: 5e2d8b2319adc881d28fbbeaffee806e7fe580d0 + React-RCTBlob: 034d9637c504dd71a0fc03986764e9daa5efd963 + React-RCTFabric: 6f84faac185552d931d30fef900e673756803dee + React-RCTFBReactNativeSpec: 1cabdde384331b503fed215a99d0e40e72fcb71c + React-RCTImage: f214b8685f080b3c079ec1ed5de49d33ae9b5983 + React-RCTLinking: 8ce35835d57545202f1b021313186f4496a52393 + React-RCTNetwork: d0beb09a6e7e182c7db9e2ee1721daf38da14a91 + React-RCTRuntime: bc431a257379439db82806742d6091a0407557c5 + React-RCTSettings: 48ced2c202bf2161e6a4ddee0dcd267fbb9056de + React-RCTText: 619377710971bc938de4d91d6204e9ce007add8d + React-RCTVibration: 59585cf25d732abe5afb0ef9d4124a802dfc6a1e + React-rendererconsistency: a9147eef34bdabb748b5332402012b65e144b2ac + React-renderercss: 248da11aced83d3a23d709d4e535718975594a31 + React-rendererdebug: 6cbab80b1d60b4234a53107d417473dd12159bd7 + React-resizeobservernativemodule: 2e5f23e214c08ecde63d1aafc744c79e72bc3afc + React-RuntimeApple: 55fcd820ef67edcc92aea90e27ea31bf9fb83eb6 + React-RuntimeCore: 128db9d4f9db99d2832b6a307c0c641ed401ef4e + React-runtimeexecutor: 6b2aa915b822939e2e622369d5f34702497e33de + React-RuntimeHermes: 7dc029af4af3e7e21e05984ddcc6bcf1d5c09920 + React-runtimescheduler: b6e30a7574b8995eab23e2259a1caf6554cc31b2 + React-timing: d8db55bf81f58a782fbce4bfac22d53af5283fc7 + React-utils: 777f932ea0ee69218e4c21cc87c5f1a24fba1012 + React-viewtransitionnativemodule: 19e39361bc0fb2d50e2d11210c08de13c862cc56 + React-webperformancenativemodule: eb30936b1359faaf8cf0b67b5646ebfb5d5daa0b + ReactAppDependencyProvider: 782ee9546c9cd3b53b73f1e9e3dd728540085fc7 + ReactCodegen: 8736020545c70e2c4b7ec566718b24a3ca60c91d + ReactCommon: 528fae509916cc94582e8a64936a0a0ee1b71d24 + ReactNativeBiometrics: d2c99440f8690682ca8eec660eef53f9459333d6 + ReactNativeHybridApp: 8f99c67e4f7e7d3da19796573ab7a3975c524c87 RNAppleAuthentication: 9027af8aa92b4719ef1b6030a8e954d37079473a - RNCClipboard: 7a7d4557bfd3370b35c99dfecd92ae7b9fc4948a - RNCPicker: 7cdfc55a519cc6b4f74bed404051b07c42b23156 - RNDeviceInfo: 43f912bf35adf2aa5b89f77d24c8d74f629cd641 + RNCClipboard: 4983c6e2e72a4e1feeace6f66f5f8ebe8e5f22dc + RNCPicker: 54a1a2fe33d1805d0ebfbe881e29cb178cc4e27f + RNDeviceInfo: a5be0702c09c842e6a1365bb0085697e9e41f6dd RNFBAnalytics: 2f451df50833a890974d55a93557da878a85b29e RNFBApp: db9c2e6d36fe579ab19b82c0a4a417ff7569db7e RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 - RNGestureHandler: 85e32defcf23dd3b023356355c5c1dd1d9d51bde + RNGestureHandler: 6aa83c00d78de7f988a89fab7bd0017a651161ed RNGoogleSignin: 89877c73f0fbf6af2038fbdb7b73b5a25b8330cc - RNLiveMarkdown: 5c091b2742b0e26a7085ce2803919ef76198eeb7 - RNLocalize: 82e7aa2857ce5dcd9e2a0c04f8c34c2ed50821df - rnmapbox-maps: 1cb6aa142a8ea99d0934a36d83d2acf3f2de45d3 - RNNitroSQLite: 8962a30dc9296f8a62bfcc33f3c2a540b1c44aff - RNPermissions: 32bd3b977f28442af0900b102f4458f0f9f9b77c - RNReactNativeHapticFeedback: 6c8677db48f62a635e6a2065f5d2bd02498d7a73 - RNReanimated: e75c988a6527ec651ea2957b93891ddb64d530d4 - RNScreens: 433b8c24dd1dfeaa3b61f72d55052cb64fd19c5f - RNSentry: b182c4e68ff5e50275011476ea2702f05412ae05 - RNShare: eb378c57de30a83b0253eed74762ee99249f47d7 - RNSVG: 394cfd0518613b144c65ffe69045f827b78a7a7c - RNWorklets: 3da8f468c848547646f4e6b12fb46ad93a2cdee2 + RNLiveMarkdown: 58d2fd2265cee630e22f88ce16194b996022c834 + RNLocalize: 84929fccb683a26d82ecb0009e6b809beac68328 + rnmapbox-maps: 17be3b1751d07dc487a3a576696e25c7dc49ff22 + RNNitroSQLite: 91142352bd5e6742427066a51a6fbaa8fb598b4d + RNPermissions: 519b33720ef8eb5bd3dbd3a30c7ba0ef081566c6 + RNReactNativeHapticFeedback: 7aa9439efe741132bdaec9309572e7974a34632c + RNReanimated: 2842718b677e9535537cd8ef2acc5b6b3d332c5d + RNScreens: a4e05326b5a6084e87bedb6734c6daacc84da966 + RNSentry: f17cbfd648627b21e4df51033c8a854423b62bb6 + RNShare: 2d321ef9d66310c77503ab18de1c145c7411e040 + RNSVG: 48e30fa003636db61f03a0fd91922757d7f9f7c8 + RNWorklets: efcee735370b17c283c26771dde752a08815fb1a SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SwiftUIIntrospect: fee9aa07293ee280373a591e1824e8ddc869ba5d SwiftyRSA: 8c6dd1ea7db1b8dc4fb517a202f88bb1354bc2c6 TrustKit: 1050f3ce0595f8ed775f1237b7f590e3a4f93e91 Turf: c9eb11a65d96af58cac523460fd40fec5061b081 TweetNacl: 3abf4d1d2082b0114e7a67410e300892448951e6 - UMAppLoader: 173cb90a3039aa9c1b84bace4487e1907a4a5a39 - VisionCamera: c0e2c308592613de270de5f6e722b53d04a26f0d - Yoga: c30c859b7e9b75e547b600b486fe33165f60de00 + UMAppLoader: 813e4d172a12484f5bb149d9e99b1e7c11ae0b0c + VisionCamera: bfc51a42f53354ae65c6d9722cdf11568ecb9be6 + Yoga: cc77b509c6e01e07a4ab976e2afd495c01cc2c1d PODFILE CHECKSUM: 22066e0768760f4bad500b497f3d1576110fd025 diff --git a/jest/setup.ts b/jest/setup.ts index b72771be88da..0ff297c6869e 100644 --- a/jest/setup.ts +++ b/jest/setup.ts @@ -34,6 +34,20 @@ setupMockLegendList(); // Polyfill necessary for Onyx.init in jest/setupAfterEnv.ts Object.assign(global, {TextDecoder, TextEncoder}); +// jsdom 20 has no AbortSignal.timeout. Expo SDK 57's runtime used to add it, but SDK 58 dropped that because React Native 0.88 +// ships its own AbortSignal, which Jest never installs since the preset mocks React Native's environment setup. +if (!('timeout' in AbortSignal)) { + Object.defineProperty(AbortSignal, 'timeout', { + value(milliseconds: number): AbortSignal { + const controller = new AbortController(); + setTimeout(() => controller.abort(new DOMException('The signal timed out.', 'TimeoutError')), milliseconds); + return controller.signal; + }, + configurable: true, + writable: true, + }); +} + // This mock is required as per setup instructions for react-navigation testing // https://reactnavigation.org/docs/testing/#mocking-native-modules jest.mock('react-native/src/private/animated/NativeAnimatedHelper'); diff --git a/knip.json b/knip.json index d20f4ba0d241..db9f03922703 100644 --- a/knip.json +++ b/knip.json @@ -85,7 +85,8 @@ "shellcheck", "patch-package", "diff-so-fancy", - "@babel/plugin-proposal-class-properties" + "@babel/plugin-proposal-class-properties", + "@react-native/assets-registry" ], "ignoreBinaries": ["mkcert", "openssl", "xdg-open"], "ignoreIssues": { diff --git a/package-lock.json b/package-lock.json index f9fb702fa1ad..5ec5defe8cc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,11 +39,12 @@ "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.16.3", "@react-native-community/netinfo": "11.4.1", - "@react-native-documents/picker": "^10.1.3", + "@react-native-documents/picker": "^12.0.3", "@react-native-firebase/analytics": "^22.2.1", "@react-native-firebase/app": "^22.2.1", "@react-native-google-signin/google-signin": "^10.0.1", "@react-native-picker/picker": "2.11.3", + "@react-native/assets-registry": "0.88.0", "@react-navigation/bottom-tabs": "7.19.2", "@react-navigation/core": "7.22.1", "@react-navigation/material-top-tabs": "7.7.2", @@ -68,19 +69,19 @@ "dom-serializer": "^0.2.2", "domhandler": "^5.0.3", "expensify-common": "2.0.224", - "expo": "57.0.8", - "expo-asset": "57.0.7", - "expo-audio": "57.0.3", - "expo-font": "57.0.1", - "expo-glass-effect": "57.0.4", - "expo-image": "57.0.1", - "expo-image-manipulator": "57.0.6", - "expo-location": "57.0.6", - "expo-modules-core": "57.0.15", - "expo-store-review": "57.0.1", - "expo-task-manager": "57.0.6", - "expo-video": "57.0.2", - "expo-web-browser": "57.0.2", + "expo": "58.0.14", + "expo-asset": "58.0.16", + "expo-audio": "58.0.9", + "expo-font": "58.0.8", + "expo-glass-effect": "58.0.5", + "expo-image": "58.0.15", + "expo-image-manipulator": "58.0.14", + "expo-location": "58.0.17", + "expo-modules-core": "58.0.29", + "expo-store-review": "58.0.2", + "expo-task-manager": "58.0.12", + "expo-video": "58.0.11", + "expo-web-browser": "58.0.6", "fast-equals": "^5.2.2", "focus-trap-react": "^11.0.3", "group-ib-fp": "file:modules/group-ib-fp", @@ -93,22 +94,23 @@ "lodash-es": "4.18.1", "lottie-react-native": "7.3.8", "mapbox-gl": "^3.24.0", - "metro-transform-plugins": "0.84.5", + "metro-transform-plugins": "0.87.1", "mime-db": "1.52.0", "modern-screenshot": "4.7.0", "onfido-sdk-ui": "14.53.1", "pako": "^2.1.0", "process": "^0.11.10", "pusher-js": "8.3.0", - "react": "19.2.3", + "react": "19.3.0", "react-collapse": "^5.1.0", "react-content-loader": "^7.0.0", - "react-dom": "19.2.3", + "react-dom": "19.3.0", "react-error-boundary": "^4.0.11", "react-fast-pdf": "^1.0.34", + "react-freeze": "1.0.3", "react-is": "^18.3.1", "react-map-gl": "^8.1.1", - "react-native": "0.86.0", + "react-native": "0.88.0", "react-native-advanced-input-mask": "1.4.6", "react-native-app-logs": "0.3.1", "react-native-blob-util": "0.24.12", @@ -192,7 +194,7 @@ "@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/babel-preset": "0.86.0", + "@react-native/babel-preset": "0.88.0", "@react-navigation/devtools": "7.1.15", "@rock-js/platform-android": "0.13.4", "@rock-js/platform-ios": "0.13.4", @@ -228,9 +230,9 @@ "@types/node": "^26.6.5", "@types/pako": "^2.0.3", "@types/pusher-js": "^5.1.0", - "@types/react": "19.2.3", + "@types/react": "19.3.0", "@types/react-collapse": "^5.0.1", - "@types/react-dom": "19.2.3", + "@types/react-dom": "19.3.0", "@types/react-is": "^18.3.0", "@types/react-native-web": "0.19.2", "@types/react-test-renderer": "^19.1.0", @@ -243,7 +245,7 @@ "babel-plugin-istanbul": "^6.1.1", "babel-plugin-module-resolver": "^5.0.0", "babel-plugin-transform-remove-console": "^6.9.4", - "babel-preset-expo": "^57.0.3", + "babel-preset-expo": "^58.0.17", "bun": "^1.4.4", "concurrently": "^9.2.4", "cspell": "9.4.0", @@ -267,12 +269,12 @@ "jest-circus": "29.7.0", "jest-cli": "29.7.0", "jest-environment-jsdom": "^29.7.0", - "jest-expo": "57.0.2", + "jest-expo": "58.0.11", "jest-transformer-svg": "^2.0.1", "knip": "^6.34.0", "lefthook": "2.1.9", "memfs": "^4.6.0", - "metro-symbolicate": "0.84.5", + "metro-symbolicate": "0.87.1", "nitrogen": "0.37.1", "onchange": "^7.1.0", "openai": "^7.0.0", @@ -285,7 +287,7 @@ "portfinder": "^1.0.34", "react-native-clean-project": "^4.0.0-alpha4.0", "react-refresh": "^0.14.2", - "react-test-renderer": "19.2.3", + "react-test-renderer": "19.3.0", "reassure": "^1.0.0", "rock": "0.13.4", "semver": "7.5.2", @@ -528,6 +530,27 @@ } } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -1848,16 +1871,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", @@ -2320,7 +2333,7 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2331,7 +2344,7 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2342,7 +2355,7 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" @@ -2355,7 +2368,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -2434,7 +2447,7 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.25.9", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -2448,7 +2461,7 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -2459,7 +2472,7 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2485,7 +2498,7 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -2506,7 +2519,7 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -2517,7 +2530,7 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2528,7 +2541,7 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2549,7 +2562,7 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -2563,7 +2576,7 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -5274,6 +5287,121 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -6164,556 +6292,59 @@ "resolved": "server/victory-chart-renderer", "link": true }, - "node_modules/@expo/cli": { - "version": "57.0.10", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-57.0.10.tgz", - "integrity": "sha512-mP+B9ZrTnRE94bxPM/kCVKPyuVuOTRvvsqbXVxdXtrAfOfF94YIZLGUtw/151cGFtdUPbsBsJ9gW02LhU+QMZA==", - "license": "MIT", - "dependencies": { - "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~57.0.6", - "@expo/config-plugins": "~57.0.6", - "@expo/devcert": "^1.2.1", - "@expo/env": "~2.4.2", - "@expo/image-utils": "^0.11.4", - "@expo/inline-modules": "^0.1.3", - "@expo/json-file": "^11.0.1", - "@expo/log-box": "^57.0.1", - "@expo/metro": "~56.0.0", - "@expo/metro-config": "~57.0.7", - "@expo/metro-file-map": "^57.0.1", - "@expo/osascript": "^2.7.1", - "@expo/package-manager": "^1.13.1", - "@expo/plist": "^0.8.1", - "@expo/prebuild-config": "^57.0.9", - "@expo/require-utils": "^57.0.4", - "@expo/router-server": "^57.0.4", - "@expo/schema-utils": "^57.0.2", - "@expo/spawn-async": "^1.8.0", - "@expo/ws-tunnel": "^2.0.0", - "@expo/xcpretty": "^4.4.4", - "@react-native/dev-middleware": "0.86.0", - "accepts": "^1.3.8", - "agent-cli-detector": "^0.1.2", - "arg": "^5.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "dnssd-advertise": "^1.1.4", - "expo-server": "^57.0.1", - "fetch-nodeshim": "^0.4.10", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "lan-network": "^0.2.1", - "multitars": "^1.0.0", - "node-forge": "^1.3.3", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^4.0.4", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "send": "^0.19.0", - "slugify": "^1.3.4", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "terminal-link": "^2.1.1", - "toqr": "^0.1.1", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1", - "zod": "^3.25.76" - }, - "bin": { - "expo-internal": "main.js" - }, - "peerDependencies": { - "expo": "*", - "expo-router": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "expo-router": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@expo/cli/node_modules/@expo/config-plugins": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.6.tgz", - "integrity": "sha512-7CmKrS5Rnu8aSZyNlxH2qzA7Ls1HEa4EQvEVOAkHDKPr1e4Cg/nz7I7dUl09QDTVjMvkKYDH4Th0DuAsgqASaw==", - "license": "MIT", - "dependencies": { - "@expo/config-types": "^57.0.2", - "@expo/json-file": "~11.0.1", - "@expo/plist": "^0.8.1", - "@expo/require-utils": "^57.0.4", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "semver": "^7.5.4", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - } - }, - "node_modules/@expo/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@expo/cli/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/@expo/cli/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@expo/cli/node_modules/brace-expansion": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", - "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@expo/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@expo/cli/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@expo/cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/@expo/cli/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@expo/cli/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@expo/cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@expo/cli/node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "license": "MIT", - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/log-symbols/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@expo/cli/node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@expo/cli/node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@expo/cli/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@expo/cli/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@expo/cli/node_modules/ora/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/ora/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/ora/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@expo/cli/node_modules/ora/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@expo/cli/node_modules/ora/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/ora/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@expo/cli/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@expo/cli/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/cli/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/cli/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@expo/cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.7.tgz", + "integrity": "sha512-zP0tnfqrFFRL8INtOaQ6XwEYfdIpIH9vrEo7y0bHQGQa50z4/QWXE5CI4nRUHxqFW4MVWOwXFg1hom1aAZHNkQ==", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "node-forge": "^1.4.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@expo/code-signing-certificates": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", - "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", - "license": "MIT", - "dependencies": { - "node-forge": "^1.3.3" + "node": ">=22.13.0" } }, "node_modules/@expo/config": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-57.0.6.tgz", - "integrity": "sha512-VpMJpB/De/fb9bBFVVBiK6Ntg9lt0kAleLH9hcZz85CYRUQ3jVFVA8rNC5f8y4cp2+FiiPNFp62+kEOFI6pDiw==", + "version": "58.0.6", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-58.0.6.tgz", + "integrity": "sha512-PT1qv4s/R5A/NxXb4efGlFsYF5Consi7F8xSsJBAN090EGDr6U1EDQGOijFqzDc3JA2epD8zjKLJLOVB9YOewg==", "license": "MIT", "dependencies": { - "@expo/config-plugins": "~57.0.6", - "@expo/config-types": "^57.0.2", - "@expo/json-file": "^11.0.1", - "@expo/require-utils": "^57.0.4", + "@expo/config-plugins": "~58.0.9", + "@expo/config-types": "^58.0.3", + "@expo/json-file": "^11.2.1", + "@expo/platforms": "^58.0.1", + "@expo/require-utils": "^58.0.4", "deepmerge": "^4.3.1", "getenv": "^2.0.0", "glob": "^13.0.0", "resolve-workspace-root": "^2.0.0", - "semver": "^7.6.0", + "semver": "^7.7.4", "slugify": "^1.3.4" } }, "node_modules/@expo/config-types": { - "version": "57.0.2", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.2.tgz", - "integrity": "sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==", + "version": "58.0.3", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-58.0.3.tgz", + "integrity": "sha512-wyfrwkTT/hQHzwyqkXkngKxoOa8L6ovsTP4h/UukS1mTmssee5et6HOPoN5RtawdJPnm5JO28f//C/wXlpka8Q==", "license": "MIT" }, "node_modules/@expo/config/node_modules/@expo/config-plugins": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.6.tgz", - "integrity": "sha512-7CmKrS5Rnu8aSZyNlxH2qzA7Ls1HEa4EQvEVOAkHDKPr1e4Cg/nz7I7dUl09QDTVjMvkKYDH4Th0DuAsgqASaw==", + "version": "58.0.9", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-58.0.9.tgz", + "integrity": "sha512-HyP7V1QgDxeHcOEh4qQH7cfK7cI7wNp0y9lszAu98SRYCshhDbwB9gWpFfnpX1GQUtgiqG4Hvgh1z3ntcGwAjw==", "license": "MIT", "dependencies": { - "@expo/config-types": "^57.0.2", - "@expo/json-file": "~11.0.1", - "@expo/plist": "^0.8.1", - "@expo/require-utils": "^57.0.4", - "@expo/sdk-runtime-versions": "^1.0.0", + "@expo/config-types": "^58.0.3", + "@expo/json-file": "~11.2.1", + "@expo/plist": "^0.10.1", + "@expo/require-utils": "^58.0.4", + "@expo/sdk-runtime-versions": "^1.0.1", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", "glob": "^13.0.0", - "semver": "^7.5.4", + "semver": "^7.7.4", "slugify": "^1.6.6", "xcode": "^3.0.1", "xml2js": "0.6.0" @@ -6816,9 +6447,9 @@ } }, "node_modules/@expo/config/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -6880,9 +6511,9 @@ } }, "node_modules/@expo/devcert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", - "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.2.tgz", + "integrity": "sha512-wz1YedXwdNbYqk/PRr34vixnuw1+l6uSwmPXUj649cot5iYNccb2zIOnK7Nonb1Pfd/dxAY6CvU6KM3uSdxC7A==", "license": "MIT", "dependencies": { "@expo/sudo-prompt": "^9.3.1", @@ -6899,18 +6530,22 @@ } }, "node_modules/@expo/devtools": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-57.0.1.tgz", - "integrity": "sha512-GyUf+wFNkbttaX0jR7MZa9bm77U0IrLg6d2AjpxdyoXw/w4abHoXG0oFufwLMgP9zLTd5+Ct4X/ffNUTnlzZgg==", + "version": "58.0.2", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-58.0.2.tgz", + "integrity": "sha512-WBj/K+vv8JPSmY70ennL04YYOHkpEsGGkfuVY9lfv4XO7Qhbt5qz4q6W7maME194I5oGcimRMigUFfWNkBe90w==", "license": "MIT", "dependencies": { "chalk": "^4.1.2" }, "peerDependencies": { + "expo": "*", "react": "*", "react-native": "*" }, "peerDependenciesMeta": { + "expo": { + "optional": true + }, "react": { "optional": true }, @@ -6990,9 +6625,9 @@ } }, "node_modules/@expo/dom-webview": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-57.0.1.tgz", - "integrity": "sha512-lAKsME4SAq+8sf56oN0DX5TBYyruupoRxbWbD2xf9RnKY8y6x8eb9LCE5pxSN0qyWdqnp+0wmyWzDkKboThKAw==", + "version": "58.0.2", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-58.0.2.tgz", + "integrity": "sha512-bLkREoP7qL3rEuzxP60xG+TjdPoGjbnZfxkvYo5imJxGWfKMOf7x962W06Pu+WWAr4gcDRk16iA+Clg8D0zjCg==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -7001,9 +6636,9 @@ } }, "node_modules/@expo/env": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.4.2.tgz", - "integrity": "sha512-28pqaEqwnmLduZ00Pq9HkSzE5wbj1MTwp5/n8nm8rD8MCjR9eUnVOwmNksPI3Be2ReAPO/DbPn1puy0mvoocsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.5.2.tgz", + "integrity": "sha512-z8kCvBVJpd2S20a+Ab1otQgz8sJLeR7CXDTsuAMcNbYFsK10Fdhfb7rx9Ys1vvlbijnY55eZhQvJACajc1IjBQ==", "license": "MIT", "dependencies": { "chalk": "^4.0.0", @@ -7084,19 +6719,13 @@ "node": ">=8" } }, - "node_modules/@expo/expo-modules-macros-plugin": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.6.1.tgz", - "integrity": "sha512-cpsLZE4rqkc1Y3eZTkxB98jrqY1YXgetmtxFt8q89jBRmk3quRuk1BZo+VcnCSObZardjg99r1k5xijEMONFGA==", - "license": "MIT" - }, "node_modules/@expo/fingerprint": { - "version": "0.20.6", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.20.6.tgz", - "integrity": "sha512-cmC/6BOPRbdKr77Mgjwszb8aM0hY2RKBpMRCmjSdn9zIcn2FGor/ic4fHVr46cQFa1G6RDGg1GyAjRw3US4CCQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.21.5.tgz", + "integrity": "sha512-4ngc+aPgMK56sYc47tfabmoaNdP7OvPBOH7QPgN3riSYM0Ev+KwsGRDius5jBBwjCI9ADp7IpjJEK9xlRYjjvA==", "license": "MIT", "dependencies": { - "@expo/env": "^2.4.2", + "@expo/env": "^2.5.2", "@expo/spawn-async": "^1.8.0", "arg": "^5.0.2", "chalk": "^4.1.2", @@ -7106,7 +6735,7 @@ "ignore": "^5.3.1", "minimatch": "^10.2.2", "resolve-from": "^5.0.0", - "semver": "^7.6.0" + "semver": "^7.7.4" }, "bin": { "fingerprint": "bin/cli.js" @@ -7215,9 +6844,9 @@ } }, "node_modules/@expo/fingerprint/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -7279,18 +6908,18 @@ } }, "node_modules/@expo/image-utils": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.11.4.tgz", - "integrity": "sha512-pn/4770DIEOcYZr484uazuwg20FX/qaDkeMRF6J+oxejynDmEmO8wLsCudaNShFE0BhyKGQTYrs2rsRhqrqESw==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.12.5.tgz", + "integrity": "sha512-nsFYd7GfDdwZa+S+p+EkVCkh7UKKNf0kfUXDQ53HbyMmNFD3psb5JYwU/2N+uZG5wOEfKGfQ5u7pk/wn2gMlBA==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^57.0.4", + "@expo/require-utils": "^58.0.4", "@expo/spawn-async": "^1.8.0", "chalk": "^4.0.0", "getenv": "^2.0.0", "jimp-compact": "0.16.1", "parse-png": "^2.1.0", - "semver": "^7.6.0" + "semver": "^7.7.4" } }, "node_modules/@expo/image-utils/node_modules/ansi-styles": { @@ -7376,30 +7005,30 @@ } }, "node_modules/@expo/inline-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.1.3.tgz", - "integrity": "sha512-eHSxWYfgq65mP3Qz8PclVjUkSrDIlGl3va9U7PMcTpGItOvee/i0ZzGinH5A25oARR5ouD64eESBKwtT/CwdHg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.2.6.tgz", + "integrity": "sha512-S8PK3wx6ogwunoQ7pqdPbklQGtXloeWTAOzWJ9yIL7xHFxvnI/Ryj0phA3KEGCMlaKZjaCP1h/3s7n/ueErRgQ==", "license": "MIT", "dependencies": { - "@expo/config-plugins": "~57.0.5" + "@expo/config-plugins": "~58.0.9" } }, "node_modules/@expo/inline-modules/node_modules/@expo/config-plugins": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.6.tgz", - "integrity": "sha512-7CmKrS5Rnu8aSZyNlxH2qzA7Ls1HEa4EQvEVOAkHDKPr1e4Cg/nz7I7dUl09QDTVjMvkKYDH4Th0DuAsgqASaw==", + "version": "58.0.9", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-58.0.9.tgz", + "integrity": "sha512-HyP7V1QgDxeHcOEh4qQH7cfK7cI7wNp0y9lszAu98SRYCshhDbwB9gWpFfnpX1GQUtgiqG4Hvgh1z3ntcGwAjw==", "license": "MIT", "dependencies": { - "@expo/config-types": "^57.0.2", - "@expo/json-file": "~11.0.1", - "@expo/plist": "^0.8.1", - "@expo/require-utils": "^57.0.4", - "@expo/sdk-runtime-versions": "^1.0.0", + "@expo/config-types": "^58.0.3", + "@expo/json-file": "~11.2.1", + "@expo/plist": "^0.10.1", + "@expo/require-utils": "^58.0.4", + "@expo/sdk-runtime-versions": "^1.0.1", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", "glob": "^13.0.0", - "semver": "^7.5.4", + "semver": "^7.7.4", "slugify": "^1.6.6", "xcode": "^3.0.1", "xml2js": "0.6.0" @@ -7502,9 +7131,9 @@ } }, "node_modules/@expo/inline-modules/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -7566,9 +7195,9 @@ } }, "node_modules/@expo/json-file": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz", - "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.2.1.tgz", + "integrity": "sha512-UPhKoFCj8BcwgLB1rKQ1CuR/REITnZLiqxHEHOeH1tPsdXcHGtUDh0P5bLbr7oU0nKVdtJ5rzyKx8jniMQdESQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -7576,12 +7205,12 @@ } }, "node_modules/@expo/local-build-cache-provider": { - "version": "57.0.4", - "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-57.0.4.tgz", - "integrity": "sha512-B/cI73shkLSYBYuFyh+zCbS+WhqJgawWPW4MPdMiNLJKv9RmV4dv1FGjsidiIiG2k4kYKerBDLK4bLbC7qERQQ==", + "version": "58.0.6", + "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-58.0.6.tgz", + "integrity": "sha512-AJk3pslFNlwRMbUbfvxhu6CPA9U7A+JPb88VS/uWkG/S/QMJL90Iw4sPVfG4BOKfRUNkB8ipl432Dr4txjSMKw==", "license": "MIT", "dependencies": { - "@expo/config": "~57.0.5", + "@expo/config": "~58.0.6", "chalk": "^4.1.2" } }, @@ -7656,62 +7285,78 @@ } }, "node_modules/@expo/log-box": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-57.0.1.tgz", - "integrity": "sha512-fuVNHhOerdRWtpq27gD6JTSVYESsfRu+SMdrNCWxW+gFnusS6dGKfx3lKGBZ4ZkMNiLWn8maBHo39YKzJNXFYQ==", + "version": "58.0.12", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-58.0.12.tgz", + "integrity": "sha512-IzDYoFY2iUsmSDvl1V7YUM7UkCPDyMVS4e4a38c2LnFc1A3WGMUiQh+vsHLYTPKjIelu4r7/u4V7Gxtfa0oJgA==", "license": "MIT", "dependencies": { - "@expo/dom-webview": "^57.0.1", + "@expo/dom-webview": "^58.0.2", + "@expo/log-box-utils": "^58.0.2", "anser": "^1.4.9", "stacktrace-parser": "^0.1.10" }, "peerDependencies": { - "@expo/dom-webview": "^57.0.1", + "@expo/dom-webview": "^58.0.2", "expo": "*", "react": "*", "react-native": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } } }, + "node_modules/@expo/log-box-utils": { + "version": "58.0.2", + "resolved": "https://registry.npmjs.org/@expo/log-box-utils/-/log-box-utils-58.0.2.tgz", + "integrity": "sha512-My8Lwe9FU/yDwwzqwi5LN2rzzDcJqIAZKrD9f0XHZEKz/FQnWJYdt1rsV7+RwqMGeGq2XsxTCVT1ggTCOvumxw==", + "license": "MIT" + }, "node_modules/@expo/metro": { - "version": "56.0.2", - "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-56.0.2.tgz", - "integrity": "sha512-Ld5AeYMCCDa8bLeWhfuLbZFFjlV3f6ORqyPz2glGh6RltIngMuLf9BTC2yvHFjkKuGxL5SynijmA8xmNNWn5iA==", - "license": "MIT", - "dependencies": { - "metro": "0.84.5", - "metro-babel-transformer": "0.84.5", - "metro-cache": "0.84.5", - "metro-cache-key": "0.84.5", - "metro-config": "0.84.5", - "metro-core": "0.84.5", - "metro-file-map": "0.84.5", - "metro-minify-terser": "0.84.5", - "metro-resolver": "0.84.5", - "metro-runtime": "0.84.5", - "metro-source-map": "0.84.5", - "metro-symbolicate": "0.84.5", - "metro-transform-plugins": "0.84.5", - "metro-transform-worker": "0.84.5" + "version": "58.0.0", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-58.0.0.tgz", + "integrity": "sha512-PMD640ihB0C3Oqm0AnDVJ/8qF2cKbRUEqGuSOr4tM/OTb9ktxsQqsiSSSeaOEgdCZBq20AxRS0d6WHNhhH2P+g==", + "license": "MIT", + "dependencies": { + "metro": "0.87.1", + "metro-babel-transformer": "0.87.1", + "metro-cache": "0.87.1", + "metro-cache-key": "0.87.1", + "metro-config": "0.87.1", + "metro-core": "0.87.1", + "metro-file-map": "0.87.1", + "metro-minify-terser": "0.87.1", + "metro-resolver": "0.87.1", + "metro-runtime": "0.87.1", + "metro-source-map": "0.87.1", + "metro-symbolicate": "0.87.1", + "metro-transform-plugins": "0.87.1", + "metro-transform-worker": "0.87.1" } }, "node_modules/@expo/metro-config": { - "version": "57.0.7", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-57.0.7.tgz", - "integrity": "sha512-bVfEkg4zF1cA62OqAdYXmFOooJ6TB/I+REi7Se6Ct+PbSC+89TwSqWXnYx34L08eIs4z+1ilgbATakTZpgefmQ==", + "version": "58.0.14", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-58.0.14.tgz", + "integrity": "sha512-UDUMAJwYGEzaB26ejMLG/IOVzwKDbHzoODBf3FZeRS94kk9jDf1dWE1VMX6bLBLoiflxXwqrMWiH0Fvz3gZ9YQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", - "@expo/config": "~57.0.6", - "@expo/env": "~2.4.2", - "@expo/json-file": "~11.0.1", - "@expo/metro": "~56.0.0", - "@expo/require-utils": "^57.0.4", + "@expo/config": "~58.0.6", + "@expo/env": "~2.5.2", + "@expo/json-file": "~11.2.1", + "@expo/metro": "~58.0.0", + "@expo/platforms": "^58.0.1", + "@expo/require-utils": "^58.0.4", "@expo/spawn-async": "^1.8.0", "@jridgewell/gen-mapping": "^0.3.13", "@jridgewell/remapping": "^2.3.5", "@jridgewell/sourcemap-codec": "^1.5.5", + "@jridgewell/trace-mapping": "^0.3.31", + "@react-native/js-polyfills": "0.88.0", + "2g": "^1.0.1", "browserslist": "^4.25.0", "chalk": "^4.1.0", "debug": "^4.3.2", @@ -7720,8 +7365,9 @@ "hermes-parser": "^0.36.0", "jsc-safe-url": "^0.2.4", "lightningcss": "^1.30.1", + "noxcturnal": "^0.1.0", "picomatch": "^4.0.4", - "postcss": "^8.5.14", + "postcss": "^8.5.23", "resolve-from": "^5.0.0" }, "peerDependencies": { @@ -7733,14 +7379,21 @@ } } }, - "node_modules/@expo/metro-config/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@expo/metro-config/node_modules/2g": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/2g/-/2g-1.0.1.tgz", + "integrity": "sha512-+uViadKOS/wwR4pFu5g8TPn3QHpKqoX19JHCnp8k/3cLpImdcXozwvZA6Q/5PeW3AcU8neL8faaMidBcv7o8CA==", "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "bin": { + "2g": "bin/cli.js" + }, + "peerDependencies": { + "typescript": ">=5.8.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@expo/metro-config/node_modules/ansi-styles": { @@ -7840,21 +7493,21 @@ } }, "node_modules/@expo/metro-config/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/@expo/metro-config/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -7880,9 +7533,9 @@ } }, "node_modules/@expo/metro-config/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -7904,19 +7557,36 @@ } }, "node_modules/@expo/metro-file-map": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/@expo/metro-file-map/-/metro-file-map-57.0.1.tgz", - "integrity": "sha512-8JXfVstZN7QnP4NianZZnlTVboOWR0sG8trUDNajOjnbGlPln29vponXM84tY+3tAHapz5/TxE53L0ixUwqPtA==", + "version": "58.0.5", + "resolved": "https://registry.npmjs.org/@expo/metro-file-map/-/metro-file-map-58.0.5.tgz", + "integrity": "sha512-Y2w8qKklLffZie28In4WF6f6e8nIJOhU0mZ5UaQdCiITVQm2a5teNdIDudEPkBsh8ItlvyHZt9n42PN2onRbkQ==", "license": "MIT", "dependencies": { + "2g": "^1.0.1", "debug": "^4.3.4", "fb-watchman": "^2.0.2", "invariant": "^2.2.4", "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", "walker": "^1.0.8" } }, + "node_modules/@expo/metro-file-map/node_modules/2g": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/2g/-/2g-1.0.1.tgz", + "integrity": "sha512-+uViadKOS/wwR4pFu5g8TPn3QHpKqoX19JHCnp8k/3cLpImdcXozwvZA6Q/5PeW3AcU8neL8faaMidBcv7o8CA==", + "license": "MIT", + "bin": { + "2g": "bin/cli.js" + }, + "peerDependencies": { + "typescript": ">=5.8.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@expo/metro-file-map/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7956,10 +7626,68 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/@expo/modules-macros-linux-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@expo/modules-macros-linux-arm64/-/modules-macros-linux-arm64-0.27.1.tgz", + "integrity": "sha512-8bwGkFZ5FaLzSXe37t8ksw4GJ7flvRhBSmmFfkZlETjm8nAPrU5D+VF8YkSmRUoQ5DA3PWLLwnYK+WhvzJ0+fA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@expo/modules-macros-linux-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@expo/modules-macros-linux-x64/-/modules-macros-linux-x64-0.27.1.tgz", + "integrity": "sha512-63BZcm/aWPNe4VC9jBxKOME7abiM6rCdn6NiZTTmlEMWmBaoRWJEKj16tT/Gjkf25y9+dMwadQ9B+LNMbh5nPA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@expo/modules-macros-win32-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@expo/modules-macros-win32-arm64/-/modules-macros-win32-arm64-0.27.1.tgz", + "integrity": "sha512-BcIJibqB7YxuUTf7R7gk2gbPYr6ngM0t+hTeoAhpsgS5xUlYU/TVjgrYpYOFTyYfWwgnDUv75WrJxbvVolK5xQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@expo/modules-macros-win32-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@expo/modules-macros-win32-x64/-/modules-macros-win32-x64-0.27.1.tgz", + "integrity": "sha512-jguCWgOW2dcLY7VaReBCxU48FBX1g4DhzETm/DpD+WwxZOweiBRSwk7zaOTiTG2rifBYu4y9VYHxHrONHfOLBw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@expo/osascript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.7.1.tgz", - "integrity": "sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.8.1.tgz", + "integrity": "sha512-SCi+6q6uOkGhiAn6AIP/OPFgaIq/iKD2oYpnAOg2rShHStJ8ey7wyT127RbOaZXmlcY/62rHOX1WiiMnD8u/BA==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.8.0" @@ -7969,12 +7697,12 @@ } }, "node_modules/@expo/package-manager": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.13.1.tgz", - "integrity": "sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.14.2.tgz", + "integrity": "sha512-sftl0eRVVCarI6grMdjAB3jX2pX1Mt3cdSnajlXS4QyeDkaKRM/ntBy6dcagj1VL0+cEfEqctlyvinmlZdNubg==", "license": "MIT", "dependencies": { - "@expo/json-file": "^11.0.1", + "@expo/json-file": "^11.2.1", "@expo/spawn-async": "^1.8.0", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", @@ -8272,10 +8000,16 @@ "node": ">=8" } }, + "node_modules/@expo/platforms": { + "version": "58.0.1", + "resolved": "https://registry.npmjs.org/@expo/platforms/-/platforms-58.0.1.tgz", + "integrity": "sha512-KtLrtAvpShq16l9lTxd2fZSjULxcGxXrJTHA31iUVqrc+Af7aTAJW4ZB3yQBgi/w+kSb6BB/CG9RXI0ohbMm6g==", + "license": "MIT" + }, "node_modules/@expo/plist": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.1.tgz", - "integrity": "sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.10.1.tgz", + "integrity": "sha512-nuNOqj+r/hGJbZ1Ax3jUpZaOB8UAMHUrISALJEUKaCieTflYj7224EqFWmMpriCGk9wXS1gH+9GGVnSj0tWzuQ==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -8284,50 +8018,44 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "57.0.9", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-57.0.9.tgz", - "integrity": "sha512-8g7RoXFvO/dxvLzRE/bvphzDL4bfV0w3/4Aj6DfwvgymZ1ULz5gW2x0js94opZRoZvWw4SolH6/74hLlZT3rAA==", + "version": "58.0.14", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-58.0.14.tgz", + "integrity": "sha512-2wVzVDfXjRB3LzUbW5shOM/A+6eUUCfR+2bpZiWRBBZBtZP2HA5Zq1YgCio1tDqMGAHf2NQQDhvy/Rz1U6aC3A==", "license": "MIT", "dependencies": { - "@expo/config": "~57.0.6", - "@expo/config-plugins": "~57.0.6", - "@expo/config-types": "^57.0.2", - "@expo/image-utils": "^0.11.4", - "@expo/json-file": "^11.0.1", - "@react-native/normalize-colors": "0.86.0", + "@expo/config": "~58.0.6", + "@expo/config-plugins": "~58.0.9", + "@expo/config-types": "^58.0.3", + "@expo/image-utils": "^0.12.5", + "@expo/json-file": "^11.2.1", + "@react-native/normalize-colors": "0.88.0", "debug": "^4.3.1", - "expo-modules-autolinking": "~57.0.9", + "expo-modules-autolinking": "~58.0.13", "resolve-from": "^5.0.0", - "semver": "^7.6.0" + "semver": "^7.7.4" } }, "node_modules/@expo/prebuild-config/node_modules/@expo/config-plugins": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.6.tgz", - "integrity": "sha512-7CmKrS5Rnu8aSZyNlxH2qzA7Ls1HEa4EQvEVOAkHDKPr1e4Cg/nz7I7dUl09QDTVjMvkKYDH4Th0DuAsgqASaw==", + "version": "58.0.9", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-58.0.9.tgz", + "integrity": "sha512-HyP7V1QgDxeHcOEh4qQH7cfK7cI7wNp0y9lszAu98SRYCshhDbwB9gWpFfnpX1GQUtgiqG4Hvgh1z3ntcGwAjw==", "license": "MIT", "dependencies": { - "@expo/config-types": "^57.0.2", - "@expo/json-file": "~11.0.1", - "@expo/plist": "^0.8.1", - "@expo/require-utils": "^57.0.4", - "@expo/sdk-runtime-versions": "^1.0.0", + "@expo/config-types": "^58.0.3", + "@expo/json-file": "~11.2.1", + "@expo/plist": "^0.10.1", + "@expo/require-utils": "^58.0.4", + "@expo/sdk-runtime-versions": "^1.0.1", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", "glob": "^13.0.0", - "semver": "^7.5.4", + "semver": "^7.7.4", "slugify": "^1.6.6", "xcode": "^3.0.1", "xml2js": "0.6.0" } }, - "node_modules/@expo/prebuild-config/node_modules/@react-native/normalize-colors": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.86.0.tgz", - "integrity": "sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==", - "license": "MIT" - }, "node_modules/@expo/prebuild-config/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8425,9 +8153,9 @@ } }, "node_modules/@expo/prebuild-config/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -8489,9 +8217,9 @@ } }, "node_modules/@expo/require-utils": { - "version": "57.0.4", - "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-57.0.4.tgz", - "integrity": "sha512-e7xbg/9BTQcsZE/oErafZXtI7kh5IgfasLJ97J5sFSzX2cA74pDvdlhW1KHVSaDkQyQv6h1LSLhsY7dEeOk7hw==", + "version": "58.0.4", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-58.0.4.tgz", + "integrity": "sha512-DvjS5NCitXYcad2Woe1EMHJKcbhTbE77HX0BgOQGL2LFHE3q2H0n8kCWDPBOCVJ63Drap3c35nwoJwF5TQL7Tw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -8507,50 +8235,16 @@ } } }, - "node_modules/@expo/router-server": { - "version": "57.0.4", - "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-57.0.4.tgz", - "integrity": "sha512-ucqCP0hK8nZb9+S8QJYdQxNCkfRClzkKdg2RpWYDKDYgRIHyoRyxEDRgDgvbhH+q78yfY83abU8OTx8MMOrf1g==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "@expo/metro-runtime": "^57.0.7", - "expo": "*", - "expo-constants": "^57.0.7", - "expo-font": "^57.0.1", - "expo-router": "*", - "expo-server": "^57.0.1", - "react": "*", - "react-dom": "*", - "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" - }, - "peerDependenciesMeta": { - "@expo/metro-runtime": { - "optional": true - }, - "expo-router": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-server-dom-webpack": { - "optional": true - } - } - }, "node_modules/@expo/schema-utils": { - "version": "57.0.2", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-57.0.2.tgz", - "integrity": "sha512-fMu/jyN0l1Wzv7XkeWR4IYCx1M8ryui3FdBNGrWwbRgJ7EhxXxK8E2jxP2W3pbgUwUY0V3hG8+GyfCZwny+Lxw==", + "version": "58.0.2", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-58.0.2.tgz", + "integrity": "sha512-w28y8SG+5ZTdDdmH2ZnCQk9wHVwGzI9NqX5V4urJUFEnxbm7I129fJRkb8RIAJmMA1WKU5h3ONmranV473uaXQ==", "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", - "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.1.tgz", + "integrity": "sha512-kvisefkhxu8Fm/4M8G6DEqUaigrXfrSOm2lFw7hsk/nq0zchcp6B4wSk8rlheHY8FRi5iHxKtoVMGY/3M6h04A==", "license": "MIT" }, "node_modules/@expo/spawn-async": { @@ -8572,19 +8266,19 @@ "license": "MIT" }, "node_modules/@expo/ws-tunnel": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-2.0.0.tgz", - "integrity": "sha512-j+JfTRdCk820J9dU0sA2SqshQIKFOMo7ED84w9MJFcebfbNQgsLztEY/SABDkGnjatrW4xGqnUhVRxSBVyCkXw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-2.0.1.tgz", + "integrity": "sha512-mljsRffbOHzmSimYQbQu9h9NR3alwCCwEEouRGFL4QRTt8dNvsNtKEPa/5jHmtDLDtsh4xXsWKwzjN9BTpeXHQ==", "license": "MIT", "peerDependencies": { "ws": "^8.0.0" } }, "node_modules/@expo/xcpretty": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.4.tgz", - "integrity": "sha512-4aQzz9vgxcNXFfo/iyNgDDYfsU5XGKKxWxZopw0cVotHiW+U8IJbIxMaxsINs6bHhtkG3StKNPcOrn3eBuxKPw==", - "license": "BSD-3-Clause", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.7.tgz", + "integrity": "sha512-EbxYllZ7/ozONVZd425cm4XnolfW+AmSFT5aP7Jdno6oc3WrYQcHz2CO20z/2rwWwYgztmV2PXvYH+BQ8YFjqg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", "chalk": "^4.1.0", @@ -11160,7 +10854,7 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "camelcase": "^5.3.1", @@ -11175,7 +10869,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -11183,7 +10877,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -11195,7 +10889,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -11206,7 +10900,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -11220,7 +10914,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -11231,7 +10925,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { "version": "4.0.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -11239,7 +10933,7 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -11465,8 +11159,9 @@ }, "node_modules/@jest/create-cache-key-function": { "version": "29.7.0", - "devOptional": true, + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -11474,9 +11169,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/diff-sequences": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.5.0.tgz", + "integrity": "sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/environment": { "version": "29.7.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", @@ -11488,6 +11193,330 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/environment-jsdom-abstract": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.5.2.tgz", + "integrity": "sha512-8/P+8hKv7L4mhFoB6gpYLj/fuzXk8PWrde7TDHh8tJz5pE1ktlMbg0y6hDY/V8MfAnispFlPl/vPifowLy3JGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.5.2", + "@jest/fake-timers": "30.5.2", + "@jest/types": "30.5.1", + "@types/node": "*", + "jest-mock": "30.5.2", + "jest-util": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/jsdom": "*", + "canvas": "^3.0.0", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/environment": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.5.2.tgz", + "integrity": "sha512-nwFPOUMbmsjNNRCpnJpB9HbSZu4C07wDDds++5j+j1MezzPLxMPDdbdUVjr2o4RULDOValnDd70taPFI1EtxAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.5.2", + "@jest/types": "30.5.1", + "@types/node": "*", + "jest-mock": "30.5.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/expect-utils": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.5.2.tgz", + "integrity": "sha512-d/HOLSrJUlBIl6n3LzOa7cjW3xdePm5H5gQw2lixZ/0h157l9sw3mLblzFqnPcTbhDzhRQdBOX3A3KcG73nm5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.5.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/fake-timers": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.5.2.tgz", + "integrity": "sha512-GKk0h0tKT5SpDPxDhPg3r9mm5s8/YCBzVNMOGdRiQXwUiMsjU10mVPlMaQstH6/cu50vOb8N9oQUMETHuwwxKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.5.1", + "@sinonjs/fake-timers": "^15.4.0", + "@types/node": "*", + "jest-message-util": "30.5.1", + "jest-mock": "30.5.2", + "jest-util": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/schemas": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.5.0.tgz", + "integrity": "sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/types": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.5.1.tgz", + "integrity": "sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.5.0", + "@jest/schemas": "30.5.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinclair/typebox": { + "version": "0.34.52", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", + "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinonjs/fake-timers": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-message-util": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.5.1.tgz", + "integrity": "sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.5.1", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-util": "30.5.1", + "picomatch": "^4.0.3", + "pretty-format": "30.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-mock": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.5.2.tgz", + "integrity": "sha512-KTHb37Fhj8xY8qPFvTFaFJHcdsumQp+ExsUlgoX232Agmc706gagBs53+CYvulV7MVQo9AgXOUxsqzzVBoJlrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.5.2", + "@jest/types": "30.5.1", + "@types/node": "*", + "jest-util": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-util": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.5.1.tgz", + "integrity": "sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.5.1", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/pretty-format": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.5.1.tgz", + "integrity": "sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/react-is-18": "npm:react-is@^18.3.1", + "@jest/react-is-19": "npm:react-is@^19.2.5", + "@jest/schemas": "30.5.0", + "ansi-styles": "^5.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/expect": { "version": "29.7.0", "dev": true, @@ -11513,7 +11542,7 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -11527,6 +11556,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/get-type": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.5.0.tgz", + "integrity": "sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/globals": { "version": "29.7.0", "dev": true, @@ -11541,6 +11580,30 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/pattern": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.5.0.tgz", + "integrity": "sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.5.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.5.0.tgz", + "integrity": "sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/react-is-18": { "name": "react-is", "version": "18.3.1", @@ -11771,6 +11834,137 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/snapshot-utils": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.5.1.tgz", + "integrity": "sha512-V3wnxNtiVmw5PPVg433Cn3VdXnsOeu/ofLw3KC04Bn2y1wIlU5kozXQn48rhrgj/02LrCVtntTEF1yBha0XSUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.5.1", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/schemas": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.5.0.tgz", + "integrity": "sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/types": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.5.1.tgz", + "integrity": "sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.5.0", + "@jest/schemas": "30.5.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@sinclair/typebox": { + "version": "0.34.52", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", + "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/snapshot-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/snapshot-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/source-map": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", @@ -11820,7 +12014,7 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", @@ -11845,7 +12039,7 @@ }, "node_modules/@jest/transform/node_modules/ansi-styles": { "version": "4.3.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -11859,7 +12053,7 @@ }, "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -11874,7 +12068,7 @@ }, "node_modules/@jest/transform/node_modules/color-convert": { "version": "2.0.1", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -11885,12 +12079,12 @@ }, "node_modules/@jest/transform/node_modules/color-name": { "version": "1.1.4", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -11898,7 +12092,7 @@ }, "node_modules/@jest/transform/node_modules/supports-color": { "version": "7.2.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -11909,7 +12103,7 @@ }, "node_modules/@jest/transform/node_modules/write-file-atomic": { "version": "4.0.2", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -11992,23 +12186,23 @@ "node": ">=8" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, @@ -12053,9 +12247,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -12988,6 +13182,146 @@ "node": ">= 8" } }, + "node_modules/@noxcturnal/noxcturnal-darwin-arm64": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@noxcturnal/noxcturnal-darwin-arm64/-/noxcturnal-darwin-arm64-0.1.5.tgz", + "integrity": "sha512-hQgDaWxKYln83Uk1Hh4Liju9AvGoYh4aLd4A1ou3lGn5hxzhW2uO+z3mERtWk6BMGVazvi/yUXtp9x3IlaWyhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@noxcturnal/noxcturnal-darwin-x64": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@noxcturnal/noxcturnal-darwin-x64/-/noxcturnal-darwin-x64-0.1.5.tgz", + "integrity": "sha512-I57zR8QF7Xam+4nGD5UoIODsw0VjkVyn51iDBL3CMaDR5Lh1OxXwKZMYKtv3CtQl+RSDsMfmXBEqGYLE8lIPHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@noxcturnal/noxcturnal-linux-arm64-gnu": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@noxcturnal/noxcturnal-linux-arm64-gnu/-/noxcturnal-linux-arm64-gnu-0.1.5.tgz", + "integrity": "sha512-gVH4XJPh8RdrdjjlU0dKeielQt/FXfvqhr8IEWEf3VeNtQs8l2rPzFPdqS0uwLWQYHLBGgB0LkuOil1KKYx1gQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@noxcturnal/noxcturnal-linux-arm64-musl": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@noxcturnal/noxcturnal-linux-arm64-musl/-/noxcturnal-linux-arm64-musl-0.1.5.tgz", + "integrity": "sha512-rzQ075fcHZ+ebsELussRjnW8WBMy1RuLdS8wSqBGhdVlPR7/NaSyoWkNxnVDT8sEO26xjqGoW/o/08ghBzr/zA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@noxcturnal/noxcturnal-linux-x64-gnu": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@noxcturnal/noxcturnal-linux-x64-gnu/-/noxcturnal-linux-x64-gnu-0.1.5.tgz", + "integrity": "sha512-X5O0lXMrv8HGOGoXDB1PG0Hjt7Rl+MJA+seR2NecQvUAAw2gzDvF/unCV5sqTAVeHfXhBHEFGkLenHZSD44efg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@noxcturnal/noxcturnal-linux-x64-musl": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@noxcturnal/noxcturnal-linux-x64-musl/-/noxcturnal-linux-x64-musl-0.1.5.tgz", + "integrity": "sha512-fkQIQHRxqldNXVmjxfeCvGOiLhLU9SLBw1As02pMA2xjyiZfiXcUn4SUrZ92ciGnyCS8/XMbx+nZSxgEc3qDPw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@noxcturnal/noxcturnal-win32-arm64-msvc": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@noxcturnal/noxcturnal-win32-arm64-msvc/-/noxcturnal-win32-arm64-msvc-0.1.5.tgz", + "integrity": "sha512-baeH5m/vM1nf0J2UkW8cfgiVogpM0gRO9b4PZWknXQPbv5+k+0N5sGOYl/UAO2q72qYb3Xbiu7eD8c4A2kR2SA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@noxcturnal/noxcturnal-win32-x64-msvc": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@noxcturnal/noxcturnal-win32-x64-msvc/-/noxcturnal-win32-x64-msvc-0.1.5.tgz", + "integrity": "sha512-2faDMzom8pCG/s/uR4Czh1atz4KohI85AaSmA2vtAuVnCq+nLL4Viys3A5vUlNz9MNBmTNFxzXyF2Z5HtfxXLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@octokit/auth-token": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", @@ -15147,6 +15481,324 @@ "node": "^20.19.0 || >=22.12.0" } }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@peggyjs/from-mem": { "version": "1.3.0", "dev": true, @@ -15188,6 +15840,19 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.25", "dev": true, @@ -15646,11 +16311,16 @@ } }, "node_modules/@react-native-documents/picker": { - "version": "10.1.3", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@react-native-documents/picker/-/picker-12.0.3.tgz", + "integrity": "sha512-uRSJkS8UKPwiaBUAyJGeDBMKaseKGbHqQb5PhUsrNFMA2/fV+JG5HBohtPhKiIhLaKDQ1vdpEGza0aDxrj49NA==", "license": "MIT", + "funding": { + "url": "https://github.com/react-native-documents/document-picker?sponsor=1" + }, "peerDependencies": { "react": "*", - "react-native": "*" + "react-native": ">=0.79.0" } }, "node_modules/@react-native-firebase/analytics": { @@ -15707,32 +16377,44 @@ "react-native": "*" } }, + "node_modules/@react-native/asset-utils": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/asset-utils/-/asset-utils-0.88.0.tgz", + "integrity": "sha512-Bj1DxQt5f4OrjdlgSVkZT37Z3hx5hUIN5AUDSqL/e99vgtTcqj5vnm067epZL1EF/QiqsniZO8Q1GSkItOakDg==", + "license": "MIT", + "engines": { + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" + } + }, "node_modules/@react-native/assets-registry": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.86.0.tgz", - "integrity": "sha512-nIaXbm2jX1OTYp0qbviJ3O6KZivoE8z3BnhUQ2LsqfZSWRoOK/n1qsiAr6oALiNKWnXY3j2KPwtYORnZzp8xew==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.88.0.tgz", + "integrity": "sha512-nHFAzcqTs7jMmfqYb8sdoY0Uoxhq6GJDCNGEGGpzEXN9VIMD8xk2VSmITfjOsdQaAC5z+yRHTYFnE+u62UkJzQ==", "license": "MIT", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" + }, + "peerDependencies": { + "react-native": "*" } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.86.0.tgz", - "integrity": "sha512-qdsABWNW7uTll90l4Vh03gjeyu3WVDi2CyiiyvYGMRDcoYbjbQi6df3BMAm9lQI2yslZ1T14LlDDAsgTwNxplA==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.88.0.tgz", + "integrity": "sha512-leGEnCcS7Q0hTxvzvhNtr8zGQpI1gfWqXjzC4UedsFmNMv6kIo4s70o0XbtM30ZXbpfWe4BcSC8NKWuak5sI4A==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.29.0", - "@react-native/codegen": "0.86.0" + "@react-native/codegen": "0.88.0" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/@react-native/babel-preset": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.86.0.tgz", - "integrity": "sha512-bYQcWiPySNvF4dns9Ls9gMmwgq66ohvM9Fwc/Kn8r85t66UNHxch3p1QwPiSorDelFauZwJbgo9+ReibTgvpbA==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.88.0.tgz", + "integrity": "sha512-iMfAHhFGNegnReSY6CYaWHncvyDwHq8olRs0zp9nRRApMAoCiLyfo1dwL/f39qt/MreD6xIqUs9SrTPYWobY6g==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -15764,74 +16446,59 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@react-native/babel-plugin-codegen": "0.86.0", - "babel-plugin-syntax-hermes-parser": "0.36.0", + "@react-native/babel-plugin-codegen": "0.88.0", "babel-plugin-transform-flow-enums": "^0.0.2", + "flow-parser": "0.327.0", "react-refresh": "^0.14.0" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "peerDependencies": { "@babel/core": "*" } }, "node_modules/@react-native/codegen": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.86.0.tgz", - "integrity": "sha512-uTs9DBo3+/lUqinsGZK0FKJRBVClrwMXoZToaDxE1Q2SL2e55vs2GwyZfIKzPl5uJnbu4PfFMIp0/mLXLWUMuA==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.88.0.tgz", + "integrity": "sha512-SAGg+XfzsrPiYTscbKa9bo2/H2ei2TjyxW8RTMq2Ps661kRK3AnmpMGVfrEFshEMr3FGEbuQIvj86X98kaXlRA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.29.0", - "hermes-parser": "0.36.0", + "flow-parser": "0.327.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "tinyglobby": "^0.2.15", "yargs": "^17.6.2" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "peerDependencies": { "@babel/core": "*" } }, - "node_modules/@react-native/codegen/node_modules/hermes-estree": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.0.tgz", - "integrity": "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==", - "license": "MIT" - }, - "node_modules/@react-native/codegen/node_modules/hermes-parser": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.0.tgz", - "integrity": "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.36.0" - } - }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.86.0.tgz", - "integrity": "sha512-Jv8p1ebEPfTzs8gmrjsdT2XMXFfeAg45Pman+XPLFGaSeGAZkutRFRyX9Cs9aGTSOyIA9YPJ6vDNb1ayTf1FKQ==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.88.0.tgz", + "integrity": "sha512-WrQdXbjVt1gwAay8ZzYtpOi9ly99ksJ0VMYFdVcMe6nq3vtiRgqKRpHgCdN6ySIbtr5o+aJ+Vr7OTDY98ec/Ow==", "license": "MIT", "dependencies": { - "@react-native/dev-middleware": "0.86.0", + "@react-native/asset-utils": "0.88.0", + "@react-native/dev-middleware": "0.88.0", + "commander": "^12.0.0", "debug": "^4.4.0", "invariant": "^2.2.4", - "metro": "^0.84.3", - "metro-config": "^0.84.3", - "metro-core": "^0.84.3", + "metro": "^0.87.1", "semver": "^7.1.3" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "peerDependencies": { "@react-native-community/cli": "*", - "@react-native/metro-config": "0.86.0" + "@react-native/metro-config": "0.88.0" }, "peerDependenciesMeta": { "@react-native-community/cli": { @@ -15843,18 +16510,18 @@ } }, "node_modules/@react-native/debugger-frontend": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.86.0.tgz", - "integrity": "sha512-7Mb3nDfyJeys+ELF75Ageu7VKERlnIMoO+aNPoXqTXvz+b41L6l2CqMyLpDHxkBSlenij6gEepPNgaIyWHbJZw==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.88.0.tgz", + "integrity": "sha512-v5cnBaaWhDRPcQv8EC20zj53jOAKH7u2wnzzXS4JTNu+diPC+cA2+kC7rq3eKI5vGhlAcG2kDPoViRuC0AY0oA==", "license": "BSD-3-Clause", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/@react-native/debugger-shell": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.86.0.tgz", - "integrity": "sha512-Y0zEkZzLz8ou6o/VLml1A31X/rMgc6DRjwxwzPMa94qRTMY070WeBCNTITQo4kKTBAUgbxh07oXPQqp0Tpja8w==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.88.0.tgz", + "integrity": "sha512-p82zT8ZKNx7nIm/8zf8pi55sxm5KQBm8td47kzoJysTdqHLyPsRMUvDXtvCJIWadHSv7RJ6t/yiCc+IoImLBtw==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.6", @@ -15862,147 +16529,158 @@ "fb-dotslash": "0.5.8" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/@react-native/dev-middleware": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.86.0.tgz", - "integrity": "sha512-20pTO6yTybmvXvro520H6C7jydIQnLKOl5qFtVEcHSdFrY63r3OGei+Rx9bILgSRmH6jgnfEcijcMx7pwWuQtw==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.88.0.tgz", + "integrity": "sha512-sHLxVHOwfkF672ZzMepNh4d3IKbrZy3qXDKWSwN5LC5VJkzzZ5FdmSPP4N/CCn2pcKJ4oSqvojXwN4De3Xk92A==", "license": "MIT", "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.86.0", - "@react-native/debugger-shell": "0.86.0", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.3.0", + "@react-native/debugger-frontend": "0.88.0", + "@react-native/debugger-shell": "0.88.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", - "open": "^7.0.3", + "open": "^8.4.2", "serve-static": "^1.16.2", "ws": "^7.5.10" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@react-native/gradle-plugin": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.86.0.tgz", - "integrity": "sha512-a1RcfaEDqWExCGfCwadIxt4l8FvKYgFqeMf2uzeKyAOnb+vTGNIeCvifFL2MqvgaeYxlER437HbMIajGcuJ1pQ==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.88.0.tgz", + "integrity": "sha512-4jPSKslOfJj8NKY/jv9qmWkxZYmqPyamoS3Vs0JOFxw9t4PM6L/ea0fUsjNV0LxC9zJlvWilPJOCTOf7h8wlyw==", "license": "MIT", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/@react-native/jest-preset": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/jest-preset/-/jest-preset-0.86.0.tgz", - "integrity": "sha512-KA+xpIP3DvJy7PQJ9c6ZdEKkOPChl+Rk/rV2MhQACEAzfhWU84407KZQv4ccyO3B4caD0gPrFjE96a4P993nsQ==", - "devOptional": true, + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/jest-preset/-/jest-preset-0.88.0.tgz", + "integrity": "sha512-dN97NNqBsShAcxGH8/mNSBgYYc7Xk8q+Hez9qG9iockB4GPir5/Aw45e14sn7iLYTu2HkY0Uq2h3WlMY+ekRxw==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/js-polyfills": "0.86.0", + "@react-native/js-polyfills": "0.88.0", "babel-jest": "^29.7.0", "jest-environment-node": "^29.7.0", "regenerator-runtime": "^0.13.2" }, "engines": { - "node": ">= 20.19.4" + "node": ">= 22.13.0" }, "peerDependencies": { "react": "^19.2.3" } }, "node_modules/@react-native/js-polyfills": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.0.tgz", - "integrity": "sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.88.0.tgz", + "integrity": "sha512-Iq6v4+EWdOLv0M1+BpADQJBVfInl6FkABXCIBSi0FbvHahEYT+Y4UJ7Cm96p18gbEN1VKzqz3nbBbwLA6bx0rQ==", "license": "MIT", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/@react-native/metro-babel-transformer": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.86.0.tgz", - "integrity": "sha512-SjKej3E5qIahqo/G+rSOrmJUQM44RyKtWtO+VfmKAAMoJWkBFomM22hTLKCIS5cdbIAJ9COAmU+KAi2wVSO0wQ==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.88.0.tgz", + "integrity": "sha512-xsUfzXrqKXeD7sBja7hkyBG32AGIwWJ3IEZ+UcNMRTR/sucnXXZ6Do40qXoeY52YC8b9//J+p51JIp2CC0DZKA==", "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.86.0", - "hermes-parser": "0.36.0", + "@react-native/babel-preset": "0.88.0", + "flow-parser": "0.327.0", "nullthrows": "^1.1.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "peerDependencies": { "@babel/core": "*" } }, - "node_modules/@react-native/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.0.tgz", - "integrity": "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-native/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.0.tgz", - "integrity": "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==", - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.36.0" - } - }, "node_modules/@react-native/metro-config": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.86.0.tgz", - "integrity": "sha512-7v+xbTeEci9ZcQ/Z1OqI4RXcqN69wSMDYL5BAMvOReZ7U04+aDQ0/SQhClYPn6x2/RxM4WzMKSAuNyLKqvYVtw==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.88.0.tgz", + "integrity": "sha512-iPV2HNXlPs7xQDBJJGIjkH0x2psZwJeRIEpfSqxgqLaO5eEfE2Ccicfz2OBHBcIC5jKGGa4IoI/e26zMNDuTMQ==", "license": "MIT", "peer": true, "dependencies": { - "@react-native/js-polyfills": "0.86.0", - "@react-native/metro-babel-transformer": "0.86.0", - "metro-config": "^0.84.3", - "metro-runtime": "^0.84.3" + "@react-native/js-polyfills": "0.88.0", + "@react-native/metro-babel-transformer": "0.88.0", + "metro-config": "^0.87.1", + "metro-runtime": "^0.87.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/@react-native/normalize-color": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz", + "integrity": "sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==", "license": "MIT" }, "node_modules/@react-native/normalize-colors": { - "version": "0.74.85", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.88.0.tgz", + "integrity": "sha512-eZCu3tGAQCfvMCPQJVY4dmoMX8ZZYBvqIGHX7lwOYyzNK+Dl8e5ky7ZoXub1Rq75oSrQXNNmSP2CDjNNXXZpFQ==", "license": "MIT" }, "node_modules/@react-native/virtualized-lists": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.86.0.tgz", - "integrity": "sha512-4/ZLXdf/OSpPDVO0AsQ1SJdRIzt5t9BNQ46QwGgxvX7/cirYR5k8KXctNGGgW8lQo2gZChEfY2zFCZg9nM/jiw==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.88.0.tgz", + "integrity": "sha512-zpZIOAbobdS93edwHkNUdGDzvElNeQJqukRERRPns3/ucPvuMd2G4fYpmVJSVjhxtGCcLLB1PFndLYYfwaYoBQ==", "license": "MIT", "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "peerDependencies": { "@types/react": "^19.2.0", "react": "*", - "react-native": "0.86.0" + "react-native": "0.88.0" }, "peerDependenciesMeta": { "@types/react": { @@ -16047,9 +16725,9 @@ } }, "node_modules/@react-navigation/core/node_modules/react-is": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.3.0.tgz", - "integrity": "sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==", + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.3.1.tgz", + "integrity": "sha512-RRieF6IyxQBkcK6pP8xOHprLTPW6QjRkbGdImtqNme+/hYVwCZkLQLdlZGOhUqXwkS9IEynaGvPJtv6XB/cz0Q==", "license": "MIT" }, "node_modules/@react-navigation/devtools": { @@ -16185,15 +16863,19 @@ } }, "node_modules/@react-ng/bounds-observer/node_modules/@types/react": { - "version": "18.3.20", + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@react-ng/bounds-observer/node_modules/@types/react-dom": { - "version": "18.3.6", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" @@ -19168,7 +19850,7 @@ }, "node_modules/@sinonjs/commons": { "version": "2.0.0", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" @@ -19176,7 +19858,7 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "10.0.2", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0" @@ -20697,7 +21379,7 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", @@ -20709,7 +21391,7 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.4", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" @@ -20717,7 +21399,7 @@ }, "node_modules/@types/babel__template": { "version": "7.4.1", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", @@ -20728,7 +21410,7 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.2" @@ -20860,7 +21542,7 @@ }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -20929,28 +21611,6 @@ "parse5": "^7.0.0" } }, - "node_modules/@types/jsdom/node_modules/entities": { - "version": "4.5.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@types/jsdom/node_modules/parse5": { - "version": "7.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -21045,12 +21705,12 @@ } }, "node_modules/@types/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.3.tgz", - "integrity": "sha512-k5dJVszUiNr1DSe8Cs+knKR6IrqhqdhpUwzqhkS8ecQTSf3THNtbfIp/umqHMpX2bv+9dkx3fwDv/86LcSfvSg==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", "license": "MIT", "dependencies": { - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-collapse": { @@ -21062,12 +21722,12 @@ } }, "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", "license": "MIT", "peerDependencies": { - "@types/react": "^19.2.0" + "@types/react": "^19.3.0" } }, "node_modules/@types/react-is": { @@ -21153,7 +21813,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/@types/supercluster": { @@ -22481,9 +23141,9 @@ } }, "node_modules/agent-cli-detector": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/agent-cli-detector/-/agent-cli-detector-0.1.4.tgz", - "integrity": "sha512-qPgevFvpaQoBaRJVKzr8R7h1WPvV3DtbgRIQlne4le66KBzXx5hNBwo/+NTw67LgkKBlhCzksrdautpUdlls0Q==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/agent-cli-detector/-/agent-cli-detector-0.1.7.tgz", + "integrity": "sha512-d8OWDVdZMgjhLUT9ZPgSv/BdFFF9pVuscC0JdUSz3bjwE15gcp6u/o0/JooM2yyAWC49KThFhXlgTXRa9B7yng==", "license": "MIT", "bin": { "agent-cli-detector": "dist/cli.js" @@ -22614,7 +23274,7 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -22659,7 +23319,7 @@ }, "node_modules/argparse": { "version": "1.0.10", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -23040,7 +23700,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", @@ -23060,7 +23720,7 @@ }, "node_modules/babel-jest/node_modules/ansi-styles": { "version": "4.3.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -23074,7 +23734,7 @@ }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -23089,7 +23749,7 @@ }, "node_modules/babel-jest/node_modules/color-convert": { "version": "2.0.1", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -23100,12 +23760,12 @@ }, "node_modules/babel-jest/node_modules/color-name": { "version": "1.1.4", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -23113,7 +23773,7 @@ }, "node_modules/babel-jest/node_modules/supports-color": { "version": "7.2.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -23268,7 +23928,7 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -23283,7 +23943,7 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", @@ -23401,9 +24061,9 @@ } }, "node_modules/babel-plugin-react-native-web": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", - "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.4.tgz", + "integrity": "sha512-FSclsDTGi5EcvpbW3TM7s8GLWwQqo5wI9zQqJr2m0IoJRenSkp1+bVvdeZXTNznI5Ms9Bry7DLBR+C5Shb9gtw==", "license": "MIT" }, "node_modules/babel-plugin-syntax-hermes-parser": { @@ -23446,7 +24106,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -23470,10 +24130,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "57.0.3", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-57.0.3.tgz", - "integrity": "sha512-JuTLwC4dt30GF3L8sY7EBwh5iD7L3dSWumfg+i99bFK2SIXWyfn01UHxu+azfKXFU/ufim9oUt9KUoJ9AvyOPA==", - "dev": true, + "version": "58.0.17", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-58.0.17.tgz", + "integrity": "sha512-Rrqc/Z5Idc4bG2/PrEh725t3kvuAc7jUKCJ+wZVU9KXk2bKSdqAniXxQa8aph9aHdv4h5sGKLpMXMaMNz/4+Og==", "license": "MIT", "dependencies": { "@babel/generator": "^7.20.5", @@ -23512,9 +24171,9 @@ "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-plugin-codegen": "0.86.0", + "@react-native/babel-plugin-codegen": "0.88.0", "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-react-native-web": "~0.21.4", "babel-plugin-syntax-hermes-parser": "^0.36.0", "babel-plugin-transform-flow-enums": "^0.0.2", "debug": "^4.3.4" @@ -23522,7 +24181,7 @@ "peerDependencies": { "@babel/runtime": "^7.20.0", "expo": "*", - "expo-widgets": "^57.0.5", + "expo-widgets": "^58.0.20", "react-refresh": ">=0.14.0 <1.0.0" }, "peerDependenciesMeta": { @@ -23539,7 +24198,7 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", @@ -23554,7 +24213,7 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/base-64": { @@ -23791,7 +24450,7 @@ "version": "1.1.21", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -24279,24 +24938,6 @@ "node": ">=18" } }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -24306,19 +24947,6 @@ "node": ">=6.0" } }, - "node_modules/chromium-edge-launcher": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz", - "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4" - } - }, "node_modules/ci-info": { "version": "3.8.0", "funding": [ @@ -24747,7 +25375,7 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/concurrently": { @@ -25566,6 +26194,20 @@ "dev": true, "license": "MIT" }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -25786,6 +26428,47 @@ "node": ">= 12" } }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -26408,6 +27091,19 @@ "node": ">=4" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/error-ex": { "version": "1.3.2", "devOptional": true, @@ -27607,7 +28303,7 @@ }, "node_modules/esprima": { "version": "4.0.1", - "devOptional": true, + "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -27822,40 +28518,44 @@ } }, "node_modules/expo": { - "version": "57.0.8", - "resolved": "https://registry.npmjs.org/expo/-/expo-57.0.8.tgz", - "integrity": "sha512-0IxxoPZbT54IH4fHL5NihkvED9HBVQx3uNdPvyv8pFUHWJ81RdFjL0aJys1IB7hbo09KTz4xW4I2aWVOXKAcJQ==", + "version": "58.0.14", + "resolved": "https://registry.npmjs.org/expo/-/expo-58.0.14.tgz", + "integrity": "sha512-M05O++KRgG4NA6kQ9AP60kbN8xqHJ6S8uTXdtkeiwcGVIYzdu2kaUXJyraVturvePO/Mf4PWa0C9+JggrHITwA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "^57.0.10", - "@expo/config": "~57.0.6", - "@expo/config-plugins": "~57.0.6", - "@expo/devtools": "~57.0.1", - "@expo/dom-webview": "~57.0.1", - "@expo/fingerprint": "^0.20.6", - "@expo/local-build-cache-provider": "^57.0.4", - "@expo/log-box": "^57.0.1", - "@expo/metro": "~56.0.0", - "@expo/metro-config": "~57.0.7", + "@expo/cli": "^58.1.11", + "@expo/config": "~58.0.6", + "@expo/config-plugins": "~58.0.9", + "@expo/devtools": "~58.0.2", + "@expo/dom-webview": "~58.0.2", + "@expo/fingerprint": "^0.21.5", + "@expo/local-build-cache-provider": "^58.0.6", + "@expo/log-box": "^58.0.12", + "@expo/log-box-utils": "^58.0.2", + "@expo/metro": "~58.0.0", + "@expo/metro-config": "~58.0.14", "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~57.0.4", - "expo-asset": "~57.0.7", - "expo-constants": "~57.0.7", - "expo-file-system": "~57.0.1", - "expo-font": "~57.0.1", - "expo-keep-awake": "~57.0.1", - "expo-modules-autolinking": "~57.0.9", - "expo-modules-core": "~57.0.7", + "babel-preset-expo": "~58.0.17", + "expo-asset": "~58.0.16", + "expo-constants": "~58.0.12", + "expo-file-system": "~58.0.9", + "expo-font": "~58.0.8", + "expo-keep-awake": "~58.0.3", + "expo-modules-autolinking": "~58.0.13", + "expo-modules-core": "~58.0.22", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", - "whatwg-url-minimum": "^0.1.2" + "whatwg-url-minimum": "^0.2.0" }, "bin": { "expo": "bin/cli", "expo-modules-autolinking": "bin/autolinking", "fingerprint": "bin/fingerprint" }, + "engines": { + "node": "^22.13.0 || ^24.3.0 || ^26.0.0 || >=27.0.0" + }, "peerDependencies": { "@expo/dom-webview": "*", "@expo/metro-runtime": "*", @@ -27884,13 +28584,13 @@ } }, "node_modules/expo-asset": { - "version": "57.0.7", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-57.0.7.tgz", - "integrity": "sha512-TA6MRQq1HL0N6KGvNMzL6djdH5tGJ/eHPIhML+6bVu52mnXldmup2swdvP37zDnvoMUUXRVGsvwVHFmvhCbW6Q==", + "version": "58.0.16", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-58.0.16.tgz", + "integrity": "sha512-beR3uusLA+rFo+6Ug0L7FPR4b6y/37VwtYW2Jig/i+3Co+oyYCTnvVuFPWhb05W9TOZRxdHUEI569fVKIgtYAA==", "license": "MIT", "dependencies": { - "@expo/image-utils": "^0.11.4", - "expo-constants": "~57.0.7" + "@expo/image-utils": "^0.12.5", + "expo-constants": "~58.0.12" }, "peerDependencies": { "expo": "*", @@ -27899,9 +28599,9 @@ } }, "node_modules/expo-audio": { - "version": "57.0.3", - "resolved": "https://registry.npmjs.org/expo-audio/-/expo-audio-57.0.3.tgz", - "integrity": "sha512-FzO0gnVmlrKmNoox7xc/795uNiuuqnYBovo2kgnNICDKJ0kDi1Y5UJjqX+NATxCelZcNv5BtWs3POkKJADhNCA==", + "version": "58.0.9", + "resolved": "https://registry.npmjs.org/expo-audio/-/expo-audio-58.0.9.tgz", + "integrity": "sha512-oLH9ocd3qVBytMUIqYtqwbgnQuSOWFgW0NCqbkyt2B+uHbuZNQcmAdaUfuBgRyXXPCdWCV8gnTWwKhZzFa7wAA==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -27911,12 +28611,13 @@ } }, "node_modules/expo-constants": { - "version": "57.0.7", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-57.0.7.tgz", - "integrity": "sha512-ShDwaKnh3UieCQ/dG0kO8PuicTTatn3WDGmXbq/fukyzPXWhdUxf37DINVDQS6D3DDG7nfqItij+QvnDHSQhTg==", + "version": "58.0.12", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-58.0.12.tgz", + "integrity": "sha512-d3/dsps32nU4m6YJQbXQ1dIfn58GxfmJjTnZ0WtnhdSHTdG/oVsOakLqYRlX/FaLUKkQOSHXMf7hyCx+2a/HSQ==", "license": "MIT", "dependencies": { - "@expo/env": "~2.4.2" + "@expo/env": "~2.5.2", + "@expo/require-utils": "^58.0.4" }, "peerDependencies": { "expo": "*", @@ -27924,9 +28625,9 @@ } }, "node_modules/expo-file-system": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-57.0.1.tgz", - "integrity": "sha512-w7/ERvQFrGP2apTO9lDtZ+O6JQIhfakL7+Xqzh+rfMO9B4LB4qwrz+YvLgir8KFRVX64JHBnRuYBVLY1oQZcqw==", + "version": "58.0.9", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-58.0.9.tgz", + "integrity": "sha512-JT0km3Wa+wDz/7Rli8ifreoMnmk68ulf/uaWzRA26xm/4K+jGTY+cDhnboRmpmXUCBkED6uqxWmNoXjaVU9VUw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -27934,13 +28635,10 @@ } }, "node_modules/expo-font": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-57.0.1.tgz", - "integrity": "sha512-QyS9L1Kh9sKJg4gfU6rdbpxpmH+DyzBX8z6jVvXMUDoqLr1GqmkO/Wu379KCXjL///kWbhpNlbi7AgBuj4VdIQ==", + "version": "58.0.8", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-58.0.8.tgz", + "integrity": "sha512-i9HKj/ljdmmjLamYQEkI4wXJB9+ap7AG5CpCqK/bgwwy45y5T8+1lpNbYgRXE7aQgmDjPpzd09wX6dOZkHfrxg==", "license": "MIT", - "dependencies": { - "fontfaceobserver": "^2.1.0" - }, "peerDependencies": { "expo": "*", "react": "*", @@ -27948,9 +28646,9 @@ } }, "node_modules/expo-glass-effect": { - "version": "57.0.4", - "resolved": "https://registry.npmjs.org/expo-glass-effect/-/expo-glass-effect-57.0.4.tgz", - "integrity": "sha512-/AG2Kljbqfgxu+GchI2YFIbxiF9cPsIpCy4iNDzlRiZk9rvR6BwRfB6gfQVu3V2ExaoGf2h5IsEnqVI5MYNBAg==", + "version": "58.0.5", + "resolved": "https://registry.npmjs.org/expo-glass-effect/-/expo-glass-effect-58.0.5.tgz", + "integrity": "sha512-PkL1X/r0cTs6NG47Xp3TxRvtqSeRmPYhPOHp3GDmZB2oOxpjXge6qLi/bSSv0asFWqf+MLOlXZ+hq2Imuh0Z1g==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -27959,9 +28657,9 @@ } }, "node_modules/expo-image": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/expo-image/-/expo-image-57.0.1.tgz", - "integrity": "sha512-EP0lisd2bUqtErry4weRcMW9bLMxtKsht/MLLK3/3do5u4ZMiJbWkY5zfYV+WYmeGab7x9G0sjbeFeEagYGjMw==", + "version": "58.0.15", + "resolved": "https://registry.npmjs.org/expo-image/-/expo-image-58.0.15.tgz", + "integrity": "sha512-6jGpKZUhQtDpwF0u7V7ETWNdOV1gkDTpdeAYHi3t+lk09fd+ltDrHq3Me0W6S4ajAtpNu92bFype/IAJQwtyjw==", "license": "MIT", "dependencies": { "sf-symbols-typescript": "^2.2.0" @@ -27979,30 +28677,32 @@ } }, "node_modules/expo-image-loader": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-57.0.1.tgz", - "integrity": "sha512-uhrZKLT/cTl2mXyR28kPpVkS5O+PK9N1QA/07IFM4f5T4g0lTW1JHT3NEWwEEsGFldPmVX4j7LwUVVZxE+woug==", + "version": "58.0.3", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-58.0.3.tgz", + "integrity": "sha512-zlHudxC8OObyqCHmvdxJqURI7886KJ0cUJyn7R/a8FOD9fP837xKDN+u4SIt7XsSSVPNXzMd4Y7mN0pmup8NGA==", "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-image-manipulator": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/expo-image-manipulator/-/expo-image-manipulator-57.0.6.tgz", - "integrity": "sha512-9eg0nTC0LRwnPgLajs27FoZvlvj1uSmn9dtADzR9RmnrsGLn345llMqm29IbN+WSbdHJF7E3GlengThLdKAQLg==", + "version": "58.0.14", + "resolved": "https://registry.npmjs.org/expo-image-manipulator/-/expo-image-manipulator-58.0.14.tgz", + "integrity": "sha512-j7Y6p4NCnzJhCa64NecnER4SK+GG1YRszSwUIsCkvQF/5od70y0m48rxtAQu0ZlwXDAf92NU2kMPKzvjAGWgaQ==", "license": "MIT", "dependencies": { - "expo-image-loader": "~57.0.1" + "expo-image-loader": "~58.0.3" }, "peerDependencies": { - "expo": "*" + "expo": "*", + "react": "*", + "react-native": "*" } }, "node_modules/expo-keep-awake": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-57.0.1.tgz", - "integrity": "sha512-28lkFImeXTS+bhAjuCFV7w7tW5bXg27BJVrxv+nC/nyYa86qEa0oFeHwqol6ha5k4pdVDQgBF09GM4A1k76Ssg==", + "version": "58.0.3", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-58.0.3.tgz", + "integrity": "sha512-wLRF+XeVsD/Rt/ZyX+A0mk1brdf8vefWizNAPzqV5eOCgkj23LCRZdN8gUi5X8UwyR8UJ7Y7Dzdz4YDGB/4c9Q==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -28010,24 +28710,33 @@ } }, "node_modules/expo-location": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-57.0.6.tgz", - "integrity": "sha512-V9lcReOI9AANg9ITECzrTXUBW0lXjMaeWrf1zMDaJ+KeLkdkbIulEaDAuoj5PR5OZzAau7B8XAR54Z0JQnFBmw==", + "version": "58.0.17", + "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-58.0.17.tgz", + "integrity": "sha512-x0R6JKHwcTIi2r26LiywejVF/gN1jsTYvpEelcpUwPPBmIltG6aOxG6p+KN+ty8opJwFZiluv9XBDLntDIg+7Q==", "license": "MIT", "dependencies": { - "@expo/image-utils": "^0.11.4" + "@expo/image-utils": "^0.12.5" }, "peerDependencies": { - "expo": "*" + "expo": "*", + "expo-task-manager": "*", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-task-manager": { + "optional": true + } } }, "node_modules/expo-modules-autolinking": { - "version": "57.0.9", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-57.0.9.tgz", - "integrity": "sha512-lj2nsAKMMRLXSFnGgaaQrWJ2fdSpLPc/bca6Rkiw4g8zYPn7qX4MRUJgavvzm/hBrzvMnlhXVgJtidOGuwBh+w==", + "version": "58.0.13", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-58.0.13.tgz", + "integrity": "sha512-uzLFoTnAKabUdITvzRqWTvFkZsOdRPEXj7AEMAuBEhA2kGhqaBDa2EOWqPXVay0QJVoZuIQaEEgPGAXN1dPuYg==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^57.0.4", + "@expo/platforms": "^58.0.1", + "@expo/require-utils": "^58.0.4", "@expo/spawn-async": "^1.8.0", "chalk": "^4.1.0", "commander": "^7.2.0" @@ -28116,19 +28825,19 @@ } }, "node_modules/expo-modules-core": { - "version": "57.0.15", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-57.0.15.tgz", - "integrity": "sha512-HBxPXsx3eVLLRjAY57/8ghKDWIxjaEbluKKYFIq1OHPJC85ZfHsawwc0SOU4Z/qu+mdLz7Pwt5IkkWimeNSH5A==", + "version": "58.0.29", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-58.0.29.tgz", + "integrity": "sha512-S3L38WVxcn1sQfUr9fiUgKri2n4YKdtuToF3r45V7dVIUmHN69Fc7nZPF5BiMtOl/CgPWACicqUZr7jawBxXFg==", "license": "MIT", "dependencies": { - "@expo/expo-modules-macros-plugin": "0.6.1", - "expo-modules-jsi": "~57.0.7", + "expo-modules-jsi": "~58.0.21", + "expo-modules-macros": "0.27.1", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*", - "react-native-worklets": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0" + "react-native-worklets": ">=0.13.0" }, "peerDependenciesMeta": { "react-native-worklets": { @@ -28137,27 +28846,39 @@ } }, "node_modules/expo-modules-jsi": { - "version": "57.0.8", - "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-57.0.8.tgz", - "integrity": "sha512-MFwvKP0FXLkEET27KsKvOh/L7Dpu2d00UgzAlmKozJgtI23WTKSyKPxu+EOSs9peSgkHzKI0vQOhWjOseGBMkQ==", + "version": "58.0.21", + "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-58.0.21.tgz", + "integrity": "sha512-6FG3jKt89s+qolbalas+OE5gQjDYu/sfV7HVAFEw3JVtkS1+MVfCvQLxp3RAm85bVNO0vgfnbn5z6A8WSDWalA==", "license": "MIT", "peerDependencies": { "react-native": "*" } }, + "node_modules/expo-modules-macros": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/expo-modules-macros/-/expo-modules-macros-0.27.1.tgz", + "integrity": "sha512-xWNI+LpK4Pdmj52ygNYlxefZDhw4mpe6s5yVCLXpqtOyU3PPrFGJJJnDyBpOsOv+mXiYLeaszEEJEpDKBObZ7A==", + "license": "MIT", + "optionalDependencies": { + "@expo/modules-macros-linux-arm64": "0.27.1", + "@expo/modules-macros-linux-x64": "0.27.1", + "@expo/modules-macros-win32-arm64": "0.27.1", + "@expo/modules-macros-win32-x64": "0.27.1" + } + }, "node_modules/expo-server": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-57.0.1.tgz", - "integrity": "sha512-sBfVDH6dmKVHZxqUxbfkzS00PZELMZt1IpnHKxcOTMZtR/t7CtRAFrbXcisG+EyzeqHSVDacZT+1tbYfZt5D8w==", + "version": "58.0.5", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-58.0.5.tgz", + "integrity": "sha512-FHYecxfGOuAhacHcanR6qCN8Cln9S+FFulcYetLu3ddDg55ohuCsMZ9U4Egzwdm+A2o6N+MdSoJKquBC5F9NIg==", "license": "MIT", "engines": { - "node": ">=20.16.0" + "node": "^22.13.0 || ^24.3.0 || ^26.0.0 || >=27.0.0" } }, "node_modules/expo-store-review": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/expo-store-review/-/expo-store-review-57.0.1.tgz", - "integrity": "sha512-OktDBfIEe4DQXVxz7umFyg+slkZo/nrr4GfwiFJlNjOXl+F+vNsaGBdEn1aE4W5DAnSVpLQsjaZt1dts2HJXlQ==", + "version": "58.0.2", + "resolved": "https://registry.npmjs.org/expo-store-review/-/expo-store-review-58.0.2.tgz", + "integrity": "sha512-kzK8tVMCKAH+ztvJPsX0aNsjGQCGzyNtQgxhyt/Jzjlrpy2+GQA54jVPcsxUb5EMGEUIqImN94duAlC9tJXzwQ==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -28165,12 +28886,12 @@ } }, "node_modules/expo-task-manager": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/expo-task-manager/-/expo-task-manager-57.0.6.tgz", - "integrity": "sha512-nD6tvC3HNzjpOJir3Q8QDNOMtKrY2f1ik+fmKcOl7i/o822AEgGr7HpmDF/kpCQYGchdqBrodmkKcYwb9gxliQ==", + "version": "58.0.12", + "resolved": "https://registry.npmjs.org/expo-task-manager/-/expo-task-manager-58.0.12.tgz", + "integrity": "sha512-SLvNkkFJhkHwVzI1xfNiBxS3tNH2zxTUQXVFxpyMXtbc5GRIwRvgv/KYpheV3SjlIqiEh1yy6qG5kMmqKXcsMw==", "license": "MIT", "dependencies": { - "unimodules-app-loader": "~57.0.1" + "unimodules-app-loader": "~58.0.2" }, "peerDependencies": { "expo": "*", @@ -28178,9 +28899,9 @@ } }, "node_modules/expo-video": { - "version": "57.0.2", - "resolved": "https://registry.npmjs.org/expo-video/-/expo-video-57.0.2.tgz", - "integrity": "sha512-s8KDRpGNWOE7Vx7+1o89hGeXZ3evx00SrQ2+5odYcmvUikNvF59/VuFkg55+YIS981wVQz/07csK6hLAK/w4bQ==", + "version": "58.0.11", + "resolved": "https://registry.npmjs.org/expo-video/-/expo-video-58.0.11.tgz", + "integrity": "sha512-fCQE63LFMFbI9K+o/DNDtVM8MfmYp1PzfUUXMcajILPLuEw+j1C7Wp03vvZnIwwOUSubXJZmxDYSXBIHBnJmag==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -28189,118 +28910,195 @@ } }, "node_modules/expo-web-browser": { - "version": "57.0.2", - "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-57.0.2.tgz", - "integrity": "sha512-3vl5kvd7PB48ub6PpNIJUuPxO8xVa6D8RnIgNba6SXRwqFprOfeEZgwTgtm41kz0AAtvMOztUVNEUkwrHKjqMQ==", + "version": "58.0.6", + "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-58.0.6.tgz", + "integrity": "sha512-6/QtDqTOaTqM/ysYYdEZG4XDrWloOo1wVYCn4g3IgayF+1lZWTwMqa5j4kcn2TA1UBer8O7zbMQYLfSMppQ/zg==", "license": "MIT", "peerDependencies": { "expo": "*", "react-native": "*" } }, + "node_modules/expo/node_modules/@expo/cli": { + "version": "58.1.11", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-58.1.11.tgz", + "integrity": "sha512-wkFTSLXXYqLkRT5oy4DnLuTOtbFIu3qTiXHSHkFSqUBTHiE92y3bOIwM3UN7Y1ys18qVJge8lXjezaEfsHmijQ==", + "license": "MIT", + "dependencies": { + "@expo/code-signing-certificates": "^0.0.7", + "@expo/config": "~58.0.6", + "@expo/config-plugins": "~58.0.9", + "@expo/devcert": "^1.2.2", + "@expo/env": "~2.5.2", + "@expo/image-utils": "^0.12.5", + "@expo/inline-modules": "^0.2.6", + "@expo/json-file": "^11.2.1", + "@expo/log-box": "^58.0.12", + "@expo/log-box-utils": "^58.0.2", + "@expo/metro": "~58.0.0", + "@expo/metro-config": "58.0.14", + "@expo/metro-file-map": "^58.0.5", + "@expo/osascript": "^2.8.1", + "@expo/package-manager": "^1.14.2", + "@expo/platforms": "^58.0.1", + "@expo/plist": "^0.10.1", + "@expo/prebuild-config": "^58.0.14", + "@expo/require-utils": "^58.0.4", + "@expo/router-server": "^58.0.14", + "@expo/schema-utils": "^58.0.2", + "@expo/spawn-async": "^1.8.0", + "@expo/ws-tunnel": "^2.0.1", + "@expo/xcpretty": "^4.4.6", + "@react-native/asset-utils": "0.88.0", + "@react-native/dev-middleware": "0.88.0", + "@react-native/js-polyfills": "0.88.0", + "2g": "^1.0.1", + "accepts": "^1.3.8", + "agent-cli-detector": "0.1.7", + "arg": "^5.0.2", + "bplist-creator": "0.1.0", + "bplist-parser": "^0.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "dnssd-advertise": "^1.1.6", + "expo-server": "^58.0.5", + "fetch-nodeshim": "^0.4.10", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "lan-network": "^0.2.1", + "multitars": "^1.0.2", + "node-forge": "^1.4.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "picomatch": "^4.0.4", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "resolve-from": "^5.0.0", + "sandbox-cli-detector": "^0.2.0", + "semver": "^7.7.4", + "send": "^0.19.0", + "slugify": "^1.3.4", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "terminal-link": "^2.1.1", + "toqr": "^0.1.1", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1", + "zod": "^3.25.76" + }, + "bin": { + "expo-internal": "bin/cli.js" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/expo/node_modules/@expo/config-plugins": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.6.tgz", - "integrity": "sha512-7CmKrS5Rnu8aSZyNlxH2qzA7Ls1HEa4EQvEVOAkHDKPr1e4Cg/nz7I7dUl09QDTVjMvkKYDH4Th0DuAsgqASaw==", + "version": "58.0.9", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-58.0.9.tgz", + "integrity": "sha512-HyP7V1QgDxeHcOEh4qQH7cfK7cI7wNp0y9lszAu98SRYCshhDbwB9gWpFfnpX1GQUtgiqG4Hvgh1z3ntcGwAjw==", "license": "MIT", "dependencies": { - "@expo/config-types": "^57.0.2", - "@expo/json-file": "~11.0.1", - "@expo/plist": "^0.8.1", - "@expo/require-utils": "^57.0.4", - "@expo/sdk-runtime-versions": "^1.0.0", + "@expo/config-types": "^58.0.3", + "@expo/json-file": "~11.2.1", + "@expo/plist": "^0.10.1", + "@expo/require-utils": "^58.0.4", + "@expo/sdk-runtime-versions": "^1.0.1", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", "glob": "^13.0.0", - "semver": "^7.5.4", + "semver": "^7.7.4", "slugify": "^1.6.6", "xcode": "^3.0.1", "xml2js": "0.6.0" } }, - "node_modules/expo/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/expo/node_modules/babel-preset-expo": { - "version": "57.0.4", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-57.0.4.tgz", - "integrity": "sha512-EkFcNoE23HVzQT6ZNXs/adN8+G7rqEAF6tQn6LpRPYa1YY7wmX5GxhJF0kaYMNtBndNrMTN4+0rYE17VG13KFg==", + "node_modules/expo/node_modules/@expo/router-server": { + "version": "58.0.14", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-58.0.14.tgz", + "integrity": "sha512-RSzQYMA+Tv2eTemhjhzpx8+hL+pMC30JTVqAWrk5AZwht+OgaKZar/gHmj4iJf7n3rq+GG6KujrkKF9xAXLz2w==", "license": "MIT", "dependencies": { - "@babel/generator": "^7.20.5", - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.28.6", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-plugin-codegen": "0.86.0", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.36.0", - "babel-plugin-transform-flow-enums": "^0.0.2", "debug": "^4.3.4" }, "peerDependencies": { - "@babel/runtime": "^7.20.0", + "@expo/metro-runtime": "^58.0.14", "expo": "*", - "expo-widgets": "^57.0.6", - "react-refresh": ">=0.14.0 <1.0.0" + "expo-constants": "^58.0.12", + "expo-font": "^58.0.8", + "expo-router": "*", + "expo-server": "^58.0.5", + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1 || ~19.3.0" }, "peerDependenciesMeta": { - "@babel/runtime": { + "@expo/metro-runtime": { "optional": true }, - "expo": { + "expo-router": { "optional": true }, - "expo-widgets": { + "react-dom": { + "optional": true + }, + "react-server-dom-webpack": { "optional": true } } }, + "node_modules/expo/node_modules/2g": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/2g/-/2g-1.0.1.tgz", + "integrity": "sha512-+uViadKOS/wwR4pFu5g8TPn3QHpKqoX19JHCnp8k/3cLpImdcXozwvZA6Q/5PeW3AcU8neL8faaMidBcv7o8CA==", + "license": "MIT", + "bin": { + "2g": "bin/cli.js" + }, + "peerDependencies": { + "typescript": ">=5.8.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/expo/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expo/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, "node_modules/expo/node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -28338,6 +29136,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/expo/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/expo/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -28356,6 +29166,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/expo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/expo/node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", @@ -28382,15 +29201,98 @@ "node": ">=8" } }, + "node_modules/expo/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/expo/node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/expo/node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/expo/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, + "node_modules/expo/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/expo/node_modules/minimatch": { "version": "10.2.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", @@ -28406,6 +29308,97 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/expo/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expo/node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/ora/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/expo/node_modules/ora/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/expo/node_modules/ora/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/expo/node_modules/path-scurry": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", @@ -28422,6 +29415,31 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/expo/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/expo/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/expo/node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -28434,6 +29452,18 @@ "node": ">=10" } }, + "node_modules/expo/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/expo/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -28511,7 +29541,7 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/fast-json-stringify": { @@ -29122,23 +30152,21 @@ "license": "MIT" }, "node_modules/flow-estree": { - "version": "0.336.0", - "resolved": "https://registry.npmjs.org/flow-estree/-/flow-estree-0.336.0.tgz", - "integrity": "sha512-0VaGWHJourzh88otU5bVJ4Z/oIsD+R6yaeR0Q8t8dezsKQI/RLi5m3fNzkiLYLhJ+YwM3JRSKlOqGplOI5Yo3w==", - "dev": true, + "version": "0.327.0", + "resolved": "https://registry.npmjs.org/flow-estree/-/flow-estree-0.327.0.tgz", + "integrity": "sha512-f9vK751YUzD0qaHSpKc5/qQM6gqOlgGS+4ZRqTNcZOpVqn3mC55yEQ6dUG2K1eaVm5FbKkz9CFWe6XNvrkQFQg==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/flow-parser": { - "version": "0.336.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.336.0.tgz", - "integrity": "sha512-O8QvQf/B3rBF+eagcc9/WMAjfJoaKckdgSd8PT/qvMIIe4ZjVKrSqV5SDnRFAKY0VrE8r5C4ADYgvYhmwkWADA==", - "dev": true, + "version": "0.327.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.327.0.tgz", + "integrity": "sha512-/MYZ5hXWf5ozpbdfUDmazMgQXviLxWEiRLH3MppEGDdW0itRVqmB5UaU7QX+SBCDNiq+gEesSVn8nlxmPDyDkw==", "license": "MIT", "dependencies": { - "flow-estree": "0.336.0" + "flow-estree": "0.327.0" }, "engines": { "node": ">=0.4.0" @@ -29223,12 +30251,6 @@ } } }, - "node_modules/fontfaceobserver": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", - "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "license": "BSD-2-Clause" - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -29411,7 +30433,7 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -29619,7 +30641,7 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8.0.0" @@ -30112,9 +31134,9 @@ "license": "LGPL-3.0" }, "node_modules/hermes-compiler": { - "version": "250829098.0.14", - "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.14.tgz", - "integrity": "sha512-5meXwsZxgiqFaJjNzwjzI9IyUkuGGBisu+z9BvQWmGVpjH6nz11hgqkyxe4dl8UAdyIV4lTbz91+Dlnjz0VxqA==", + "version": "260318099.0.4", + "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-260318099.0.4.tgz", + "integrity": "sha512-8odcPFkPC82HlqCl0C5QI9mBN4rEAT+IAo55sJhzwKw//K3qZloiv3ex6J2O8CuBbhdmkJozfidNsset2KH25w==", "license": "MIT" }, "node_modules/hermes-estree": { @@ -30299,6 +31321,30 @@ "node": ">=8.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/http-proxy-middleware": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.7.tgz", @@ -30577,7 +31623,7 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -30593,7 +31639,7 @@ }, "node_modules/inflight": { "version": "1.0.6", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -31236,7 +32282,7 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=8" @@ -31244,7 +32290,7 @@ }, "node_modules/istanbul-lib-instrument": { "version": "5.2.0", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", @@ -31259,7 +32305,7 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", - "devOptional": true, + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -32098,17 +33144,6 @@ "node": ">=12" } }, - "node_modules/jest-environment-jsdom/node_modules/entities": { - "version": "4.5.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/jest-environment-jsdom/node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -32168,17 +33203,6 @@ } } }, - "node_modules/jest-environment-jsdom/node_modules/parse5": { - "version": "7.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -32257,7 +33281,7 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", @@ -32272,33 +33296,36 @@ } }, "node_modules/jest-expo": { - "version": "57.0.2", - "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-57.0.2.tgz", - "integrity": "sha512-xoKiYyu8c0fdBsFMkeFnxoTZ/0g4rLldA9isVb7VJSGBGesmhkVor7YkftkHqQ5rWiZ99IY+/uIrzTgb1nC/UA==", + "version": "58.0.11", + "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-58.0.11.tgz", + "integrity": "sha512-arbPFju6v6Hi9GTfe06M1y4Ra+gttPahaORm9qQlwGm502KGt5cV/oEFheFLRyJu5hQzexPiuWz34/q7KMgjAg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/create-cache-key-function": "^29.2.1", - "@jest/globals": "^29.2.1", - "babel-jest": "^29.2.1", - "jest-environment-jsdom": "^29.2.1", - "jest-snapshot": "^29.2.1", + "@jest/create-cache-key-function": "^30.0.0", + "@jest/globals": "^30.0.0", + "babel-jest": "^30.0.0", + "jest-environment-jsdom": "^30.0.0", + "jest-environment-node": "^30.0.0", + "jest-mock": "^30.0.0", + "jest-snapshot": "^30.0.0", "jest-watch-select-projects": "^2.0.0", - "jest-watch-typeahead": "2.2.1", + "jest-watch-typeahead": "^3.0.1", "json5": "^2.2.3", - "lodash": "^4.17.19", - "react-test-renderer": "19.2.3", + "lodash": "^4.18.1", "server-only": "^0.0.1", - "stacktrace-js": "^2.0.2" + "stacktrace-js": "^2.0.2", + "test-renderer": "1.3.0" }, "bin": { "jest": "bin/jest.js" }, "peerDependencies": { - "@react-native/jest-preset": "^0.86.0", + "@react-native/jest-preset": "^0.88.0", "expo": "*", + "jest": "^29.0.0 || ^30.0.0", "react-native": "*", - "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" + "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4 || ~19.3.0" }, "peerDependenciesMeta": { "expo": { @@ -32309,10 +33336,247 @@ } } }, + "node_modules/jest-expo/node_modules/@jest/console": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.5.2.tgz", + "integrity": "sha512-e8sQC4pCMHPBrPX7Hk8TJr+DM5dkUnImSTNag8SEWFAFAF6xIz4AJvCKapnrdHnZxep4bxw4PhG+ZbimYBMyKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.5.1", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.5.1", + "jest-util": "30.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/create-cache-key-function": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-30.5.1.tgz", + "integrity": "sha512-5qkif//qhlbt54255O/M2JtUZNlnefOzE12bi7FlApOIYO4pqrZcAwhNCfP4jOGFubez8uoLgY9czWFjYY57ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/environment": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.5.2.tgz", + "integrity": "sha512-nwFPOUMbmsjNNRCpnJpB9HbSZu4C07wDDds++5j+j1MezzPLxMPDdbdUVjr2o4RULDOValnDd70taPFI1EtxAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.5.2", + "@jest/types": "30.5.1", + "@types/node": "*", + "jest-mock": "30.5.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/expect": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.5.2.tgz", + "integrity": "sha512-2E+1Pg6jJxbRjLNLpciC71iri/3qsKJL222/aXJEFwC0VdUSvfS+JZQQLEVjUYYc8t8pQu2MGE3cF2+bNTYRsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.5.2", + "jest-snapshot": "30.5.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/expect-utils": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.5.2.tgz", + "integrity": "sha512-d/HOLSrJUlBIl6n3LzOa7cjW3xdePm5H5gQw2lixZ/0h157l9sw3mLblzFqnPcTbhDzhRQdBOX3A3KcG73nm5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.5.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/fake-timers": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.5.2.tgz", + "integrity": "sha512-GKk0h0tKT5SpDPxDhPg3r9mm5s8/YCBzVNMOGdRiQXwUiMsjU10mVPlMaQstH6/cu50vOb8N9oQUMETHuwwxKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.5.1", + "@sinonjs/fake-timers": "^15.4.0", + "@types/node": "*", + "jest-message-util": "30.5.1", + "jest-mock": "30.5.2", + "jest-util": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/globals": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.5.2.tgz", + "integrity": "sha512-62zfS+dL+M5aTNHXCNLyqD+j4oqxTIzDYrZbpqMP8Yn+gvlAGyzC6BSPNb1ZmFOakV1RtFYX/O3FCQXSWmQdgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.5.2", + "@jest/expect": "30.5.2", + "@jest/types": "30.5.1", + "jest-mock": "30.5.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/schemas": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.5.0.tgz", + "integrity": "sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/test-result": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.5.2.tgz", + "integrity": "sha512-eO6YU5rsLfs60ne694e0IAmRgeBnoA8mu0nlxXDbl/1j5km0o2vO9/VbbUIKIH+WRKKEI+ELgwraRGn2Lhep8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.5.2", + "@jest/types": "30.5.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/transform": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.5.2.tgz", + "integrity": "sha512-LBGwmaE886C41jDZ65eqR1YbXM7642MK3ZhTowZd5+xDlrDLuf4ePuDdDmVSvcr8NTVJ3MqxLkMbUCzuigUaoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.5.1", + "@jridgewell/trace-mapping": "^0.3.31", + "babel-plugin-istanbul": "^8.0.0", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.5.1", + "jest-regex-util": "30.5.0", + "jest-util": "30.5.1", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@jest/types": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.5.1.tgz", + "integrity": "sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.5.0", + "@jest/schemas": "30.5.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/@sinclair/typebox": { + "version": "0.34.52", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", + "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-expo/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/jest-expo/node_modules/@sinonjs/fake-timers": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/jest-expo/node_modules/@types/jsdom": { + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/jest-expo/node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-expo/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", "dev": true, "license": "MIT", "engines": { @@ -32338,6 +33602,101 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-expo/node_modules/babel-jest": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.5.2.tgz", + "integrity": "sha512-ES8WeJ2fNWPEDunyAtUfJ12nHyaWUloCHdkfK2oW5uSoQSUmjNKdWiGaXJITJwvFEWoD/evHEg/QoCXAvLaQqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.5.2", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^8.0.0", + "babel-preset-jest": "30.5.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/jest-expo/node_modules/babel-jest/node_modules/babel-preset-jest": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.5.0.tgz", + "integrity": "sha512-ZGPn5ClP4lBDpuOK8W1yQIOy359HmbnZv3suucAlIe+SEE9yDsxV4S2PjSbH2Vc97U+WmzYD7vw3kr8NsQ/i6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.5.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1 || ^8.0.0" + } + }, + "node_modules/jest-expo/node_modules/babel-plugin-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-8.0.0.tgz", + "integrity": "sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jest-expo/node_modules/babel-plugin-jest-hoist": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.5.0.tgz", + "integrity": "sha512-gtGo1B+u14jrZQv6TdSWIWkTqclboo7Qn+dFAGUOIuXLFuJKAdg3U5MIWzZnW4vfUb4dX9skmAMiby86e/SF4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/jest-expo/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/jest-expo/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -32355,14 +33714,20 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-expo/node_modules/char-regex": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", - "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "node_modules/jest-expo/node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=8" } }, "node_modules/jest-expo/node_modules/color-convert": { @@ -32385,6 +33750,42 @@ "dev": true, "license": "MIT" }, + "node_modules/jest-expo/node_modules/expect": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.5.2.tgz", + "integrity": "sha512-0LNuMvs8/5mRYhnCR4k+lGV7fqPMs6Bnksda4S3zsCUmdxBpAn4zU4NNzXdq1pMKe/H4W5t/zVIDSJ/H3e0vDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.5.2", + "@jest/get-type": "30.5.0", + "jest-matcher-utils": "30.5.2", + "jest-message-util": "30.5.1", + "jest-mock": "30.5.2", + "jest-util": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/jest-expo/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -32395,39 +33796,271 @@ "node": ">=8" } }, + "node_modules/jest-expo/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-expo/node_modules/jest-diff": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.5.2.tgz", + "integrity": "sha512-rBtHnI6BWTiWj3lM7fOLVfChx7R9B0u9VV3PRHawKs79x6ZjW1QoSrKenaigNGWlvhtoi2BqvDbABDie+Os3xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.5.0", + "@jest/get-type": "30.5.0", + "chalk": "^4.1.2", + "pretty-format": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-environment-jsdom": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.5.2.tgz", + "integrity": "sha512-6NOZjEP+WNi4WXjbxb/1ROnfaMxn6Dhqu6uSC22o0H28z+uppejs/jZ9KCVoLepqqoCjcNZujtzQqC9jSV15jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.5.2", + "@jest/environment-jsdom-abstract": "30.5.2", + "@types/jsdom": "^21.1.7", + "jsdom": "^26.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-expo/node_modules/jest-environment-node": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.5.2.tgz", + "integrity": "sha512-Ciz4KgTGIbojxSKpuFImgWJj5EyqfE8xMq9NxWmOXnQywHHS03H9Mv+vaCB29J5pr3JBrY27WbRV18rBdjh8Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.5.2", + "@jest/fake-timers": "30.5.2", + "@jest/types": "30.5.1", + "@types/node": "*", + "jest-mock": "30.5.2", + "jest-util": "30.5.1", + "jest-validate": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-haste-map": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.5.1.tgz", + "integrity": "sha512-VIFgt67jW480YDxKfEv9IYQKrFpYt7bOCMn3VsnjK7AK9qo7p6acpnA1DHwsVOULE3dTaYew/6JaTD/d0VDHoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.5.1", + "@parcel/watcher": "^2.6.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "fdir": "^6.5.0", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.5.0", + "jest-util": "30.5.1", + "jest-worker": "30.5.1", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-matcher-utils": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.5.2.tgz", + "integrity": "sha512-lFkB365PTIHOhPzwrb9T6gvlDnPpOZ7/c3ewOKKB7bzztqjVrtlyRL2MkyfJXpyY2u2SKw001JKrTx14fBUFcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.5.0", + "chalk": "^4.1.2", + "jest-diff": "30.5.2", + "pretty-format": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-message-util": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.5.1.tgz", + "integrity": "sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.5.1", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-util": "30.5.1", + "picomatch": "^4.0.3", + "pretty-format": "30.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-mock": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.5.2.tgz", + "integrity": "sha512-KTHb37Fhj8xY8qPFvTFaFJHcdsumQp+ExsUlgoX232Agmc706gagBs53+CYvulV7MVQo9AgXOUxsqzzVBoJlrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.5.2", + "@jest/types": "30.5.1", + "@types/node": "*", + "jest-util": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-regex-util": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.5.0.tgz", + "integrity": "sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-snapshot": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.5.2.tgz", + "integrity": "sha512-jKIdes25AnAH73dOCi2qE6J6vHJ6L2vyBS11M89kT50DVJcLTf2AOjvcc+2vVaN8lUbY5v2R83aqXo3Ro9fqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.5.2", + "@jest/get-type": "30.5.0", + "@jest/snapshot-utils": "30.5.1", + "@jest/transform": "30.5.2", + "@jest/types": "30.5.1", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.5.2", + "graceful-fs": "^4.2.11", + "jest-diff": "30.5.2", + "jest-matcher-utils": "30.5.2", + "jest-message-util": "30.5.1", + "jest-util": "30.5.1", + "pretty-format": "30.5.1", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-util": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.5.1.tgz", + "integrity": "sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.5.1", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-validate": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.5.1.tgz", + "integrity": "sha512-i/buJ56wTpxihE93hQYNMfdOThS87+HGvLZzZJmU4xggPcdTYQq051iwALLCHp3q+SkCGH+EFejQZz5EbBSkkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.5.0", + "@jest/types": "30.5.1", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.5.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-expo/node_modules/jest-watch-typeahead": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz", - "integrity": "sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-3.0.1.tgz", + "integrity": "sha512-SFmHcvdueTswZlVhPCWfLXMazvwZlA2UZTrcE7MC3NwEVeWvEcOx6HUe+igMbnmA6qowuBSW4in8iC6J2EYsgQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-escapes": "^6.0.0", - "chalk": "^4.0.0", - "jest-regex-util": "^29.0.0", - "jest-watcher": "^29.0.0", + "ansi-escapes": "^7.0.0", + "chalk": "^5.2.0", + "jest-regex-util": "^30.0.0", + "jest-watcher": "^30.0.0", "slash": "^5.0.0", - "string-length": "^5.0.1", + "string-length": "^6.0.0", "strip-ansi": "^7.0.1" }, "engines": { - "node": "^14.17.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" + "jest": "^30.0.0" } }, - "node_modules/jest-expo/node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "node_modules/jest-expo/node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.16" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-expo/node_modules/jest-watch-typeahead/node_modules/slash": { @@ -32444,30 +34077,182 @@ } }, "node_modules/jest-expo/node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", + "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", "dev": true, "license": "MIT", "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12.20" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-expo/node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/jest-expo/node_modules/jest-watcher": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.5.2.tgz", + "integrity": "sha512-rqRgg4R11GA9m1UsEZwQeixHsgZReCn6TOHAHtIH33yXrIvoX0OGPA20Yzzjkz7X40fZvcRSxEpQppYPcWzmcQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@jest/test-result": "30.5.2", + "@jest/types": "30.5.1", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.5.1", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-watcher/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-expo/node_modules/jest-worker": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.5.1.tgz", + "integrity": "sha512-Cbxh5v7AoLuFRmFJSM4/aHdQ68rjXvUWr716EE0Dh3I7T+T/3FgFKhOERGXHcU2Meftq9+9zxPM3TSNyI9D+HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.5.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-expo/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-expo/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-expo/node_modules/pretty-format": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.5.1.tgz", + "integrity": "sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/react-is-18": "npm:react-is@^18.3.1", + "@jest/react-is-19": "npm:react-is@^19.2.5", + "@jest/schemas": "30.5.0", + "ansi-styles": "^5.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expo/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-expo/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-expo/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-expo/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -32489,6 +34274,48 @@ "node": ">=8" } }, + "node_modules/jest-expo/node_modules/test-exclude": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", + "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^10.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jest-expo/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-expo/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/jest-get-type": { "version": "29.6.3", "license": "MIT", @@ -32498,7 +34325,7 @@ }, "node_modules/jest-haste-map": { "version": "29.7.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -32522,7 +34349,7 @@ }, "node_modules/jest-haste-map/node_modules/has-flag": { "version": "4.0.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -32530,7 +34357,7 @@ }, "node_modules/jest-haste-map/node_modules/jest-worker": { "version": "29.7.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -32544,7 +34371,7 @@ }, "node_modules/jest-haste-map/node_modules/supports-color": { "version": "8.1.1", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -32650,7 +34477,7 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", @@ -32669,7 +34496,7 @@ }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "4.3.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -32683,7 +34510,7 @@ }, "node_modules/jest-message-util/node_modules/chalk": { "version": "4.1.2", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -32698,7 +34525,7 @@ }, "node_modules/jest-message-util/node_modules/color-convert": { "version": "2.0.1", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -32709,12 +34536,12 @@ }, "node_modules/jest-message-util/node_modules/color-name": { "version": "1.1.4", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -32722,7 +34549,7 @@ }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -32733,7 +34560,7 @@ }, "node_modules/jest-mock": { "version": "29.7.0", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -32764,7 +34591,7 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -33678,7 +35505,7 @@ "version": "3.15.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -33808,6 +35635,124 @@ "node": ">=8" } }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -34208,14 +36153,14 @@ } }, "node_modules/launch-editor": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.2.tgz", - "integrity": "sha512-NHJEb30MGBCkmZXLZwz25t37QR4aY03ZzPYUJXOJaOa92uWwExI9SBQUuIznBYc1xkD7cJNGX7oc3Nl3sq2kQQ==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", "devOptional": true, "license": "MIT", "dependencies": { "picocolors": "^1.1.1", - "shell-quote": "^1.10.0" + "shell-quote": "^1.8.4" } }, "node_modules/lefthook": { @@ -34448,31 +36393,6 @@ ], "license": "MIT" }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/lightningcss": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", @@ -35141,12 +37061,6 @@ "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", "license": "ISC" }, - "node_modules/marky": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", - "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "license": "Apache-2.0" - }, "node_modules/martinez-polygon-clipping": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/martinez-polygon-clipping/-/martinez-polygon-clipping-0.8.1.tgz", @@ -35276,9 +37190,9 @@ } }, "node_modules/metro": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.5.tgz", - "integrity": "sha512-r1liLkyFZMVSEMNjU1CJU5pRzs3NdkxHqXS60O25c0rCIqAR+cGk7rPydw/g0WAIKVXojIBIF45yYBPagJGcgw==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.87.1.tgz", + "integrity": "sha512-1oyLU9elM7hPAsKIqKooEekwxiuWr27+MZBhUROPhzcbXhMDxK64GPF/hCXwBZVp1F89ODavCrBmJtLx9WtBoQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -35289,29 +37203,28 @@ "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "accepts": "^2.0.0", - "ci-info": "^2.0.0", "connect": "^3.6.5", "debug": "^4.4.0", "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", + "flow-parser": "0.331.0", "graceful-fs": "^4.2.4", - "hermes-parser": "0.35.0", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.84.5", - "metro-cache": "0.84.5", - "metro-cache-key": "0.84.5", - "metro-config": "0.84.5", - "metro-core": "0.84.5", - "metro-file-map": "0.84.5", - "metro-resolver": "0.84.5", - "metro-runtime": "0.84.5", - "metro-source-map": "0.84.5", - "metro-symbolicate": "0.84.5", - "metro-transform-plugins": "0.84.5", - "metro-transform-worker": "0.84.5", + "metro-babel-transformer": "0.87.1", + "metro-cache": "0.87.1", + "metro-cache-key": "0.87.1", + "metro-config": "0.87.1", + "metro-core": "0.87.1", + "metro-file-map": "0.87.1", + "metro-resolver": "0.87.1", + "metro-runtime": "0.87.1", + "metro-source-map": "0.87.1", + "metro-symbolicate": "0.87.1", + "metro-transform-plugins": "0.87.1", + "metro-transform-worker": "0.87.1", "mime-types": "^3.0.1", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", @@ -35324,65 +37237,71 @@ "metro": "src/cli.js" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-babel-transformer": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.5.tgz", - "integrity": "sha512-2WbHILKMiJUzfdjmGOQOqU1bWi9//gqiclc/tkk/AIsrrVw3efhZ1uhkOwMTxUEPOzqoo091H0olLmVZH5FHGQ==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.87.1.tgz", + "integrity": "sha512-orvRIGpb0yK1yMbk5YP3dhVKjmoxUkRB9fdltGJxNppEqus/1tFpNuf9KnGFR3Qjg0izoUrJ4z6WgoBvdkXPrA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.35.0", - "metro-cache-key": "0.84.5", + "flow-parser": "0.331.0", + "metro-cache-key": "0.87.1", "nullthrows": "^1.1.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", - "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", - "license": "MIT" + "node_modules/metro-babel-transformer/node_modules/flow-estree": { + "version": "0.331.0", + "resolved": "https://registry.npmjs.org/flow-estree/-/flow-estree-0.331.0.tgz", + "integrity": "sha512-FVLYkSL/ITb/QXBEQvNWPjPooRGswuUtGOwrH+puSlMDneNkxy640+FZsk/TfKL+b7Wbw/Fg9FTUv2bMQDpj2w==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", - "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", + "node_modules/metro-babel-transformer/node_modules/flow-parser": { + "version": "0.331.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.331.0.tgz", + "integrity": "sha512-vEZcHIlnKeN8JSVtYFczj8sWJfHIJOkz+YG00O/oul/Bete+t1ZhTi+O6JRRLFYvGW+yJkZ0YgL16iStnbkUqQ==", "license": "MIT", "dependencies": { - "hermes-estree": "0.35.0" + "flow-estree": "0.331.0" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/metro-cache": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.5.tgz", - "integrity": "sha512-WHS0n2OxQqtwEjSeQFPePNrMvEFhmQcUQM9cRJMHByWoi/GMWFBEWOf7hVkAM/0KRutAXNbDlSu/cZB6CyxgQQ==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.87.1.tgz", + "integrity": "sha512-juNPaj0Xi5tkLp8imXqvbSnEIijwKG36m7OiFFVJMqEkiURwAjkMFVek3/xpix1+LVQqO7kjVp3PvuvIM61mKQ==", "license": "MIT", "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", - "metro-core": "0.84.5" + "metro-core": "0.87.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-cache-key": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.5.tgz", - "integrity": "sha512-3dPB2TnvGjjf0/9O7AXVQURKXuQNauTZE7WpTGTlR017Gh/B5y0m/2wcqxfveUguHSpu89KhVxCAlr2k/H7uhQ==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.87.1.tgz", + "integrity": "sha512-scqVVPMA2c+RVO12I3wyMDp5xCkRPLsyrcG4Qc3xfU5JR0EW/0sz2tjty+5UjMUtG09uiM1KYQ8HjWg7OQXHtw==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-cache/node_modules/agent-base": { @@ -35408,42 +37327,41 @@ } }, "node_modules/metro-config": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.5.tgz", - "integrity": "sha512-zie+uN6oohscowi2S7ByU+wUw6CrT4ZxW9uAbONOObSxx86RGmnIAmjXHLkfmcdYoY7jzOPEbqcI6oeVmqyBQA==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.87.1.tgz", + "integrity": "sha512-NmkDlc/qZAdo5gTkVTuO2AKE/khemRKRH5IA+SKfqUBJigI5GqZ5TOXhmEokhlkAqzjt8dyzKhzI6FHvXoXaTQ==", "license": "MIT", "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", - "metro": "0.84.5", - "metro-cache": "0.84.5", - "metro-core": "0.84.5", - "metro-runtime": "0.84.5", - "yaml": "^2.6.1" + "metro": "0.87.1", + "metro-cache": "0.87.1", + "metro-core": "0.87.1", + "metro-runtime": "0.87.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-core": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.5.tgz", - "integrity": "sha512-xwm605hCi5Y6eJTTb8ZWo6pkUcoBEIyiQOfkZh5GwtDwUrP9SNhTQZhzJHrBCwwxlf3Ptl/pxWJgQ1rsNYMnrA==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.87.1.tgz", + "integrity": "sha512-xizzky/4+c/Mkznege8OW05j7bSdM39VPoEps61Se4+hf32UQujmbvLvIE9+UnP6kNEPVomk0Fw8NsBK9iRQmw==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.84.5" + "metro-resolver": "0.87.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-file-map": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.5.tgz", - "integrity": "sha512-mlm/JL8toSbSc2akpKIGmzvrVRSCgZ5vkbycI34oMLoOnLGuLyC8WTyVJ6P0hZG/usDaGwZSl/s9BCRriqjGJA==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.87.1.tgz", + "integrity": "sha512-9sPuNCojC3pS4vj+ZPY7FXmHGpdJeckXuKXQrDAfJvZc60AF8owRFTkI8XdwlwrmPIB2w++KraK9FMEXvC4wJw==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -35453,11 +37371,10 @@ "invariant": "^2.2.4", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" + "nullthrows": "^1.1.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-file-map/node_modules/has-flag": { @@ -35500,61 +37417,61 @@ } }, "node_modules/metro-minify-terser": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.5.tgz", - "integrity": "sha512-BJoFwCEDsYnagPqarayInv2+diCDNDdLlaof/p6s9w4gh+gc9HXYM+pDvsKGKKUumpZswNF3Z/ftTMqKl/5IBg==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.87.1.tgz", + "integrity": "sha512-YK4k1oO1wV48hfE+Nbw2rJCnAgeabzrgT/xH5ha5n9gbK4p3HYFC898cERUiyTl9vRh58CNTiXRc88f7y6PfKg==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-resolver": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.5.tgz", - "integrity": "sha512-VSSnepg1k6LyCwtb6eirWdAWlpKwBG8Rdtsr1mU38rMelFyWgh3/QuMSiZIZAIjwg/fsa8GhW5/FO54CAUPCEA==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.87.1.tgz", + "integrity": "sha512-FXH/brY69wT6sPxaSW8BhMmDGD/6irmBr/cL4rUi+VWwqR3pbvdcfUOfyjcHucgQ7pe5IW3xJY21eHKLVKNumQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-runtime": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.5.tgz", - "integrity": "sha512-U1m2+d1Pr+JO2/iVXBB2OfXXityz7tqwIorxfrT15IEgaHvpJBq/OHiqnOWPKJbUl3JcxjcdviZZOKk85oK4Qg==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.87.1.tgz", + "integrity": "sha512-kjeuSvInsM6OzBjkCQsWxnkrKZFMKtnkCl38oXWRI9lDGs2L9hGs9Tak9sQYJ9h3gtDujneB7wZio+irgqJKDw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-source-map": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.5.tgz", - "integrity": "sha512-2BtV5L9uPc49F13Gn5wiP6bX/EncqzqTIk2VL/0F/96Vo0YEOjluT/qktQjFODfqGFsucwnh5mPEAl/2jVEfeg==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.87.1.tgz", + "integrity": "sha512-Bqpm0PBGdy53pigIJb4HRF7QxD2pUOdgSmVh/4AWbP635kSCv+Y6ltVxUZgSnzS/QbSmzyCGijmRPlXMj2/qHw==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-symbolicate": "0.84.5", + "metro-symbolicate": "0.87.1", "nullthrows": "^1.1.1", - "ob1": "0.84.5", + "ob1": "0.87.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-source-map/node_modules/source-map": { @@ -35567,14 +37484,14 @@ } }, "node_modules/metro-symbolicate": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.5.tgz", - "integrity": "sha512-rQ40zYDAkaWBN9yvjUuAD0ZpzBMZSoKyGYXnb5JrfbKjun7fTvfoLHL3KXFYenBTYZkQtlp4cKSCv/1utxFyOw==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.87.1.tgz", + "integrity": "sha512-rcGvwabrg0lbXGRGRKl14PY3My3+dkno2jZYhdJEuH2DmjTtTkV5bYwgto4JtV/Lbe+sXE6GO1UGg654430uow==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-source-map": "0.84.5", + "metro-source-map": "0.87.1", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" @@ -35583,7 +37500,7 @@ "metro-symbolicate": "src/index.js" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-symbolicate/node_modules/source-map": { @@ -35596,9 +37513,9 @@ } }, "node_modules/metro-transform-plugins": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.5.tgz", - "integrity": "sha512-+InaSVGaOyt0DyRo4Y/zIdPI6CZwnbNho5LAL23tgmuGwv7fyfkF7kKfPjZcfxXBcoYdTLLFnCfCH/dHSiCqNg==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.87.1.tgz", + "integrity": "sha512-qMiJ/x+VfqumFJJSefKS6nj8uojzC29b2/aK8vlMuFABIqGjDucICEOXd2Yt6k/XMFAgAcaJvShUOT0HLyYaPw==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -35609,13 +37526,13 @@ "nullthrows": "^1.1.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro-transform-worker": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.5.tgz", - "integrity": "sha512-ui1Z8x4s5RL36gMmKLaMMO7O9NNDHNdthEZSCDQHAau3JcAsTaFOK6I+2q4I/kW5u8hSEjJk9L45TXSVJw6g1A==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.87.1.tgz", + "integrity": "sha512-VOzs3OV405FuOLYdAhqA2wsn1F9lvueDVxMDLvCKaQ44U+yknIqphJ9eMjjsGwLDZiJq9sW3DMLhjD27JxQgqQ==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -35623,17 +37540,17 @@ "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "flow-enums-runtime": "^0.0.6", - "metro": "0.84.5", - "metro-babel-transformer": "0.84.5", - "metro-cache": "0.84.5", - "metro-cache-key": "0.84.5", - "metro-minify-terser": "0.84.5", - "metro-source-map": "0.84.5", - "metro-transform-plugins": "0.84.5", + "metro": "0.87.1", + "metro-babel-transformer": "0.87.1", + "metro-cache": "0.87.1", + "metro-cache-key": "0.87.1", + "metro-minify-terser": "0.87.1", + "metro-source-map": "0.87.1", + "metro-transform-plugins": "0.87.1", "nullthrows": "^1.1.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/metro/node_modules/accepts": { @@ -35649,11 +37566,39 @@ "node": ">= 0.6" } }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT" + "node_modules/metro/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/metro/node_modules/flow-estree": { + "version": "0.331.0", + "resolved": "https://registry.npmjs.org/flow-estree/-/flow-estree-0.331.0.tgz", + "integrity": "sha512-FVLYkSL/ITb/QXBEQvNWPjPooRGswuUtGOwrH+puSlMDneNkxy640+FZsk/TfKL+b7Wbw/Fg9FTUv2bMQDpj2w==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/metro/node_modules/flow-parser": { + "version": "0.331.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.331.0.tgz", + "integrity": "sha512-vEZcHIlnKeN8JSVtYFczj8sWJfHIJOkz+YG00O/oul/Bete+t1ZhTi+O6JRRLFYvGW+yJkZ0YgL16iStnbkUqQ==", + "license": "MIT", + "dependencies": { + "flow-estree": "0.331.0" + }, + "engines": { + "node": ">=0.4.0" + } }, "node_modules/metro/node_modules/has-flag": { "version": "4.0.0", @@ -35664,21 +37609,6 @@ "node": ">=8" } }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", - "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", - "license": "MIT" - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", - "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.35.0" - } - }, "node_modules/metro/node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -35720,12 +37650,19 @@ } }, "node_modules/metro/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/metro/node_modules/serialize-error": { @@ -35848,7 +37785,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -35946,18 +37883,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/modern-screenshot": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/modern-screenshot/-/modern-screenshot-4.7.0.tgz", @@ -35977,9 +37902,9 @@ "license": "MIT" }, "node_modules/multitars": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/multitars/-/multitars-1.0.0.tgz", - "integrity": "sha512-H/J4fMLedtudftaYMOg7ajzLYgT3/rwbWVJbqr/iUgB8DQztn38ys5HOqI1CzSxx8QhXXwOOnnBvd4v3jG5+Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/multitars/-/multitars-1.0.2.tgz", + "integrity": "sha512-6GwVw5eLi9sThdtlS4PKwC7yRLaf45pYhIEzKBHdKxi+YOXGKFX8acIniH+Uh/+k9mS2lQOupTccjoe5r0/1IQ==", "license": "MIT" }, "node_modules/murmurhash-js": { @@ -36080,6 +38005,13 @@ "node": ">=12.0.0" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-dir": { "version": "0.1.17", "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", @@ -36187,12 +38119,44 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/noxcturnal": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/noxcturnal/-/noxcturnal-0.1.5.tgz", + "integrity": "sha512-X/HQXJP/xn7LVQ4z1E4La0NHSl5UHdtJPG6ky4r2/Xgb7k79nGDJgBXk7I5f1V2vInWjlSCM14oSB0cUxwZS/Q==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@oxc-project/types": "0.154.0" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@noxcturnal/noxcturnal-darwin-arm64": "0.1.5", + "@noxcturnal/noxcturnal-darwin-x64": "0.1.5", + "@noxcturnal/noxcturnal-linux-arm64-gnu": "0.1.5", + "@noxcturnal/noxcturnal-linux-arm64-musl": "0.1.5", + "@noxcturnal/noxcturnal-linux-x64-gnu": "0.1.5", + "@noxcturnal/noxcturnal-linux-x64-musl": "0.1.5", + "@noxcturnal/noxcturnal-win32-arm64-msvc": "0.1.5", + "@noxcturnal/noxcturnal-win32-x64-msvc": "0.1.5" + } + }, + "node_modules/noxcturnal/node_modules/@oxc-project/types": { + "version": "0.154.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.154.0.tgz", + "integrity": "sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, "node_modules/npm-package-arg": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", @@ -36241,15 +38205,15 @@ "license": "MIT" }, "node_modules/ob1": { - "version": "0.84.5", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.5.tgz", - "integrity": "sha512-aH9RkoZc7w/90HBamFxTw8ZLFr05wXS+iOnvmrgo53Ep8Pyrm5FieQSaPIVROkfFVQISeD/zo92fes26TOwe+A==", + "version": "0.87.1", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.87.1.tgz", + "integrity": "sha512-i8iA8uij0g1YQzS8uOJPSRCgwDjO9warIHUAu1Fqj877Wc3wlfxDYBioYWgKTBF2+URVJttyDWSEpmd99nlvtQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } }, "node_modules/object-assign": { @@ -36426,7 +38390,7 @@ }, "node_modules/once": { "version": "1.4.0", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -36471,6 +38435,7 @@ }, "node_modules/open": { "version": "7.4.2", + "devOptional": true, "license": "MIT", "dependencies": { "is-docker": "^2.0.0", @@ -36901,7 +38866,7 @@ }, "node_modules/p-try": { "version": "2.2.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -36998,6 +38963,32 @@ "dev": true, "license": "MIT" }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "license": "MIT", @@ -37182,7 +39173,7 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -37365,7 +39356,7 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -37738,6 +39729,8 @@ }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/protobufjs": { @@ -37940,9 +39933,9 @@ } }, "node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -38021,17 +40014,23 @@ } }, "node_modules/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "scheduler": "^0.28.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^19.3.0" } }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, "node_modules/react-error-boundary": { "version": "4.0.11", "license": "MIT", @@ -38069,6 +40068,8 @@ }, "node_modules/react-freeze": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz", + "integrity": "sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g==", "license": "MIT", "engines": { "node": ">=10" @@ -38079,6 +40080,8 @@ }, "node_modules/react-is": { "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/react-map-gl": { @@ -38106,37 +40109,34 @@ } }, "node_modules/react-native": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.86.0.tgz", - "integrity": "sha512-17ALh/dd6AO4pgOVmOO5Axll5PbErEo3XFyLokyzW6usyi+OShIEPwUW26wLPlhVifgSOIfECCH0WN+0IqtJ1w==", - "license": "MIT", - "dependencies": { - "@react-native/assets-registry": "0.86.0", - "@react-native/codegen": "0.86.0", - "@react-native/community-cli-plugin": "0.86.0", - "@react-native/gradle-plugin": "0.86.0", - "@react-native/js-polyfills": "0.86.0", - "@react-native/normalize-colors": "0.86.0", - "@react-native/virtualized-lists": "0.86.0", - "abort-controller": "^3.0.0", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.88.0.tgz", + "integrity": "sha512-v/wee0nYWcammMYBnSat/e3WY/5iaf9YQOMcBrfKT/wPApPPlHp94hgZovBtwhMuthR01yc/8cGn0FpFTE/C4A==", + "license": "MIT", + "dependencies": { + "@react-native/asset-utils": "0.88.0", + "@react-native/codegen": "0.88.0", + "@react-native/community-cli-plugin": "0.88.0", + "@react-native/gradle-plugin": "0.88.0", + "@react-native/normalize-colors": "0.88.0", + "@react-native/virtualized-lists": "0.88.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", - "babel-plugin-syntax-hermes-parser": "0.36.0", "base64-js": "^1.5.1", - "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", - "hermes-compiler": "250829098.0.14", + "flow-parser": "0.327.0", + "hermes-compiler": "260318099.0.4", "invariant": "^2.2.4", "memoize-one": "^5.0.0", - "metro-runtime": "^0.84.3", - "metro-source-map": "^0.84.3", + "metro-runtime": "^0.87.1", + "metro-source-map": "^0.87.1", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.27.0", + "scheduler": "0.28.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "tinyglobby": "^0.2.15", @@ -38148,17 +40148,13 @@ "react-native": "cli.js" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "peerDependencies": { - "@react-native/jest-preset": "0.86.0", "@types/react": "^19.1.1", - "react": "^19.2.3" + "react": "^19.3.0" }, "peerDependenciesMeta": { - "@react-native/jest-preset": { - "optional": true - }, "@types/react": { "optional": true } @@ -38996,6 +40992,12 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/react-native-web/node_modules/@react-native/normalize-colors": { + "version": "0.74.89", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz", + "integrity": "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==", + "license": "MIT" + }, "node_modules/react-native-web/node_modules/memoize-one": { "version": "6.0.0", "license": "MIT" @@ -39056,14 +41058,10 @@ "node": ">=10" } }, - "node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.86.0.tgz", - "integrity": "sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==", - "license": "MIT" - }, "node_modules/react-native/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -39071,11 +41069,19 @@ }, "node_modules/react-native/node_modules/promise": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "license": "MIT", "dependencies": { "asap": "~2.0.6" } }, + "node_modules/react-native/node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, "node_modules/react-pdf": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-10.3.0.tgz", @@ -39164,23 +41170,30 @@ } }, "node_modules/react-test-renderer": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.2.3.tgz", - "integrity": "sha512-TMR1LnSFiWZMJkCgNf5ATSvAheTT2NvKIwiVwdBPHxjBI7n/JbWd4gaZ16DVd9foAXdvDz+sB5yxZTwMjPRxpw==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.3.0.tgz", + "integrity": "sha512-AUxgv+hRbqjRgx4xVwiWL6cvDDKPAva1VWLXQIMoevqQn9us//C5TX9LEnBGH47D0zvJpjwjxb1umzgOMvE8Wg==", "dev": true, "license": "MIT", "dependencies": { - "react-is": "^19.2.3", - "scheduler": "^0.27.0" + "react-is": "^19.3.0", + "scheduler": "^0.28.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^19.3.0" } }, "node_modules/react-test-renderer/node_modules/react-is": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz", - "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.3.1.tgz", + "integrity": "sha512-RRieF6IyxQBkcK6pP8xOHprLTPW6QjRkbGdImtqNme+/hYVwCZkLQLdlZGOhUqXwkS9IEynaGvPJtv6XB/cz0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-test-renderer/node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", "dev": true, "license": "MIT" }, @@ -39770,6 +41783,13 @@ "fsevents": "~2.3.2" } }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, "node_modules/rsbuild-plugin-html-minifier-terser": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/rsbuild-plugin-html-minifier-terser/-/rsbuild-plugin-html-minifier-terser-1.1.5.tgz", @@ -39994,6 +42014,18 @@ "devOptional": true, "license": "MIT" }, + "node_modules/sandbox-cli-detector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sandbox-cli-detector/-/sandbox-cli-detector-0.2.0.tgz", + "integrity": "sha512-4lyHX0ZU0AZKwjgZ1InxZAa3PNpyEb8rOQ+Zss1ReYmhNzW0Q+h1zE5nvniXN0HaAWZaZE1zgVNEirb0R7LmNg==", + "license": "MIT", + "bin": { + "sandbox-cli-detector": "dist/cli.js" + }, + "engines": { + "node": ">=18.18" + } + }, "node_modules/sax": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", @@ -40571,7 +42603,7 @@ }, "node_modules/slash": { "version": "3.0.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -40894,7 +42926,7 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause" }, "node_modules/sql-highlight": { @@ -40923,7 +42955,7 @@ }, "node_modules/stack-utils": { "version": "2.0.6", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" @@ -40934,7 +42966,7 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -42631,6 +44663,22 @@ "dev": true, "license": "MIT" }, + "node_modules/synckit": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.3.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/tabbable": { "version": "6.2.0", "license": "MIT" @@ -42840,7 +44888,7 @@ }, "node_modules/test-exclude": { "version": "6.0.0", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -42853,7 +44901,7 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -42870,6 +44918,53 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/test-renderer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/test-renderer/-/test-renderer-1.3.0.tgz", + "integrity": "sha512-DXyHv7JrVmDc5dKpfVHFhJ0Evo/EFY3TqlNt8CR65ua3SCsI09K/mQDJmYUOnZz36GANYqjp0ApeRER/mOxktQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react-reconciler": "~0.33.0", + "react-reconciler": "~0.34.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/test-renderer/node_modules/@types/react-reconciler": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.33.1.tgz", + "integrity": "sha512-0kF59ji2mKuHUd5wytHSpmORybMYVerJvq0K10pz9ZFoOlJ3e+w1LBjLshWpCrokeyQOioRodNbO4PH4ddvRfg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/test-renderer/node_modules/react-reconciler": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.34.0.tgz", + "integrity": "sha512-eVibvB1fc9j5Qf1KRkiM3GzRPBdjg2P6G6QV2f3P6Eb3OGMxRBhdg2rrUwjbV5JrQaJj8nOa8uajmmJA5tJWjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.3.0" + } + }, + "node_modules/test-renderer/node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "dev": true, + "license": "MIT" + }, "node_modules/text-encoding": { "version": "0.7.0", "license": "(Unlicense OR Apache-2.0)" @@ -43040,6 +45135,26 @@ "node": ">=14.0.0" } }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "license": "BSD-3-Clause" @@ -43085,6 +45200,19 @@ "node": ">=6" } }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/tr46": { "version": "0.0.3", "license": "MIT" @@ -43246,7 +45374,7 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -43703,9 +45831,9 @@ } }, "node_modules/unimodules-app-loader": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/unimodules-app-loader/-/unimodules-app-loader-57.0.1.tgz", - "integrity": "sha512-wey5ChoJkCTq0j0JWdIMu2QB81vVrdhmrNAP14ZZ6WDslnZ7ff7Ezv8rMdEnVHaCKz3xK4mIVXbVU51xHgdyCA==", + "version": "58.0.2", + "resolved": "https://registry.npmjs.org/unimodules-app-loader/-/unimodules-app-loader-58.0.2.tgz", + "integrity": "sha512-d7vZN9/awIwPCqzfw1qR/geJEzv3ElW0VdwXFnPw29QZYoAZI0jqXGKPZVG1vQCfhEiWJtBX/nVm1XI8wshrDg==", "license": "MIT" }, "node_modules/union": { @@ -44019,6 +46147,19 @@ "dev": true, "license": "MIT" }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/wait-port": { "version": "0.2.14", "dev": true, @@ -44240,6 +46381,16 @@ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "license": "MIT" }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "license": "MIT", @@ -44249,9 +46400,9 @@ } }, "node_modules/whatwg-url-minimum": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.2.tgz", - "integrity": "sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.2.0.tgz", + "integrity": "sha512-BtjXU1caNcCFfETP2DhqSeVPfRDl2MTUitI107RE34rJXjR/izfUtR5IoTFOK1WqjNLXbbeqaCH/mQAOLjpc8g==", "license": "MIT" }, "node_modules/whatwg-url-without-unicode": { @@ -44905,7 +47056,7 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { @@ -45021,6 +47172,16 @@ "node": ">=0.8" } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, "node_modules/xml-naming": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", @@ -45090,6 +47251,7 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "devOptional": true, "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index 47091d423e93..865083f10bdd 100644 --- a/package.json +++ b/package.json @@ -115,11 +115,12 @@ "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.16.3", "@react-native-community/netinfo": "11.4.1", - "@react-native-documents/picker": "^10.1.3", + "@react-native-documents/picker": "^12.0.3", "@react-native-firebase/analytics": "^22.2.1", "@react-native-firebase/app": "^22.2.1", "@react-native-google-signin/google-signin": "^10.0.1", "@react-native-picker/picker": "2.11.3", + "@react-native/assets-registry": "0.88.0", "@react-navigation/bottom-tabs": "7.19.2", "@react-navigation/core": "7.22.1", "@react-navigation/material-top-tabs": "7.7.2", @@ -144,19 +145,19 @@ "dom-serializer": "^0.2.2", "domhandler": "^5.0.3", "expensify-common": "2.0.224", - "expo": "57.0.8", - "expo-asset": "57.0.7", - "expo-audio": "57.0.3", - "expo-font": "57.0.1", - "expo-glass-effect": "57.0.4", - "expo-image": "57.0.1", - "expo-image-manipulator": "57.0.6", - "expo-location": "57.0.6", - "expo-modules-core": "57.0.15", - "expo-store-review": "57.0.1", - "expo-task-manager": "57.0.6", - "expo-video": "57.0.2", - "expo-web-browser": "57.0.2", + "expo": "58.0.14", + "expo-asset": "58.0.16", + "expo-audio": "58.0.9", + "expo-font": "58.0.8", + "expo-glass-effect": "58.0.5", + "expo-image": "58.0.15", + "expo-image-manipulator": "58.0.14", + "expo-location": "58.0.17", + "expo-modules-core": "58.0.29", + "expo-store-review": "58.0.2", + "expo-task-manager": "58.0.12", + "expo-video": "58.0.11", + "expo-web-browser": "58.0.6", "fast-equals": "^5.2.2", "focus-trap-react": "^11.0.3", "group-ib-fp": "file:modules/group-ib-fp", @@ -169,22 +170,23 @@ "lodash-es": "4.18.1", "lottie-react-native": "7.3.8", "mapbox-gl": "^3.24.0", - "metro-transform-plugins": "0.84.5", + "metro-transform-plugins": "0.87.1", "mime-db": "1.52.0", "modern-screenshot": "4.7.0", "onfido-sdk-ui": "14.53.1", "pako": "^2.1.0", "process": "^0.11.10", "pusher-js": "8.3.0", - "react": "19.2.3", + "react": "19.3.0", "react-collapse": "^5.1.0", "react-content-loader": "^7.0.0", - "react-dom": "19.2.3", + "react-dom": "19.3.0", "react-error-boundary": "^4.0.11", "react-fast-pdf": "^1.0.34", + "react-freeze": "1.0.3", "react-is": "^18.3.1", "react-map-gl": "^8.1.1", - "react-native": "0.86.0", + "react-native": "0.88.0", "react-native-advanced-input-mask": "1.4.6", "react-native-app-logs": "0.3.1", "react-native-blob-util": "0.24.12", @@ -268,7 +270,7 @@ "@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/babel-preset": "0.86.0", + "@react-native/babel-preset": "0.88.0", "@react-navigation/devtools": "7.1.15", "@rock-js/platform-android": "0.13.4", "@rock-js/platform-ios": "0.13.4", @@ -304,9 +306,9 @@ "@types/node": "^26.6.5", "@types/pako": "^2.0.3", "@types/pusher-js": "^5.1.0", - "@types/react": "19.2.3", + "@types/react": "19.3.0", "@types/react-collapse": "^5.0.1", - "@types/react-dom": "19.2.3", + "@types/react-dom": "19.3.0", "@types/react-is": "^18.3.0", "@types/react-native-web": "0.19.2", "@types/react-test-renderer": "^19.1.0", @@ -319,7 +321,7 @@ "babel-plugin-istanbul": "^6.1.1", "babel-plugin-module-resolver": "^5.0.0", "babel-plugin-transform-remove-console": "^6.9.4", - "babel-preset-expo": "^57.0.3", + "babel-preset-expo": "^58.0.17", "bun": "^1.4.4", "concurrently": "^9.2.4", "cspell": "9.4.0", @@ -343,12 +345,12 @@ "jest-circus": "29.7.0", "jest-cli": "29.7.0", "jest-environment-jsdom": "^29.7.0", - "jest-expo": "57.0.2", + "jest-expo": "58.0.11", "jest-transformer-svg": "^2.0.1", "knip": "^6.34.0", "lefthook": "2.1.9", "memfs": "^4.6.0", - "metro-symbolicate": "0.84.5", + "metro-symbolicate": "0.87.1", "nitrogen": "0.37.1", "onchange": "^7.1.0", "openai": "^7.0.0", @@ -361,7 +363,7 @@ "portfinder": "^1.0.34", "react-native-clean-project": "^4.0.0-alpha4.0", "react-refresh": "^0.14.2", - "react-test-renderer": "19.2.3", + "react-test-renderer": "19.3.0", "reassure": "^1.0.0", "rock": "0.13.4", "semver": "7.5.2", @@ -405,7 +407,7 @@ "elliptic": "6.5.7", "fast-json-patch": "3.1.1", "image-size": "2.0.4", - "hermes-compiler": "250829098.0.14", + "hermes-compiler": "260318099.0.4", "webpack": "^5.108.4", "esbuild": "^0.28.1", "@blakeembrey/template": "1.2.0", @@ -416,8 +418,8 @@ "serialize-javascript": "7.1.2", "adm-zip": "0.6.1", "tinypool": "2.1.2", - "react": "19.2.3", - "react-dom": "19.2.3", + "react": "19.3.0", + "react-dom": "19.3.0", "eslint-config-expensify": { "typescript-eslint": "8.58.1", "@typescript-eslint/eslint-plugin": "8.58.1", @@ -431,23 +433,24 @@ "lightningcss": "1.30.1", "zod": "4.6.7", "@fullstory/react-native": { - "expo": "57.0.8" + "expo": "58.0.14" }, "@react-native-firebase/app": { - "expo": "57.0.8" + "expo": "58.0.14" }, "@react-native-google-signin/google-signin": { - "expo": "57.0.8" + "expo": "58.0.14" }, "@rnmapbox/maps": { - "expo": "57.0.8" + "expo": "58.0.14" }, "@sentry/react-native": { - "expo": "57.0.8" + "expo": "58.0.14" }, "expo-modules-core": { "react-native-worklets": "0.13.0" - } + }, + "@react-native/codegen": "0.88.0" }, "expo": { "autolinking": { @@ -458,7 +461,6 @@ ], "android": { "buildFromSource": [ - "expo-location", "expo-task-manager", "unimodules-app-loader" ] diff --git a/patches/@expensify/react-native-live-markdown/details.md b/patches/@expensify/react-native-live-markdown/details.md index bc201cf9a0f6..01873e998596 100644 --- a/patches/@expensify/react-native-live-markdown/details.md +++ b/patches/@expensify/react-native-live-markdown/details.md @@ -3,7 +3,7 @@ ### [@expensify+react-native-live-markdown+0.1.371+001+register-parser-worklet-in-insertion-effect.patch](@expensify+react-native-live-markdown+0.1.371+001+register-parser-worklet-in-insertion-effect.patch) - Reason: `MarkdownTextInput` registered its parser worklet during render (`useMemo`) and unregistered it in an effect cleanup. React runs that cleanup without unmounting the component under StrictMode and whenever a hidden `` disconnects effects, so the native view kept a parser id that pointed at nothing and the input silently stopped formatting markdown. The patch moves the registration into `useInsertionEffect` in a new `useParserId` hook, chooses the id in JS (one per mounted input, a fresh one on every `parser` change) and turns the native registry into a plain map. A parse for an id with no registered worklet logs a warning and returns no ranges without caching them, so the next parse picks the parser up once it is registered. It carries the `src/`, `lib/` and native (`cpp/`, `apple/`, `android/`) parts of the upstream PR. -- Depends on: `react-native+0.86.0+044+run-insertion-effect-cleanup-in-hidden-subtree.patch`. Without it Fabric skips the insertion cleanup for an input removed while its `` is hidden, and the worklet leaks in the native registry. Formatting stays correct either way because ids are never reused. +- Depends on: the renderer running the insertion-effect cleanup for a component removed inside a hidden ``, which the React 19.3 renderer bundled with React Native 0.88 does unconditionally. On an older renderer the worklet would leak in the native registry; formatting stays correct either way because ids are never reused. - Upstream PR/issue: https://github.com/Expensify/react-native-live-markdown/pull/776 (on hold until the library can rely on React Native 0.88; drop this patch once the app upgrades to a release that contains it) - E/App issue: https://github.com/Expensify/App/issues/98254 - PR introducing patch: https://github.com/Expensify/App/pull/102415 diff --git a/patches/@react-native/virtualized-lists/@react-native+virtualized-lists+0.86.0+001+osr-improvement.patch b/patches/@react-native/virtualized-lists/@react-native+virtualized-lists+0.86.0+001+osr-improvement.patch deleted file mode 100644 index 98d34bb9cf85..000000000000 --- a/patches/@react-native/virtualized-lists/@react-native+virtualized-lists+0.86.0+001+osr-improvement.patch +++ /dev/null @@ -1,111 +0,0 @@ -diff --git a/node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.js b/node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.js -index 5b8aaa5..45ea377 100644 ---- a/node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.js -+++ b/node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.js -@@ -90,6 +90,7 @@ type State = { - firstVisibleItemKey: ?string, - // When > 0 the scroll position available in JS is considered stale and should not be used. - pendingScrollUpdateCount: number, -+ lastItemCount: number, - }; - - function getScrollingThreshold(threshold: number, visibleLength: number) { -@@ -403,12 +404,13 @@ class VirtualizedList extends StateSafePureComponent< - - const minIndexForVisible = - this.props.maintainVisibleContentPosition?.minIndexForVisible ?? 0; -+ const itemCount = this.props.getItemCount(this.props.data); - - this.state = { - cellsAroundViewport: initialRenderRegion, - renderMask: VirtualizedList._createRenderMask(props, initialRenderRegion), - firstVisibleItemKey: -- this.props.getItemCount(this.props.data) > minIndexForVisible -+ itemCount > minIndexForVisible - ? VirtualizedList._getItemKey(this.props, minIndexForVisible) - : null, - // When we have a non-zero initialScrollIndex, we will receive a -@@ -419,6 +421,7 @@ class VirtualizedList extends StateSafePureComponent< - this.props.initialScrollIndex > 0 - ? 1 - : 0, -+ lastItemCount: itemCount, - }; - } - -@@ -706,7 +709,7 @@ class VirtualizedList extends StateSafePureComponent< - // first and last could be stale (e.g. if a new, shorter items props is passed in), so we make - // sure we're rendering a reasonable range here. - const itemCount = newProps.getItemCount(newProps.data); -- if (itemCount === prevState.renderMask.numCells()) { -+ if (itemCount === prevState.renderMask.numCells() && itemCount === prevState.lastItemCount) { - return prevState; - } - -@@ -715,7 +718,7 @@ class VirtualizedList extends StateSafePureComponent< - const minIndexForVisible = - newProps.maintainVisibleContentPosition?.minIndexForVisible ?? 0; - const newFirstVisibleItemKey = -- newProps.getItemCount(newProps.data) > minIndexForVisible -+ itemCount > minIndexForVisible - ? VirtualizedList._getItemKey(newProps, minIndexForVisible) - : null; - if ( -@@ -763,6 +766,7 @@ class VirtualizedList extends StateSafePureComponent< - maintainVisibleContentPositionAdjustment != null - ? prevState.pendingScrollUpdateCount + 1 - : prevState.pendingScrollUpdateCount, -+ lastItemCount: itemCount, - }; - } - -@@ -1183,7 +1187,7 @@ class VirtualizedList extends StateSafePureComponent< - } - } - -- componentDidUpdate(prevProps: VirtualizedListProps) { -+ componentDidUpdate(prevProps: VirtualizedListProps, prevState: State) { - const {data, extraData, getItemLayout} = this.props; - if (data !== prevProps.data || extraData !== prevProps.extraData) { - // clear the viewableIndices cache to also trigger -@@ -1205,7 +1209,10 @@ class VirtualizedList extends StateSafePureComponent< - if (hiPriInProgress) { - this._hiPriInProgress = false; - } -- -+ if (this.state.cellsAroundViewport.first !== prevState.cellsAroundViewport.first || -+ this.state.cellsAroundViewport.last !== prevState.cellsAroundViewport.last) { -+ this._maybeCallOnEdgeReached(); -+ } - // We only call `onEndReached` after we render the last cell, but when - // getItemLayout is present, we can scroll past the last rendered cell, and - // never trigger a new layout or bounds change, so we need to check again -@@ -1251,7 +1258,7 @@ class VirtualizedList extends StateSafePureComponent< - zoomScale: 1, - }; - _scrollRef: ?React.ElementRef = null; -- _sentStartForContentLength = 0; -+ _sentStartForFirstVisibleItemKey: ?string = null; - _sentEndForContentLength = 0; - _updateCellsToRenderTimeoutID: ?TimeoutID = null; - _viewabilityTuples: Array = []; -@@ -1595,16 +1602,16 @@ class VirtualizedList extends StateSafePureComponent< - onStartReached != null && - this.state.cellsAroundViewport.first === 0 && - isWithinStartThreshold && -- this._listMetrics.getContentLength() !== this._sentStartForContentLength -+ this.state.firstVisibleItemKey !== this._sentStartForFirstVisibleItemKey - ) { -- this._sentStartForContentLength = this._listMetrics.getContentLength(); -+ this._sentStartForFirstVisibleItemKey = this.state.firstVisibleItemKey; - onStartReached({distanceFromStart}); - } - - // If the user scrolls away from the start or end and back again, - // cause onStartReached or onEndReached to be triggered again - if (!isWithinStartThreshold) { -- this._sentStartForContentLength = 0; -+ this._sentStartForFirstVisibleItemKey = null; - } - if (!isWithinEndThreshold) { - this._sentEndForContentLength = 0; diff --git a/patches/@react-native/virtualized-lists/details.md b/patches/@react-native/virtualized-lists/details.md deleted file mode 100644 index cc00ecd786e9..000000000000 --- a/patches/@react-native/virtualized-lists/details.md +++ /dev/null @@ -1,14 +0,0 @@ -# `@react-native/virtualized-lists` patches - - -### [@react-native+virtualized-lists+0.86.0+001+osr-improvement.patch](@react-native+virtualized-lists+0.86.0+001+osr-improvement.patch) - -- Reason: - - ``` - Fix onStartReached not called in some cases (https://github.com/Expensify/App/commit/15546b6fa2aad0e74d8822bcaecebbf9b4187287): When scrolling down after comment linking, sometimes the scroll would get stuck. This is because onStartReached was never called. This is caused by the early return in VirtualizedList.getDerivedStateFromProps. It compares the number of items with renderMask.numCells(), but for some reason sometimes this is different from the previous number of items. So to fix it we now save the previous number of items in state and also compare that. - ``` - -- Upstream PR/issue: https://github.com/facebook/react-native/pull/46250 -- E/App issue: https://github.com/Expensify/App/issues/46217 -- PR introducing patch: https://github.com/Expensify/App/pull/46315 diff --git a/patches/@ua/react-native-airship/@ua+react-native-airship+26.7.0+001+rn088-suppress-accidental-override.patch b/patches/@ua/react-native-airship/@ua+react-native-airship+26.7.0+001+rn088-suppress-accidental-override.patch new file mode 100644 index 000000000000..9f405a2723e6 --- /dev/null +++ b/patches/@ua/react-native-airship/@ua+react-native-airship+26.7.0+001+rn088-suppress-accidental-override.patch @@ -0,0 +1,38 @@ +diff --git a/node_modules/@ua/react-native-airship/android/src/main/java/com/urbanairship/reactnative/ReactEmbeddedViewManager.kt b/node_modules/@ua/react-native-airship/android/src/main/java/com/urbanairship/reactnative/ReactEmbeddedViewManager.kt +--- a/node_modules/@ua/react-native-airship/android/src/main/java/com/urbanairship/reactnative/ReactEmbeddedViewManager.kt ++++ b/node_modules/@ua/react-native-airship/android/src/main/java/com/urbanairship/reactnative/ReactEmbeddedViewManager.kt +@@ -14,6 +14,7 @@ class ReactEmbeddedViewManager : SimpleViewManager(), + + private val manualDelegate = object : ViewManagerDelegate { + ++ @Suppress("ACCIDENTAL_OVERRIDE") // RN 0.88: ViewManagerDelegate signatures changed; upstream 26.12.0 suppresses the same way + override fun setProperty(view: ReactEmbeddedView, propName: String, value: Any?) { + when (propName) { + "embeddedId" -> setEmbeddedId(view, value as? String) +@@ -21,6 +22,7 @@ class ReactEmbeddedViewManager : SimpleViewManager(), + } + } + ++ @Suppress("ACCIDENTAL_OVERRIDE") // RN 0.88: ViewManagerDelegate signatures changed; upstream 26.12.0 suppresses the same way + override fun receiveCommand( + view: ReactEmbeddedView, + commandName: String, +diff --git a/node_modules/@ua/react-native-airship/android/src/main/java/com/urbanairship/reactnative/ReactMessageViewManager.kt b/node_modules/@ua/react-native-airship/android/src/main/java/com/urbanairship/reactnative/ReactMessageViewManager.kt +--- a/node_modules/@ua/react-native-airship/android/src/main/java/com/urbanairship/reactnative/ReactMessageViewManager.kt ++++ b/node_modules/@ua/react-native-airship/android/src/main/java/com/urbanairship/reactnative/ReactMessageViewManager.kt +@@ -14,6 +14,7 @@ class ReactMessageViewManager : SimpleViewManager(), + + private val delegate = object : ViewManagerDelegate { + ++ @Suppress("ACCIDENTAL_OVERRIDE") // RN 0.88: ViewManagerDelegate signatures changed; upstream 26.12.0 suppresses the same way + override fun setProperty(view: ReactMessageView, propName: String, value: Any?) { + when (propName) { + "messageId" -> setMessageId(view, value as? String) +@@ -21,6 +22,7 @@ class ReactMessageViewManager : SimpleViewManager(), + } + } + ++ @Suppress("ACCIDENTAL_OVERRIDE") // RN 0.88: ViewManagerDelegate signatures changed; upstream 26.12.0 suppresses the same way + override fun receiveCommand( + view: ReactMessageView, + commandName: String, diff --git a/patches/@ua/react-native-airship/details.md b/patches/@ua/react-native-airship/details.md new file mode 100644 index 000000000000..423aa33220b2 --- /dev/null +++ b/patches/@ua/react-native-airship/details.md @@ -0,0 +1,15 @@ +# `@ua/react-native-airship` patches + +### [@ua+react-native-airship+26.7.0+001+rn088-suppress-accidental-override.patch](@ua+react-native-airship+26.7.0+001+rn088-suppress-accidental-override.patch) + +- Reason: + + ``` + React Native 0.88 changed the Kotlin signatures of `ViewManagerDelegate.setProperty/receiveCommand`, so the + anonymous delegates in `ReactEmbeddedViewManager` and `ReactMessageViewManager` fail with `ACCIDENTAL_OVERRIDE`. + Suppress the diagnostic on the four overrides; the methods themselves keep working. + ``` + +- Upstream PR/issue: Fixed upstream in 27.0.0, which adds the same `@Suppress("ACCIDENTAL_OVERRIDE")` on all four overrides. Drop this patch when bumping to >= 27.0.0. That is a major: on iOS `AirshipFrameworkProxy` moves from CocoaPods to Swift Package Manager, and it requires React Native >= 0.85. +- E/App issue: https://github.com/Expensify/App/issues/106111 +- PR introducing patch: https://github.com/Expensify/App/pull/101739 diff --git a/patches/expo-asset/details.md b/patches/expo-asset/details.md index 5de59b1ddc70..5abcc9a4c5f1 100644 --- a/patches/expo-asset/details.md +++ b/patches/expo-asset/details.md @@ -1,6 +1,6 @@ # `expo-asset` patches -### [expo-asset+57.0.7+001+make-storybook-work.patch](expo-asset+57.0.7+001+make-storybook-work.patch) +### [expo-asset+58.0.16+001+make-storybook-work.patch](expo-asset+58.0.16+001+make-storybook-work.patch) - Reason: diff --git a/patches/expo-asset/expo-asset+57.0.7+001+make-storybook-work.patch b/patches/expo-asset/expo-asset+58.0.16+001+make-storybook-work.patch similarity index 97% rename from patches/expo-asset/expo-asset+57.0.7+001+make-storybook-work.patch rename to patches/expo-asset/expo-asset+58.0.16+001+make-storybook-work.patch index c9505e69e230..22e86c32f306 100644 --- a/patches/expo-asset/expo-asset+57.0.7+001+make-storybook-work.patch +++ b/patches/expo-asset/expo-asset+58.0.16+001+make-storybook-work.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/expo-asset/build/PlatformUtils.web.js b/node_modules/expo-asset/build/PlatformUtils.web.js -index c013cd0..03662e1 100644 +index a3b2cbc..29c7b21 100644 --- a/node_modules/expo-asset/build/PlatformUtils.web.js +++ b/node_modules/expo-asset/build/PlatformUtils.web.js @@ -1,4 +1,19 @@ diff --git a/patches/expo-image-manipulator/details.md b/patches/expo-image-manipulator/details.md index fe30e099b1ba..b71aa9c72061 100644 --- a/patches/expo-image-manipulator/details.md +++ b/patches/expo-image-manipulator/details.md @@ -1,6 +1,6 @@ # `expo-image-manipulator` patches -### [expo-image-manipulator+57.0.6+001+adjust-ios-canvas-size.patch](expo-image-manipulator+57.0.6+001+adjust-ios-canvas-size.patch) +### [expo-image-manipulator+58.0.14+001+adjust-ios-canvas-size.patch](expo-image-manipulator+58.0.14+001+adjust-ios-canvas-size.patch) - Reason: @@ -12,35 +12,30 @@ - E/App issue: https://github.com/Expensify/App/issues/44084 - PR introducing patch: https://github.com/Expensify/App/pull/45448 -### [expo-image-manipulator+57.0.6+002+fix-orientation-10bit-hdr.patch](expo-image-manipulator+57.0.6+002+fix-orientation-10bit-hdr.patch) +### [expo-image-manipulator+58.0.14+002+fix-orientation-10bit-hdr.patch](expo-image-manipulator+58.0.14+002+fix-orientation-10bit-hdr.patch) - Reason: ``` - `ImageFixOrientationTransformer` built its `CGContext` with `bitsPerComponent` copied from the source image. - `CGBitmapContext` rejects 10 bits per component, so it returned nil and the transformer threw - `ImageContextLostException` for every 10-bit HDR HEIC, blocking HEIC to JPEG conversion. Following PR #50011, - skip the redraw when the image is already upright, otherwise redraw through `drawInNewContext`. Upright images - with a PQ or HLG profile are redrawn too, since that profile would otherwise survive into the saved JPEG and - render black. + `ImageFixOrientationTransformer` skips the redraw when an image is already upright. An upright HDR image with a + PQ or HLG transfer function then keeps that profile in the saved JPEG, and decoders without ITU-R BT.2100 support + render it black. The patch adds one condition to that early return, so upright PQ/HLG images are redrawn too, + which tone-maps them to standard range. ``` -- Upstream PR/issue: https://github.com/expo/expo/pull/50011 (open), fixes https://github.com/expo/expo/issues/49953. Alternative fix under review in https://github.com/expo/expo/pull/50009 +- Upstream PR/issue: https://github.com/expo/expo/pull/50011 (merged in 58.0.9) fixed the 10-bit crash; the PQ/HLG redraw is not upstream. - E/App issue: https://github.com/Expensify/App/issues/100133 - PR introducing patch: https://github.com/Expensify/App/pull/101102 -### [expo-image-manipulator+57.0.6+003+web-typings.patch](expo-image-manipulator+57.0.6+003+web-typings.patch) +### [expo-image-manipulator+58.0.14+003+web-typings.patch](expo-image-manipulator+58.0.14+003+web-typings.patch) - Reason: ``` - Two web typing bugs: - 1. `NativeImageManipulatorModule.web.d.ts` types its default export as the class (`typeof ImageManipulator`), - while `registerWebModule` returns an instance. So `ImageManipulator.manipulate()` doesn't compile on web. - 2. The web `ImageManipulatorContext.resize()` requires both `width` and `height`, while the native one makes them - optional and the web implementation already keeps the aspect ratio when one is missing. + The web `ImageManipulatorContext.resize()` requires both `width` and `height`, while the native one makes them + optional and the web implementation already keeps the aspect ratio when one is missing. ``` -- Upstream PR/issue: 1 is fixed in `expo-modules-core` by https://github.com/expo/expo/pull/49197, and the generated `.d.ts` picks it up on the next `expo-image-manipulator` release. 2: 🛑, upstream PR to be opened. +- Upstream PR/issue: 🛑, upstream PR to be opened. On 57.x the patch also fixed the web default export type (`typeof ImageManipulator` instead of an instance). 58.0.14 ships that fix (https://github.com/expo/expo/pull/49197), so it is no longer part of the patch. - E/App issue: https://github.com/Expensify/App/issues/99287 - PR introducing patch: https://github.com/Expensify/App/pull/105816 diff --git a/patches/expo-image-manipulator/expo-image-manipulator+57.0.6+001+adjust-ios-canvas-size.patch b/patches/expo-image-manipulator/expo-image-manipulator+57.0.6+001+adjust-ios-canvas-size.patch deleted file mode 100644 index fc66ed043d78..000000000000 --- a/patches/expo-image-manipulator/expo-image-manipulator+57.0.6+001+adjust-ios-canvas-size.patch +++ /dev/null @@ -1,71 +0,0 @@ -diff --git a/node_modules/expo-image-manipulator/src/web/utils.web.ts b/node_modules/expo-image-manipulator/src/web/utils.web.ts -index dc2465a..04d8af1 100644 ---- a/node_modules/expo-image-manipulator/src/web/utils.web.ts -+++ b/node_modules/expo-image-manipulator/src/web/utils.web.ts -@@ -8,6 +8,13 @@ export function getContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D - return ctx; - } - -+const SAFARI_MOBILE_CANVAS_LIMIT = 4096; -+ -+const isMobileIOS = () => { -+ const userAgent = navigator.userAgent; -+ return /iP(ad|od|hone)/i.test(userAgent) && /(WebKit|CriOS|FxiOS|OPiOS|mercury)/i.test(userAgent); -+}; -+ - export async function blobToBase64String(blob: Blob): Promise { - const dataURL = await new Promise((resolve, reject) => { - const reader = new FileReader(); -@@ -19,17 +26,49 @@ export async function blobToBase64String(blob: Blob): Promise { - return dataURL.replace(/^data:image\/\w+;base64,/, ''); - } - -+function getAdjustedCanvasSize(originalWidth, originalHeight) { -+ if(!isMobileIOS()) return { width: originalWidth, height: originalHeight }; -+ -+ const aspectRatio = originalWidth / originalHeight; -+ let newWidth; -+ let newHeight; -+ -+ if (originalWidth <= SAFARI_MOBILE_CANVAS_LIMIT && originalHeight <= SAFARI_MOBILE_CANVAS_LIMIT) { -+ return { width: originalWidth, height: originalHeight }; -+ } -+ -+ if (aspectRatio > 1) { -+ newWidth = SAFARI_MOBILE_CANVAS_LIMIT; -+ newHeight = Math.round(newWidth / aspectRatio); -+ } else { -+ newHeight = SAFARI_MOBILE_CANVAS_LIMIT; -+ newWidth = Math.round(newHeight * aspectRatio); -+ } -+ -+ if (newWidth > SAFARI_MOBILE_CANVAS_LIMIT) { -+ newWidth = SAFARI_MOBILE_CANVAS_LIMIT; -+ newHeight = Math.round(newWidth / aspectRatio); -+ } else if (newHeight > SAFARI_MOBILE_CANVAS_LIMIT) { -+ newHeight = SAFARI_MOBILE_CANVAS_LIMIT; -+ newWidth = Math.round(newHeight * aspectRatio); -+ } -+ -+ return { width: newWidth, height: newHeight }; -+} -+ - export function loadImageAsync(uri: string): Promise { - return new Promise((resolve, reject) => { - const imageSource = new Image(); - imageSource.crossOrigin = 'anonymous'; - const canvas = document.createElement('canvas'); - imageSource.onload = () => { -- canvas.width = imageSource.naturalWidth; -- canvas.height = imageSource.naturalHeight; -+ const adjudstedCanvasSize = getAdjustedCanvasSize(imageSource.naturalWidth, imageSource.naturalHeight); -+ -+ canvas.width = adjudstedCanvasSize.width; -+ canvas.height = adjudstedCanvasSize.height; - - const context = getContext(canvas); -- context.drawImage(imageSource, 0, 0, imageSource.naturalWidth, imageSource.naturalHeight); -+ context.drawImage(imageSource, 0, 0, adjudstedCanvasSize.width, adjudstedCanvasSize.height); - - resolve(canvas); - }; diff --git a/patches/expo-image-manipulator/expo-image-manipulator+57.0.6+002+fix-orientation-10bit-hdr.patch b/patches/expo-image-manipulator/expo-image-manipulator+57.0.6+002+fix-orientation-10bit-hdr.patch deleted file mode 100644 index 0e6280a2f813..000000000000 --- a/patches/expo-image-manipulator/expo-image-manipulator+57.0.6+002+fix-orientation-10bit-hdr.patch +++ /dev/null @@ -1,86 +0,0 @@ -diff --git a/node_modules/expo-image-manipulator/ios/Transformers/ImageFixOrientationTransformer.swift b/node_modules/expo-image-manipulator/ios/Transformers/ImageFixOrientationTransformer.swift -index c3e3b66..c9cf2a1 100644 ---- a/node_modules/expo-image-manipulator/ios/Transformers/ImageFixOrientationTransformer.swift -+++ b/node_modules/expo-image-manipulator/ios/Transformers/ImageFixOrientationTransformer.swift -@@ -9,67 +9,20 @@ internal struct ImageFixOrientationTransformer: ImageTransformer { - guard let cgImage = image.cgImage else { - throw ImageNotFoundException() - } -- guard var colorSpace = cgImage.colorSpace else { -- // That should never happen as `colorSpace` is empty only when the image is a mask. -- throw ImageColorSpaceNotFoundException() -+ // A PQ or HLG transfer function cannot be carried into the formats `saveAsync` writes: the profile survives -+ // into the file and decoders without ITU-R BT.2100 support render it black. Redrawing tone-maps the image down -+ // to the renderer's standard-range output, so it is worth doing even when the orientation needs no fixing. -+ let usesHDRTransferFunction = cgImage.colorSpace.map(CGColorSpaceUsesITUR_2100TF) ?? false -+ // The pixel data already matches the displayed orientation and its profile survives encoding, so there is -+ // nothing to fix. -+ if image.imageOrientation == .up && !usesHDRTransferFunction { -+ return image -+ } -+ // `UIImage.draw(in:)` applies the orientation on its own. -+ // Unlike a raw bitmap context, the renderer accepts any source pixel format, -+ // including the 10-bit HDR images that `CGBitmapContextCreate` rejects. -+ return drawInNewContext(size: image.size) { _ in -+ image.draw(in: CGRect(origin: .zero, size: image.size)) - } -- if !colorSpace.supportsOutput { -- colorSpace = CGColorSpaceCreateDeviceRGB() -- } -- -- var transform = CGAffineTransform.identity -- -- switch image.imageOrientation { -- case .down, .downMirrored: -- transform = transform.translatedBy(x: image.size.width, y: image.size.height) -- transform = transform.rotated(by: Double.pi) -- case .left, .leftMirrored: -- transform = transform.translatedBy(x: image.size.width, y: 0) -- transform = transform.rotated(by: Double.pi / 2) -- case .right, .rightMirrored: -- transform = transform.translatedBy(x: 0, y: image.size.height) -- transform = transform.rotated(by: -Double.pi / 2) -- default: -- break -- } -- -- switch image.imageOrientation { -- case .upMirrored, .downMirrored: -- transform = transform.translatedBy(x: image.size.width, y: 0) -- transform = transform.scaledBy(x: -1, y: 1) -- case .leftMirrored, .rightMirrored: -- transform = transform.translatedBy(x: image.size.height, y: 0) -- transform = transform.scaledBy(x: -1, y: 1) -- default: -- break -- } -- -- let context = CGContext( -- data: nil, -- width: Int(image.size.width), -- height: Int(image.size.height), -- bitsPerComponent: cgImage.bitsPerComponent, -- bytesPerRow: 0, -- space: colorSpace, -- bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue -- ) -- -- guard let context = context else { -- throw ImageContextLostException() -- } -- -- context.concatenate(transform) -- -- switch image.imageOrientation { -- case .left, .leftMirrored, .right, .rightMirrored: -- context.draw(cgImage, in: CGRect(x: 0, y: 0, width: image.size.height, height: image.size.width)) -- default: -- context.draw(cgImage, in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)) -- } -- -- guard let newCGImage = context.makeImage() else { -- throw ImageDrawingFailedException() -- } -- return UIImage(cgImage: newCGImage) - } - } diff --git a/patches/expo-image-manipulator/expo-image-manipulator+58.0.14+001+adjust-ios-canvas-size.patch b/patches/expo-image-manipulator/expo-image-manipulator+58.0.14+001+adjust-ios-canvas-size.patch new file mode 100644 index 000000000000..03d3a80fe47c --- /dev/null +++ b/patches/expo-image-manipulator/expo-image-manipulator+58.0.14+001+adjust-ios-canvas-size.patch @@ -0,0 +1,59 @@ +diff --git a/node_modules/expo-image-manipulator/build/web/utils.web.js b/node_modules/expo-image-manipulator/build/web/utils.web.js +index 754bd05..0d10e8d 100644 +--- a/node_modules/expo-image-manipulator/build/web/utils.web.js ++++ b/node_modules/expo-image-manipulator/build/web/utils.web.js +@@ -6,6 +6,11 @@ export function getContext(canvas) { + } + return ctx; + } ++const SAFARI_MOBILE_CANVAS_LIMIT = 4096; ++const isMobileIOS = () => { ++ const userAgent = navigator.userAgent; ++ return /iP(ad|od|hone)/i.test(userAgent) && /(WebKit|CriOS|FxiOS|OPiOS|mercury)/i.test(userAgent); ++}; + export async function blobToBase64String(blob) { + const dataURL = await new Promise((resolve, reject)=>{ + const reader = new FileReader(); +@@ -15,6 +20,32 @@ export async function blobToBase64String(blob) { + }); + return dataURL.replace(/^data:image\/\w+;base64,/, ''); + } ++function getAdjustedCanvasSize(originalWidth, originalHeight) { ++ if (!isMobileIOS()) return { width: originalWidth, height: originalHeight }; ++ const aspectRatio = originalWidth / originalHeight; ++ let newWidth; ++ let newHeight; ++ if (originalWidth <= SAFARI_MOBILE_CANVAS_LIMIT && originalHeight <= SAFARI_MOBILE_CANVAS_LIMIT) { ++ return { width: originalWidth, height: originalHeight }; ++ } ++ if (aspectRatio > 1) { ++ newWidth = SAFARI_MOBILE_CANVAS_LIMIT; ++ newHeight = Math.round(newWidth / aspectRatio); ++ } ++ else { ++ newHeight = SAFARI_MOBILE_CANVAS_LIMIT; ++ newWidth = Math.round(newHeight * aspectRatio); ++ } ++ if (newWidth > SAFARI_MOBILE_CANVAS_LIMIT) { ++ newWidth = SAFARI_MOBILE_CANVAS_LIMIT; ++ newHeight = Math.round(newWidth / aspectRatio); ++ } ++ else if (newHeight > SAFARI_MOBILE_CANVAS_LIMIT) { ++ newHeight = SAFARI_MOBILE_CANVAS_LIMIT; ++ newWidth = Math.round(newHeight * aspectRatio); ++ } ++ return { width: newWidth, height: newHeight }; ++} + export function releaseCanvas(canvas) { + canvas.width = 0; + canvas.height = 0; +@@ -25,7 +56,8 @@ export function loadImageAsync(uri, options) { + imageSource.crossOrigin = 'anonymous'; + const canvas = document.createElement('canvas'); + imageSource.onload = ()=>{ +- const { width, height } = boundedSize(imageSource.naturalWidth, imageSource.naturalHeight, options?.maxWidth, options?.maxHeight); ++ const boundedCanvasSize = boundedSize(imageSource.naturalWidth, imageSource.naturalHeight, options?.maxWidth, options?.maxHeight); ++ const { width, height } = getAdjustedCanvasSize(boundedCanvasSize.width, boundedCanvasSize.height); + canvas.width = width; + canvas.height = height; + const context = getContext(canvas); diff --git a/patches/expo-image-manipulator/expo-image-manipulator+58.0.14+002+fix-orientation-10bit-hdr.patch b/patches/expo-image-manipulator/expo-image-manipulator+58.0.14+002+fix-orientation-10bit-hdr.patch new file mode 100644 index 000000000000..528ccd425cbd --- /dev/null +++ b/patches/expo-image-manipulator/expo-image-manipulator+58.0.14+002+fix-orientation-10bit-hdr.patch @@ -0,0 +1,18 @@ +diff --git a/node_modules/expo-image-manipulator/ios/Transformers/ImageFixOrientationTransformer.swift b/node_modules/expo-image-manipulator/ios/Transformers/ImageFixOrientationTransformer.swift +index 17614ca..358f835 100644 +--- a/node_modules/expo-image-manipulator/ios/Transformers/ImageFixOrientationTransformer.swift ++++ b/node_modules/expo-image-manipulator/ios/Transformers/ImageFixOrientationTransformer.swift +@@ -11,8 +11,12 @@ internal struct ImageFixOrientationTransformer: ImageTransformer { + guard let cgImage = image.cgImage else { + throw ImageNotFoundException() + } ++ // A PQ or HLG transfer function cannot be carried into the formats `saveAsync` writes: the profile survives ++ // into the file and decoders without ITU-R BT.2100 support render it black. Redrawing tone-maps the image down ++ // to the renderer's standard-range output, so it is worth doing even when the orientation needs no fixing. ++ let usesHDRTransferFunction = cgImage.colorSpace.map(CGColorSpaceUsesITUR_2100TF) ?? false + // Upright pixels need no redraw. Normalize the scale to pixel coordinates. +- guard image.imageOrientation != .up else { ++ guard image.imageOrientation != .up || usesHDRTransferFunction else { + return image.scale == 1 ? image : UIImage(cgImage: cgImage) + } + // `draw(in:)` applies the orientation. The renderer accepts 10-bit HDR sources that `CGContext` rejects. diff --git a/patches/expo-image-manipulator/expo-image-manipulator+57.0.6+003+web-typings.patch b/patches/expo-image-manipulator/expo-image-manipulator+58.0.14+003+web-typings.patch similarity index 51% rename from patches/expo-image-manipulator/expo-image-manipulator+57.0.6+003+web-typings.patch rename to patches/expo-image-manipulator/expo-image-manipulator+58.0.14+003+web-typings.patch index 7b5436dc337f..da63ab3553bf 100644 --- a/patches/expo-image-manipulator/expo-image-manipulator+57.0.6+003+web-typings.patch +++ b/patches/expo-image-manipulator/expo-image-manipulator+58.0.14+003+web-typings.patch @@ -1,16 +1,3 @@ -diff --git a/node_modules/expo-image-manipulator/build/NativeImageManipulatorModule.web.d.ts b/node_modules/expo-image-manipulator/build/NativeImageManipulatorModule.web.d.ts -index 627ef30..e93a4bf 100644 ---- a/node_modules/expo-image-manipulator/build/NativeImageManipulatorModule.web.d.ts -+++ b/node_modules/expo-image-manipulator/build/NativeImageManipulatorModule.web.d.ts -@@ -7,6 +7,6 @@ declare class ImageManipulator extends NativeModule { - Image: typeof ImageManipulatorImageRef; - manipulate(source: string | SharedRef<'image'>): ImageManipulatorContext; - } --declare const _default: typeof ImageManipulator; -+declare const _default: ImageManipulator; - export default _default; - //# sourceMappingURL=NativeImageManipulatorModule.web.d.ts.map -\ No newline at end of file diff --git a/node_modules/expo-image-manipulator/build/web/ImageManipulatorContext.web.d.ts b/node_modules/expo-image-manipulator/build/web/ImageManipulatorContext.web.d.ts index 9991c3b..60f3aa8 100644 --- a/node_modules/expo-image-manipulator/build/web/ImageManipulatorContext.web.d.ts diff --git a/patches/expo-location/details.md b/patches/expo-location/details.md deleted file mode 100644 index d6bcf807f260..000000000000 --- a/patches/expo-location/details.md +++ /dev/null @@ -1,48 +0,0 @@ -# `expo-location` patches - -### [expo-location+57.0.6+001+guard-failed-last-location-task.patch](expo-location+57.0.6+001+guard-failed-last-location-task.patch) - -- Reason: - - ``` - Fixes a fatal Android crash when the user revokes the location permission while a GPS distance - trip is being tracked and then returns to the app. - - Trigger: the app registers a background location task (`background-location-tracking`) via - `Location.startLocationUpdatesAsync` for GPS distance tracking. Android keeps delivering - location broadcasts to `LocationTaskConsumer.didReceiveBroadcast` after the permission is - revoked. When a broadcast carries no `LocationResult`, the consumer falls back to querying - `mLocationClient.lastLocation`, which now fails with a `SecurityException`. - - Root cause: `didReceiveBroadcast` reads `task.result` inside an `addOnCompleteListener` - callback. `task.result` calls `getResult()`, which rethrows the task's failure as a - `RuntimeExecutionException`. The callback runs asynchronously on the main looper, long after - the enclosing `try` block has returned, so the surrounding `catch (e: SecurityException)` can - never catch it and the exception reaches the main thread unhandled: - - FATAL EXCEPTION: main - com.google.android.gms.tasks.RuntimeExecutionException: java.lang.SecurityException: - uid 10845 does not have any of [ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION]. - at com.google.android.gms.tasks.zzw.getResult(...) - at expo.modules.location.taskConsumers.LocationTaskConsumer.didReceiveBroadcast$lambda$2 - - Nothing on the JS side can prevent this, because the broadcast is delivered to the native - receiver independently of JS and keeps arriving after location updates are declined. - - Patch: check `task.isSuccessful` and bail out with a log line before reading `task.result`. - The existing outer `try/catch` is kept, because `lastLocation` can also throw synchronously. - - Note: `expo-location` ships a prebuilt AAR (see the `publication` entry in its - `expo-module.config.json`), so this source patch only takes effect because `expo-location` was - added to `expo.autolinking.android.buildFromSource` in `package.json`. Do not remove it there - while this patch exists, or the crash silently comes back. - ``` - -- Upstream PR/issue: None. Expo's bug tracker requires a standalone minimal reproduction, and the - faulty branch is only reached by a post-revocation location broadcast that carries no - `LocationResult`. We could not synthesize such a broadcast outside the app, so there is no report - we could file that Expo would accept. The bug is still unpatched on Expo `main`, `sdk-57` and - `expo-location@57.0.15`, so upgrading does not remove the need for this patch — it must stay until - the upstream code changes. -- E/App issue: https://github.com/Expensify/App/issues/99183 -- PR introducing patch: https://github.com/Expensify/App/pull/101091 diff --git a/patches/expo-location/expo-location+57.0.6+001+guard-failed-last-location-task.patch b/patches/expo-location/expo-location+57.0.6+001+guard-failed-last-location-task.patch deleted file mode 100644 index 13a85e2b3809..000000000000 --- a/patches/expo-location/expo-location+57.0.6+001+guard-failed-last-location-task.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/node_modules/expo-location/android/src/main/java/expo/modules/location/taskConsumers/LocationTaskConsumer.kt b/node_modules/expo-location/android/src/main/java/expo/modules/location/taskConsumers/LocationTaskConsumer.kt -index b4f6c06..daf10e4 100644 ---- a/node_modules/expo-location/android/src/main/java/expo/modules/location/taskConsumers/LocationTaskConsumer.kt -+++ b/node_modules/expo-location/android/src/main/java/expo/modules/location/taskConsumers/LocationTaskConsumer.kt -@@ -86,6 +86,12 @@ override fun didReceiveBroadcast(intent: Intent) { - } else { - try { - mLocationClient.lastLocation.addOnCompleteListener { task -> -+ // `task.result` rethrows a failed task's exception as a `RuntimeExecutionException`, and -+ // this listener runs after the enclosing `try` returned, so the `catch` never sees it. -+ if (!task.isSuccessful) { -+ Log.e(TAG, "Cannot get last location: " + task.exception?.message) -+ return@addOnCompleteListener -+ } - task.result?.let { handleLocationUpdate(listOf(it)) } - } - } catch (e: SecurityException) { diff --git a/patches/expo-modules-core/details.md b/patches/expo-modules-core/details.md index 0ad1cb38f52e..235fd3f530ba 100644 --- a/patches/expo-modules-core/details.md +++ b/patches/expo-modules-core/details.md @@ -1,6 +1,6 @@ # `expo-modules-core` patches -### [expo-modules-core+57.0.15+001+disableViewRecycling.patch](expo-modules-core+57.0.15+001+disableViewRecycling.patch) +### [expo-modules-core+58.0.29+001+disableViewRecycling.patch](expo-modules-core+58.0.29+001+disableViewRecycling.patch) - Reason: Opt-out from RN Fabric view recycling - Upstream PR/issue: https://expo.canny.io/feature-requests/p/opt-out-of-react-native-fabric-view-recycling-for-expofabricviewobjc diff --git a/patches/expo-modules-core/expo-modules-core+57.0.15+001+disableViewRecycling.patch b/patches/expo-modules-core/expo-modules-core+58.0.29+001+disableViewRecycling.patch similarity index 100% rename from patches/expo-modules-core/expo-modules-core+57.0.15+001+disableViewRecycling.patch rename to patches/expo-modules-core/expo-modules-core+58.0.29+001+disableViewRecycling.patch diff --git a/patches/expo-task-manager/details.md b/patches/expo-task-manager/details.md index 321374957165..2e6d67345506 100644 --- a/patches/expo-task-manager/details.md +++ b/patches/expo-task-manager/details.md @@ -1,6 +1,6 @@ # `expo-task-manager` patches -### [expo-task-manager+57.0.6+001+guard-null-headless-loader.patch](expo-task-manager+57.0.6+001+guard-null-headless-loader.patch) +### [expo-task-manager+58.0.12+001+guard-null-headless-loader.patch](expo-task-manager+58.0.12+001+guard-null-headless-loader.patch) - Reason: diff --git a/patches/expo-task-manager/expo-task-manager+57.0.6+001+guard-null-headless-loader.patch b/patches/expo-task-manager/expo-task-manager+58.0.12+001+guard-null-headless-loader.patch similarity index 84% rename from patches/expo-task-manager/expo-task-manager+57.0.6+001+guard-null-headless-loader.patch rename to patches/expo-task-manager/expo-task-manager+58.0.12+001+guard-null-headless-loader.patch index b4c347f31664..2e86eb31624d 100644 --- a/patches/expo-task-manager/expo-task-manager+57.0.6+001+guard-null-headless-loader.patch +++ b/patches/expo-task-manager/expo-task-manager+58.0.12+001+guard-null-headless-loader.patch @@ -1,8 +1,8 @@ -diff --git a/node_modules/expo-task-manager/android/src/main/java/expo/modules/taskManager/TaskService.java b/node_modules/expo-task-manager/android/src/main/java/expo/modules/taskManager/TaskService.java -index 44cd804..bb508ac 100644 ---- a/node_modules/expo-task-manager/android/src/main/java/expo/modules/taskManager/TaskService.java -+++ b/node_modules/expo-task-manager/android/src/main/java/expo/modules/taskManager/TaskService.java -@@ -423,7 +423,19 @@ public class TaskService implements SingletonModule, TaskServiceInterface { +diff --git a/node_modules/expo-task-manager/android/src/main/java/expo/modules/taskmanager/TaskService.java b/node_modules/expo-task-manager/android/src/main/java/expo/modules/taskmanager/TaskService.java +index 94e95b2..bba2fd7 100644 +--- a/node_modules/expo-task-manager/android/src/main/java/expo/modules/taskmanager/TaskService.java ++++ b/node_modules/expo-task-manager/android/src/main/java/expo/modules/taskmanager/TaskService.java +@@ -424,7 +424,19 @@ public class TaskService implements SingletonModule, TaskServiceInterface { } mTasksAndEventsRepository.putEventForAppScopeKey(appScopeKey, body); @@ -23,7 +23,7 @@ index 44cd804..bb508ac 100644 new HeadlessAppLoader.Params(appScopeKey, task.getAppUrl()), () -> { }, -@@ -443,8 +455,12 @@ public class TaskService implements SingletonModule, TaskServiceInterface { +@@ -444,8 +456,12 @@ public class TaskService implements SingletonModule, TaskServiceInterface { //region helpers private HeadlessAppLoader getAppLoader() { diff --git a/patches/expo-video/details.md b/patches/expo-video/details.md index 8f6351c93dad..1f58b516cc49 100644 --- a/patches/expo-video/details.md +++ b/patches/expo-video/details.md @@ -1,10 +1,10 @@ # `expo-video` patches -### [expo-video+57.0.2+001+catch_play_abort_error.patch](expo-video+57.0.2+001+catch_play_abort_error.patch) +### [expo-video+58.0.11+001+catch_play_abort_error.patch](expo-video+58.0.11+001+catch_play_abort_error.patch) - Reason: When rapidly seeking a video via the progress bar on web, `HTMLVideoElement.play()` returns a Promise that gets rejected with `AbortError` if `pause()` is called before it resolves. This patch wraps all 5 `video.play()` call sites in `VideoPlayer.web.js` with `.catch()` to silently swallow `AbortError` while re-throwing any other errors. This is the [standard fix recommended by Chrome](https://developer.chrome.com/blog/play-request-was-interrupted). -### [expo-video+57.0.2+002+web-videoview-types.patch](expo-video+57.0.2+002+web-videoview-types.patch) +### [expo-video+58.0.11+002+web-videoview-types.patch](expo-video+58.0.11+002+web-videoview-types.patch) - Reason: diff --git a/patches/expo-video/expo-video+57.0.2+001+catch_play_abort_error.patch b/patches/expo-video/expo-video+58.0.11+001+catch_play_abort_error.patch similarity index 71% rename from patches/expo-video/expo-video+57.0.2+001+catch_play_abort_error.patch rename to patches/expo-video/expo-video+58.0.11+001+catch_play_abort_error.patch index 2cd92c9cf0fb..c0fecc1b0363 100644 --- a/patches/expo-video/expo-video+57.0.2+001+catch_play_abort_error.patch +++ b/patches/expo-video/expo-video+58.0.11+001+catch_play_abort_error.patch @@ -1,46 +1,46 @@ diff --git a/node_modules/expo-video/build/VideoPlayer.web.js b/node_modules/expo-video/build/VideoPlayer.web.js -index 46dfa83..f9319cf 100644 +index de8d390..c78a543 100644 --- a/node_modules/expo-video/build/VideoPlayer.web.js +++ b/node_modules/expo-video/build/VideoPlayer.web.js -@@ -228,7 +228,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { +@@ -259,7 +259,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { } play() { - this._mountedVideos.forEach((video) => { + this._mountedVideos.forEach((video)=>{ - video.play(); + video.play()?.catch((e) => { if (e.name !== 'AbortError') throw e; }); }); } pause() { -@@ -243,7 +243,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { +@@ -274,7 +274,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { if (uri) { video.setAttribute('src', uri); video.load(); - video.play(); + video.play()?.catch((e) => { if (e.name !== 'AbortError') throw e; }); - } - else { + } else { video.removeAttribute('src'); -@@ -268,7 +268,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { + video.load(); +@@ -298,7 +298,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { replay() { - this._mountedVideos.forEach((video) => { + this._mountedVideos.forEach((video)=>{ video.currentTime = 0; - video.play(); + video.play()?.catch((e) => { if (e.name !== 'AbortError') throw e; }); }); this.playing = true; } -@@ -283,7 +283,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { +@@ -313,7 +313,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { + if (firstVideo.paused) { video.pause(); - } - else { + } else { - video.play(); + video.play()?.catch((e) => { if (e.name !== 'AbortError') throw e; }); } video.currentTime = firstVideo.currentTime; video.volume = firstVideo.volume; -@@ -309,7 +309,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { +@@ -340,7 +340,7 @@ export default class VideoPlayerWeb extends globalThis.expo.SharedObject { this.playing = true; - this._mountedVideos.forEach((mountedVideo) => { + this._mountedVideos.forEach((mountedVideo)=>{ if (e.target !== mountedVideo) { - mountedVideo.play(); + mountedVideo.play()?.catch((err) => { if (err.name !== 'AbortError') throw err; }); diff --git a/patches/expo-video/expo-video+57.0.2+002+web-videoview-types.patch b/patches/expo-video/expo-video+58.0.11+002+web-videoview-types.patch similarity index 88% rename from patches/expo-video/expo-video+57.0.2+002+web-videoview-types.patch rename to patches/expo-video/expo-video+58.0.11+002+web-videoview-types.patch index 6095cd1fae60..abf71dc38dc3 100644 --- a/patches/expo-video/expo-video+57.0.2+002+web-videoview-types.patch +++ b/patches/expo-video/expo-video+58.0.11+002+web-videoview-types.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/expo-video/build/VideoView.web.d.ts b/node_modules/expo-video/build/VideoView.web.d.ts -index 55c6d82..48eda21 100644 +index 3eaad11..837e0ac 100644 --- a/node_modules/expo-video/build/VideoView.web.d.ts +++ b/node_modules/expo-video/build/VideoView.web.d.ts -@@ -1,9 +1,16 @@ +@@ -1,8 +1,15 @@ import React from 'react'; -import type VideoPlayer from './VideoPlayer.web'; +import type { VideoPlayer } from './VideoPlayer.types'; @@ -20,5 +20,3 @@ index 55c6d82..48eda21 100644 -} & VideoViewProps & React.RefAttributes>; +} & VideoViewProps & React.RefAttributes>; export default VideoView; - //# sourceMappingURL=VideoView.web.d.ts.map -\ No newline at end of file diff --git a/patches/metro-runtime/details.md b/patches/metro-runtime/details.md index b727f4796058..de4873b523d7 100644 --- a/patches/metro-runtime/details.md +++ b/patches/metro-runtime/details.md @@ -1,6 +1,6 @@ # `metro-runtime` patches -### [metro-runtime+0.84.5.patch](metro-runtime+0.84.5.patch) +### [metro-runtime+0.87.1.patch](metro-runtime+0.87.1.patch) - Reason: During Fast Refresh, `metro-runtime`'s `HMRClient.inject()` only re-evaluated the updated module on the main JS runtime, so the worklet runtime kept executing stale code after a hot reload. The patch forwards the incoming module `code`/`sourceURL` to `global.__workletsModuleProxy.propagateModuleUpdate()` (when available) before the normal eval, letting `react-native-worklets` update its own copy of the module so worklets pick up HMR changes. - Upstream PR/issue: 🛑 diff --git a/patches/metro-runtime/metro-runtime+0.84.5.patch b/patches/metro-runtime/metro-runtime+0.87.1.patch similarity index 100% rename from patches/metro-runtime/metro-runtime+0.84.5.patch rename to patches/metro-runtime/metro-runtime+0.87.1.patch diff --git a/patches/react-native-advanced-input-mask/details.md b/patches/react-native-advanced-input-mask/details.md new file mode 100644 index 000000000000..4444febd009b --- /dev/null +++ b/patches/react-native-advanced-input-mask/details.md @@ -0,0 +1,15 @@ +# `react-native-advanced-input-mask` patches + +### [react-native-advanced-input-mask+1.4.6+001+rn088-remove-RCTBaseTextInputView-import.patch](react-native-advanced-input-mask+1.4.6+001+rn088-remove-RCTBaseTextInputView-import.patch) + +- Reason: + + ``` + React Native 0.87 removed the Paper text-input views from React-Core, including the + `React/RCTBaseTextInputView.h` header. The Swift bridging header imports it without using it, so the + iOS build fails on RN 0.87+. Dropping the unused import is enough. + ``` + +- Upstream PR/issue: https://github.com/IvanIhnatsiuk/react-native-advanced-input-mask/pull/155 (same change, open). +- E/App issue: https://github.com/Expensify/App/issues/101427 +- PR introducing patch: https://github.com/Expensify/App/pull/101739 diff --git a/patches/react-native-advanced-input-mask/react-native-advanced-input-mask+1.4.6+001+rn088-remove-RCTBaseTextInputView-import.patch b/patches/react-native-advanced-input-mask/react-native-advanced-input-mask+1.4.6+001+rn088-remove-RCTBaseTextInputView-import.patch new file mode 100644 index 000000000000..dcb950c34541 --- /dev/null +++ b/patches/react-native-advanced-input-mask/react-native-advanced-input-mask+1.4.6+001+rn088-remove-RCTBaseTextInputView-import.patch @@ -0,0 +1,9 @@ +diff --git a/node_modules/react-native-advanced-input-mask/ios/MaskedTextInput-Bridging-Header.h b/node_modules/react-native-advanced-input-mask/ios/MaskedTextInput-Bridging-Header.h +--- a/node_modules/react-native-advanced-input-mask/ios/MaskedTextInput-Bridging-Header.h ++++ b/node_modules/react-native-advanced-input-mask/ios/MaskedTextInput-Bridging-Header.h +@@ -1,5 +1,4 @@ + #import +-#import + #import + #import + #import diff --git a/patches/react-native-draggable-flatlist/details.md b/patches/react-native-draggable-flatlist/details.md index 0f72087f6309..6c055f531720 100644 --- a/patches/react-native-draggable-flatlist/details.md +++ b/patches/react-native-draggable-flatlist/details.md @@ -22,3 +22,11 @@ - Upstream PR/issue: https://github.com/computerjazz/react-native-draggable-flatlist/issues/509 - E/App issue: [#87362](https://github.com/Expensify/App/issues/87362) - PR Introducing Patch: [#90617](https://github.com/Expensify/App/pull/90617) + + +### [react-native-draggable-flatlist+4.0.3+004+replace-removed-InteractionManager.patch](react-native-draggable-flatlist+4.0.3+004+replace-removed-InteractionManager.patch) + +- Reason: React Native 0.87 removed `InteractionManager`. In dev builds, reading it from `react-native` throws an invariant, and in release builds it is `undefined`. `DraggableFlatList` calls `InteractionManager.runAfterInteractions(reset)` during render whenever the keys in `data` change, for example when the Columns search filters the list or when a waypoint is added or removed. The render throws, React recovers by rendering again synchronously, and `reset()` never runs, so the drag state is not cleared. The patch defers `reset()` with `requestAnimationFrame` instead, as the upstream fix does. It changes `src/`, which the app bundle uses through the `react-native` field, and `lib/commonjs/`, which Jest uses through `main`. +- Upstream PR/issue: https://github.com/computerjazz/react-native-draggable-flatlist/pull/628 (fixes https://github.com/computerjazz/react-native-draggable-flatlist/issues/627) +- E/App issue: https://github.com/Expensify/App/issues/101427 +- PR Introducing Patch: [#101739](https://github.com/Expensify/App/pull/101739) diff --git a/patches/react-native-draggable-flatlist/react-native-draggable-flatlist+4.0.3+004+replace-removed-InteractionManager.patch b/patches/react-native-draggable-flatlist/react-native-draggable-flatlist+4.0.3+004+replace-removed-InteractionManager.patch new file mode 100644 index 000000000000..f7157f0eaca1 --- /dev/null +++ b/patches/react-native-draggable-flatlist/react-native-draggable-flatlist+4.0.3+004+replace-removed-InteractionManager.patch @@ -0,0 +1,36 @@ +diff --git a/node_modules/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx b/node_modules/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx +index 260a524..422ea21 100644 +--- a/node_modules/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx ++++ b/node_modules/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx +@@ -6,12 +6,7 @@ import React, { + useRef, + useState, + } from "react"; +-import { +- ListRenderItem, +- FlatListProps, +- LayoutChangeEvent, +- InteractionManager, +-} from "react-native"; ++import { ListRenderItem, FlatListProps, LayoutChangeEvent } from "react-native"; + import { + FlatList, + Gesture, +@@ -120,7 +115,7 @@ function DraggableFlatListInner({ListFooterComponent, ...props}: DraggableFla + if (dataHasChanged) { + // When data changes make sure `activeKey` is nulled out in the same render pass + activeKey = null; +- InteractionManager.runAfterInteractions(() => { ++ requestAnimationFrame(() => { + reset(); + }); + } +diff --git a/node_modules/react-native-draggable-flatlist/lib/commonjs/components/DraggableFlatList.js b/node_modules/react-native-draggable-flatlist/lib/commonjs/components/DraggableFlatList.js +index 94b6623..564d223 100644 +--- a/node_modules/react-native-draggable-flatlist/lib/commonjs/components/DraggableFlatList.js ++++ b/node_modules/react-native-draggable-flatlist/lib/commonjs/components/DraggableFlatList.js +@@ -1,2 +1,2 @@ +-var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _reactNativeGestureHandler=require("react-native-gesture-handler");var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _CellRendererComponent=_interopRequireDefault(require("./CellRendererComponent"));var _constants=require("../constants");var _PlaceholderItem=_interopRequireDefault(require("./PlaceholderItem"));var _RowItem=_interopRequireDefault(require("./RowItem"));var _propsContext=_interopRequireDefault(require("../context/propsContext"));var _animatedValueContext=_interopRequireWildcard(require("../context/animatedValueContext"));var _refContext=_interopRequireWildcard(require("../context/refContext"));var _draggableFlatListContext=_interopRequireDefault(require("../context/draggableFlatListContext"));var _useAutoScroll=require("../hooks/useAutoScroll");var _useStableCallback=require("../hooks/useStableCallback");var _ScrollOffsetListener=_interopRequireDefault(require("./ScrollOffsetListener"));var _utils=require("../utils");var _jsxFileName="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var AnimatedFlatList=_reactNativeReanimated.default.createAnimatedComponent(_reactNativeGestureHandler.FlatList);function DraggableFlatListInner(props){var _this=this;var _useRefs=(0,_refContext.useRefs)(),cellDataRef=_useRefs.cellDataRef,containerRef=_useRefs.containerRef,flatlistRef=_useRefs.flatlistRef,keyToIndexRef=_useRefs.keyToIndexRef,propsRef=_useRefs.propsRef,animationConfigRef=_useRefs.animationConfigRef;var _useAnimatedValues=(0,_animatedValueContext.useAnimatedValues)(),activeCellOffset=_useAnimatedValues.activeCellOffset,activeCellSize=_useAnimatedValues.activeCellSize,activeIndexAnim=_useAnimatedValues.activeIndexAnim,containerSize=_useAnimatedValues.containerSize,scrollOffset=_useAnimatedValues.scrollOffset,scrollViewSize=_useAnimatedValues.scrollViewSize,spacerIndexAnim=_useAnimatedValues.spacerIndexAnim,horizontalAnim=_useAnimatedValues.horizontalAnim,placeholderOffset=_useAnimatedValues.placeholderOffset,touchTranslate=_useAnimatedValues.touchTranslate,autoScrollDistance=_useAnimatedValues.autoScrollDistance,panGestureState=_useAnimatedValues.panGestureState,isTouchActiveNative=_useAnimatedValues.isTouchActiveNative,viewableIndexMin=_useAnimatedValues.viewableIndexMin,viewableIndexMax=_useAnimatedValues.viewableIndexMax,disabled=_useAnimatedValues.disabled;var reset=(0,_useStableCallback.useStableCallback)(function(){activeIndexAnim.value=-1;spacerIndexAnim.value=-1;touchTranslate.value=0;activeCellSize.value=-1;activeCellOffset.value=-1;setActiveKey(null);});var _props$dragHitSlop=props.dragHitSlop,dragHitSlop=_props$dragHitSlop===void 0?_constants.DEFAULT_PROPS.dragHitSlop:_props$dragHitSlop,_props$scrollEnabled=props.scrollEnabled,scrollEnabled=_props$scrollEnabled===void 0?_constants.DEFAULT_PROPS.scrollEnabled:_props$scrollEnabled,_props$activationDist=props.activationDistance,activationDistanceProp=_props$activationDist===void 0?_constants.DEFAULT_PROPS.activationDistance:_props$activationDist;var _useState=(0,_react.useState)(null),_useState2=(0,_slicedToArray2.default)(_useState,2),activeKey=_useState2[0],setActiveKey=_useState2[1];var _useState3=(0,_react.useState)(!propsRef.current.enableLayoutAnimationExperimental),_useState4=(0,_slicedToArray2.default)(_useState3,2),layoutAnimationDisabled=_useState4[0],setLayoutAnimationDisabled=_useState4[1];var keyExtractor=(0,_useStableCallback.useStableCallback)(function(item,index){if(!props.keyExtractor){throw new Error("You must provide a keyExtractor to DraggableFlatList");}return props.keyExtractor(item,index);});var dataRef=(0,_react.useRef)(props.data);var dataHasChanged=dataRef.current.map(keyExtractor).join("")!==props.data.map(keyExtractor).join("");dataRef.current=props.data;if(dataHasChanged){activeKey=null;_reactNative.InteractionManager.runAfterInteractions(function(){reset();});}(0,_react.useEffect)(function(){if(!propsRef.current.enableLayoutAnimationExperimental)return;if(activeKey){setLayoutAnimationDisabled(true);}else{setTimeout(function(){setLayoutAnimationDisabled(false);},100);}},[activeKey]);(0,_react.useLayoutEffect)(function(){props.data.forEach(function(d,i){var key=keyExtractor(d,i);keyToIndexRef.current.set(key,i);});},[props.data,keyExtractor,keyToIndexRef]);var drag=(0,_useStableCallback.useStableCallback)(function(activeKey){if(disabled.value)return;var index=keyToIndexRef.current.get(activeKey);var cellData=cellDataRef.current.get(activeKey);if(cellData){activeCellOffset.value=cellData.measurements.offset;activeCellSize.value=cellData.measurements.size;}var onDragBegin=propsRef.current.onDragBegin;if(index!==undefined){spacerIndexAnim.value=index;activeIndexAnim.value=index;setActiveKey(activeKey);onDragBegin==null?void 0:onDragBegin(index);}});var onContainerLayout=function onContainerLayout(_ref){var layout=_ref.nativeEvent.layout;var width=layout.width,height=layout.height;containerSize.value=props.horizontal?width:height;props.onContainerLayout==null?void 0:props.onContainerLayout({layout:layout,containerRef:containerRef});};var onListContentSizeChange=function onListContentSizeChange(w,h){scrollViewSize.value=props.horizontal?w:h;props.onContentSizeChange==null?void 0:props.onContentSizeChange(w,h);};var onContainerTouchStart=function onContainerTouchStart(){if(!disabled.value){isTouchActiveNative.value=true;}return false;};var onContainerTouchEnd=function onContainerTouchEnd(){isTouchActiveNative.value=false;};var extraData=(0,_react.useMemo)(function(){return{activeKey:activeKey,extraData:props.extraData};},[activeKey,props.extraData]);var renderItem=(0,_react.useCallback)(function(_ref2){var item=_ref2.item,index=_ref2.index;var key=keyExtractor(item,index);if(index!==keyToIndexRef.current.get(key)){keyToIndexRef.current.set(key,index);}return _react.default.createElement(_RowItem.default,{item:item,itemKey:key,renderItem:props.renderItem,drag:drag,extraData:props.extraData,__self:_this,__source:{fileName:_jsxFileName,lineNumber:205,columnNumber:9}});},[props.renderItem,props.extraData,drag,keyExtractor]);var onRelease=(0,_useStableCallback.useStableCallback)(function(index){props.onRelease==null?void 0:props.onRelease(index);});var onDragEnd=(0,_useStableCallback.useStableCallback)(function(_ref3){var from=_ref3.from,to=_ref3.to;var onDragEnd=props.onDragEnd,data=props.data;var newData=(0,_toConsumableArray2.default)(data);if(from!==to){newData.splice(from,1);newData.splice(to,0,data[from]);}onDragEnd==null?void 0:onDragEnd({from:from,to:to,data:newData});setActiveKey(null);});var onPlaceholderIndexChange=(0,_useStableCallback.useStableCallback)(function(index){props.onPlaceholderIndexChange==null?void 0:props.onPlaceholderIndexChange(index);});(0,_reactNativeReanimated.useAnimatedReaction)(function(){var _f=function _f(){return isTouchActiveNative.value;};_f._closure={isTouchActiveNative:isTouchActiveNative};_f.asString="function _f(){const{isTouchActiveNative}=jsThis._closure;{return isTouchActiveNative.value;}}";_f.__workletHash=14702024657843;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (243:4)";return _f;}(),function(){var _f=function _f(cur,prev){if(cur!==prev&&!cur){var hasMoved=!!touchTranslate.value;if(!hasMoved&&activeIndexAnim.value>=0&&!disabled.value){(0,_reactNativeReanimated.runOnJS)(onRelease)(activeIndexAnim.value);(0,_reactNativeReanimated.runOnJS)(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});}}};_f._closure={touchTranslate:touchTranslate,activeIndexAnim:activeIndexAnim,disabled:disabled,runOnJS:_reactNativeReanimated.runOnJS,onRelease:onRelease,onDragEnd:onDragEnd,spacerIndexAnim:spacerIndexAnim};_f.asString="function _f(cur,prev){const{touchTranslate,activeIndexAnim,disabled,runOnJS,onRelease,onDragEnd,spacerIndexAnim}=jsThis._closure;{if(cur!==prev&&!cur){const hasMoved=!!touchTranslate.value;if(!hasMoved&&activeIndexAnim.value>=0&&!disabled.value){runOnJS(onRelease)(activeIndexAnim.value);runOnJS(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});}}}}";_f.__workletHash=5951241873481;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (246:4)";return _f;}(),[isTouchActiveNative,onDragEnd,onRelease]);(0,_reactNativeReanimated.useAnimatedReaction)(function(){var _f=function _f(){return spacerIndexAnim.value;};_f._closure={spacerIndexAnim:spacerIndexAnim};_f.asString="function _f(){const{spacerIndexAnim}=jsThis._closure;{return spacerIndexAnim.value;}}";_f.__workletHash=2960108028947;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (262:4)";return _f;}(),function(){var _f=function _f(cur,prev){if(prev!==null&&cur!==prev&&cur>=0&&prev>=0){(0,_reactNativeReanimated.runOnJS)(onPlaceholderIndexChange)(cur);}};_f._closure={runOnJS:_reactNativeReanimated.runOnJS,onPlaceholderIndexChange:onPlaceholderIndexChange};_f.asString="function _f(cur,prev){const{runOnJS,onPlaceholderIndexChange}=jsThis._closure;{if(prev!==null&&cur!==prev&&cur>=0&&prev>=0){runOnJS(onPlaceholderIndexChange)(cur);}}}";_f.__workletHash=16965253726735;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (265:4)";return _f;}(),[spacerIndexAnim]);var gestureDisabled=(0,_reactNativeReanimated.useSharedValue)(false);var panGesture=_reactNativeGestureHandler.Gesture.Pan().onBegin(function(){var _f=function _f(evt){gestureDisabled.value=disabled.value;if(gestureDisabled.value)return;panGestureState.value=evt.state;};_f._closure={gestureDisabled:gestureDisabled,disabled:disabled,panGestureState:panGestureState};_f.asString="function _f(evt){const{gestureDisabled,disabled,panGestureState}=jsThis._closure;{gestureDisabled.value=disabled.value;if(gestureDisabled.value)return;panGestureState.value=evt.state;}}";_f.__workletHash=17574034116918;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (276:13)";return _f;}()).onUpdate(function(){var _f=function _f(evt){if(gestureDisabled.value)return;panGestureState.value=evt.state;var translation=horizontalAnim.value?evt.translationX:evt.translationY;touchTranslate.value=translation;};_f._closure={gestureDisabled:gestureDisabled,panGestureState:panGestureState,horizontalAnim:horizontalAnim,touchTranslate:touchTranslate};_f.asString="function _f(evt){const{gestureDisabled,panGestureState,horizontalAnim,touchTranslate}=jsThis._closure;{if(gestureDisabled.value)return;panGestureState.value=evt.state;const translation=horizontalAnim.value?evt.translationX:evt.translationY;touchTranslate.value=translation;}}";_f.__workletHash=5455568984874;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (281:14)";return _f;}()).onEnd(function(){var _f=function _f(evt){if(gestureDisabled.value)return;isTouchActiveNative.value=false;var translation=horizontalAnim.value?evt.translationX:evt.translationY;touchTranslate.value=translation+autoScrollDistance.value;panGestureState.value=evt.state;if(activeIndexAnim.value===-1||disabled.value)return;disabled.value=true;(0,_reactNativeReanimated.runOnJS)(onRelease)(activeIndexAnim.value);var springTo=placeholderOffset.value-activeCellOffset.value;touchTranslate.value=(0,_reactNativeReanimated.withSpring)(springTo,animationConfigRef.value,function(){var _f=function _f(){(0,_reactNativeReanimated.runOnJS)(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});disabled.value=false;};_f._closure={runOnJS:_reactNativeReanimated.runOnJS,onDragEnd:onDragEnd,activeIndexAnim:activeIndexAnim,spacerIndexAnim:spacerIndexAnim,disabled:disabled};_f.asString="function _f(){const{runOnJS,onDragEnd,activeIndexAnim,spacerIndexAnim,disabled}=jsThis._closure;{runOnJS(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});disabled.value=false;}}";_f.__workletHash=1618704508901;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (308:8)";return _f;}());};_f._closure={gestureDisabled:gestureDisabled,isTouchActiveNative:isTouchActiveNative,horizontalAnim:horizontalAnim,touchTranslate:touchTranslate,autoScrollDistance:autoScrollDistance,panGestureState:panGestureState,activeIndexAnim:activeIndexAnim,disabled:disabled,runOnJS:_reactNativeReanimated.runOnJS,onRelease:onRelease,placeholderOffset:placeholderOffset,activeCellOffset:activeCellOffset,withSpring:_reactNativeReanimated.withSpring,animationConfigRef:animationConfigRef,onDragEnd:onDragEnd,spacerIndexAnim:spacerIndexAnim};_f.asString="function _f(evt){const{gestureDisabled,isTouchActiveNative,horizontalAnim,touchTranslate,autoScrollDistance,panGestureState,activeIndexAnim,disabled,runOnJS,onRelease,placeholderOffset,activeCellOffset,withSpring,animationConfigRef,onDragEnd,spacerIndexAnim}=jsThis._closure;{if(gestureDisabled.value)return;isTouchActiveNative.value=false;const translation=horizontalAnim.value?evt.translationX:evt.translationY;touchTranslate.value=translation+autoScrollDistance.value;panGestureState.value=evt.state;if(activeIndexAnim.value===-1||disabled.value)return;disabled.value=true;runOnJS(onRelease)(activeIndexAnim.value);const springTo=placeholderOffset.value-activeCellOffset.value;touchTranslate.value=withSpring(springTo,animationConfigRef.value,function(){runOnJS(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});disabled.value=false;});}}";_f.__workletHash=7842863214419;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (289:11)";return _f;}()).onTouchesDown(function(){var _f=function _f(){(0,_reactNativeReanimated.runOnJS)(onContainerTouchStart)();};_f._closure={runOnJS:_reactNativeReanimated.runOnJS,onContainerTouchStart:onContainerTouchStart};_f.asString="function _f(){const{runOnJS,onContainerTouchStart}=jsThis._closure;{runOnJS(onContainerTouchStart)();}}";_f.__workletHash=4756906064016;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (317:19)";return _f;}()).onTouchesUp(function(){var _f=function _f(){(0,_reactNativeReanimated.runOnJS)(onContainerTouchEnd)();};_f._closure={runOnJS:_reactNativeReanimated.runOnJS,onContainerTouchEnd:onContainerTouchEnd};_f.asString="function _f(){const{runOnJS,onContainerTouchEnd}=jsThis._closure;{runOnJS(onContainerTouchEnd)();}}";_f.__workletHash=9596402198608;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (320:17)";return _f;}());if(dragHitSlop)panGesture.hitSlop(dragHitSlop);if(activationDistanceProp){var activeOffset=[-activationDistanceProp,activationDistanceProp];if(props.horizontal){panGesture.activeOffsetX(activeOffset);}else{panGesture.activeOffsetY(activeOffset);}}var onScroll=(0,_useStableCallback.useStableCallback)(function(scrollOffset){props.onScrollOffsetChange==null?void 0:props.onScrollOffsetChange(scrollOffset);});var scrollHandler=(0,_reactNativeReanimated.useAnimatedScrollHandler)({onScroll:function(){var _f=function _f(evt){scrollOffset.value=horizontalAnim.value?evt.contentOffset.x:evt.contentOffset.y;(0,_reactNativeReanimated.runOnJS)(onScroll)(scrollOffset.value);};_f._closure={scrollOffset:scrollOffset,horizontalAnim:horizontalAnim,runOnJS:_reactNativeReanimated.runOnJS,onScroll:onScroll};_f.asString="function _f(evt){const{scrollOffset,horizontalAnim,runOnJS,onScroll}=jsThis._closure;{scrollOffset.value=horizontalAnim.value?evt.contentOffset.x:evt.contentOffset.y;runOnJS(onScroll)(scrollOffset.value);}}";_f.__workletHash=5653789960368;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (342:16)";return _f;}()},[horizontalAnim]);(0,_useAutoScroll.useAutoScroll)();var onViewableItemsChanged=(0,_useStableCallback.useStableCallback)(function(info){var viewableIndices=info.viewableItems.filter(function(item){return item.isViewable;}).map(function(item){return item.index;}).filter(function(index){return typeof index==="number";});var min=Math.min.apply(Math,(0,_toConsumableArray2.default)(viewableIndices));var max=Math.max.apply(Math,(0,_toConsumableArray2.default)(viewableIndices));viewableIndexMin.value=min;viewableIndexMax.value=max;props.onViewableItemsChanged==null?void 0:props.onViewableItemsChanged(info);});return _react.default.createElement(_draggableFlatListContext.default,{activeKey:activeKey,keyExtractor:keyExtractor,horizontal:!!props.horizontal,layoutAnimationDisabled:layoutAnimationDisabled,__self:this,__source:{fileName:_jsxFileName,lineNumber:370,columnNumber:5}},_react.default.createElement(_reactNativeGestureHandler.GestureDetector,{gesture:panGesture,__self:this,__source:{fileName:_jsxFileName,lineNumber:376,columnNumber:7}},_react.default.createElement(_reactNativeReanimated.default.View,{style:props.containerStyle,ref:containerRef,onLayout:onContainerLayout,__self:this,__source:{fileName:_jsxFileName,lineNumber:377,columnNumber:9}},props.renderPlaceholder&&_react.default.createElement(_PlaceholderItem.default,{renderPlaceholder:props.renderPlaceholder,__self:this,__source:{fileName:_jsxFileName,lineNumber:383,columnNumber:13}}),_react.default.createElement(AnimatedFlatList,(0,_extends2.default)({},props,{data:props.data,onViewableItemsChanged:onViewableItemsChanged,CellRendererComponent:_CellRendererComponent.default,ref:flatlistRef,onContentSizeChange:onListContentSizeChange,scrollEnabled:!activeKey&&scrollEnabled,renderItem:renderItem,extraData:extraData,keyExtractor:keyExtractor,onScroll:scrollHandler,scrollEventThrottle:16,simultaneousHandlers:props.simultaneousHandlers,removeClippedSubviews:false,__self:this,__source:{fileName:_jsxFileName,lineNumber:385,columnNumber:11}})),!!props.onScrollOffsetChange&&_react.default.createElement(_ScrollOffsetListener.default,{onScrollOffsetChange:props.onScrollOffsetChange,scrollOffset:scrollOffset,__self:this,__source:{fileName:_jsxFileName,lineNumber:402,columnNumber:13}}))));}function DraggableFlatList(props,ref){return _react.default.createElement(_propsContext.default,(0,_extends2.default)({},props,{__self:this,__source:{fileName:_jsxFileName,lineNumber:418,columnNumber:5}}),_react.default.createElement(_animatedValueContext.default,{__self:this,__source:{fileName:_jsxFileName,lineNumber:419,columnNumber:7}},_react.default.createElement(_refContext.default,{flatListRef:ref,__self:this,__source:{fileName:_jsxFileName,lineNumber:420,columnNumber:9}},_react.default.createElement(MemoizedInner,(0,_extends2.default)({},props,{__self:this,__source:{fileName:_jsxFileName,lineNumber:421,columnNumber:11}})))));}var MemoizedInner=(0,_utils.typedMemo)(DraggableFlatListInner);var _default=_react.default.forwardRef(DraggableFlatList);exports.default=_default; ++var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _reactNativeGestureHandler=require("react-native-gesture-handler");var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _CellRendererComponent=_interopRequireDefault(require("./CellRendererComponent"));var _constants=require("../constants");var _PlaceholderItem=_interopRequireDefault(require("./PlaceholderItem"));var _RowItem=_interopRequireDefault(require("./RowItem"));var _propsContext=_interopRequireDefault(require("../context/propsContext"));var _animatedValueContext=_interopRequireWildcard(require("../context/animatedValueContext"));var _refContext=_interopRequireWildcard(require("../context/refContext"));var _draggableFlatListContext=_interopRequireDefault(require("../context/draggableFlatListContext"));var _useAutoScroll=require("../hooks/useAutoScroll");var _useStableCallback=require("../hooks/useStableCallback");var _ScrollOffsetListener=_interopRequireDefault(require("./ScrollOffsetListener"));var _utils=require("../utils");var _jsxFileName="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var AnimatedFlatList=_reactNativeReanimated.default.createAnimatedComponent(_reactNativeGestureHandler.FlatList);function DraggableFlatListInner(props){var _this=this;var _useRefs=(0,_refContext.useRefs)(),cellDataRef=_useRefs.cellDataRef,containerRef=_useRefs.containerRef,flatlistRef=_useRefs.flatlistRef,keyToIndexRef=_useRefs.keyToIndexRef,propsRef=_useRefs.propsRef,animationConfigRef=_useRefs.animationConfigRef;var _useAnimatedValues=(0,_animatedValueContext.useAnimatedValues)(),activeCellOffset=_useAnimatedValues.activeCellOffset,activeCellSize=_useAnimatedValues.activeCellSize,activeIndexAnim=_useAnimatedValues.activeIndexAnim,containerSize=_useAnimatedValues.containerSize,scrollOffset=_useAnimatedValues.scrollOffset,scrollViewSize=_useAnimatedValues.scrollViewSize,spacerIndexAnim=_useAnimatedValues.spacerIndexAnim,horizontalAnim=_useAnimatedValues.horizontalAnim,placeholderOffset=_useAnimatedValues.placeholderOffset,touchTranslate=_useAnimatedValues.touchTranslate,autoScrollDistance=_useAnimatedValues.autoScrollDistance,panGestureState=_useAnimatedValues.panGestureState,isTouchActiveNative=_useAnimatedValues.isTouchActiveNative,viewableIndexMin=_useAnimatedValues.viewableIndexMin,viewableIndexMax=_useAnimatedValues.viewableIndexMax,disabled=_useAnimatedValues.disabled;var reset=(0,_useStableCallback.useStableCallback)(function(){activeIndexAnim.value=-1;spacerIndexAnim.value=-1;touchTranslate.value=0;activeCellSize.value=-1;activeCellOffset.value=-1;setActiveKey(null);});var _props$dragHitSlop=props.dragHitSlop,dragHitSlop=_props$dragHitSlop===void 0?_constants.DEFAULT_PROPS.dragHitSlop:_props$dragHitSlop,_props$scrollEnabled=props.scrollEnabled,scrollEnabled=_props$scrollEnabled===void 0?_constants.DEFAULT_PROPS.scrollEnabled:_props$scrollEnabled,_props$activationDist=props.activationDistance,activationDistanceProp=_props$activationDist===void 0?_constants.DEFAULT_PROPS.activationDistance:_props$activationDist;var _useState=(0,_react.useState)(null),_useState2=(0,_slicedToArray2.default)(_useState,2),activeKey=_useState2[0],setActiveKey=_useState2[1];var _useState3=(0,_react.useState)(!propsRef.current.enableLayoutAnimationExperimental),_useState4=(0,_slicedToArray2.default)(_useState3,2),layoutAnimationDisabled=_useState4[0],setLayoutAnimationDisabled=_useState4[1];var keyExtractor=(0,_useStableCallback.useStableCallback)(function(item,index){if(!props.keyExtractor){throw new Error("You must provide a keyExtractor to DraggableFlatList");}return props.keyExtractor(item,index);});var dataRef=(0,_react.useRef)(props.data);var dataHasChanged=dataRef.current.map(keyExtractor).join("")!==props.data.map(keyExtractor).join("");dataRef.current=props.data;if(dataHasChanged){activeKey=null;requestAnimationFrame(function(){reset();});}(0,_react.useEffect)(function(){if(!propsRef.current.enableLayoutAnimationExperimental)return;if(activeKey){setLayoutAnimationDisabled(true);}else{setTimeout(function(){setLayoutAnimationDisabled(false);},100);}},[activeKey]);(0,_react.useLayoutEffect)(function(){props.data.forEach(function(d,i){var key=keyExtractor(d,i);keyToIndexRef.current.set(key,i);});},[props.data,keyExtractor,keyToIndexRef]);var drag=(0,_useStableCallback.useStableCallback)(function(activeKey){if(disabled.value)return;var index=keyToIndexRef.current.get(activeKey);var cellData=cellDataRef.current.get(activeKey);if(cellData){activeCellOffset.value=cellData.measurements.offset;activeCellSize.value=cellData.measurements.size;}var onDragBegin=propsRef.current.onDragBegin;if(index!==undefined){spacerIndexAnim.value=index;activeIndexAnim.value=index;setActiveKey(activeKey);onDragBegin==null?void 0:onDragBegin(index);}});var onContainerLayout=function onContainerLayout(_ref){var layout=_ref.nativeEvent.layout;var width=layout.width,height=layout.height;containerSize.value=props.horizontal?width:height;props.onContainerLayout==null?void 0:props.onContainerLayout({layout:layout,containerRef:containerRef});};var onListContentSizeChange=function onListContentSizeChange(w,h){scrollViewSize.value=props.horizontal?w:h;props.onContentSizeChange==null?void 0:props.onContentSizeChange(w,h);};var onContainerTouchStart=function onContainerTouchStart(){if(!disabled.value){isTouchActiveNative.value=true;}return false;};var onContainerTouchEnd=function onContainerTouchEnd(){isTouchActiveNative.value=false;};var extraData=(0,_react.useMemo)(function(){return{activeKey:activeKey,extraData:props.extraData};},[activeKey,props.extraData]);var renderItem=(0,_react.useCallback)(function(_ref2){var item=_ref2.item,index=_ref2.index;var key=keyExtractor(item,index);if(index!==keyToIndexRef.current.get(key)){keyToIndexRef.current.set(key,index);}return _react.default.createElement(_RowItem.default,{item:item,itemKey:key,renderItem:props.renderItem,drag:drag,extraData:props.extraData,__self:_this,__source:{fileName:_jsxFileName,lineNumber:205,columnNumber:9}});},[props.renderItem,props.extraData,drag,keyExtractor]);var onRelease=(0,_useStableCallback.useStableCallback)(function(index){props.onRelease==null?void 0:props.onRelease(index);});var onDragEnd=(0,_useStableCallback.useStableCallback)(function(_ref3){var from=_ref3.from,to=_ref3.to;var onDragEnd=props.onDragEnd,data=props.data;var newData=(0,_toConsumableArray2.default)(data);if(from!==to){newData.splice(from,1);newData.splice(to,0,data[from]);}onDragEnd==null?void 0:onDragEnd({from:from,to:to,data:newData});setActiveKey(null);});var onPlaceholderIndexChange=(0,_useStableCallback.useStableCallback)(function(index){props.onPlaceholderIndexChange==null?void 0:props.onPlaceholderIndexChange(index);});(0,_reactNativeReanimated.useAnimatedReaction)(function(){var _f=function _f(){return isTouchActiveNative.value;};_f._closure={isTouchActiveNative:isTouchActiveNative};_f.asString="function _f(){const{isTouchActiveNative}=jsThis._closure;{return isTouchActiveNative.value;}}";_f.__workletHash=14702024657843;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (243:4)";return _f;}(),function(){var _f=function _f(cur,prev){if(cur!==prev&&!cur){var hasMoved=!!touchTranslate.value;if(!hasMoved&&activeIndexAnim.value>=0&&!disabled.value){(0,_reactNativeReanimated.runOnJS)(onRelease)(activeIndexAnim.value);(0,_reactNativeReanimated.runOnJS)(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});}}};_f._closure={touchTranslate:touchTranslate,activeIndexAnim:activeIndexAnim,disabled:disabled,runOnJS:_reactNativeReanimated.runOnJS,onRelease:onRelease,onDragEnd:onDragEnd,spacerIndexAnim:spacerIndexAnim};_f.asString="function _f(cur,prev){const{touchTranslate,activeIndexAnim,disabled,runOnJS,onRelease,onDragEnd,spacerIndexAnim}=jsThis._closure;{if(cur!==prev&&!cur){const hasMoved=!!touchTranslate.value;if(!hasMoved&&activeIndexAnim.value>=0&&!disabled.value){runOnJS(onRelease)(activeIndexAnim.value);runOnJS(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});}}}}";_f.__workletHash=5951241873481;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (246:4)";return _f;}(),[isTouchActiveNative,onDragEnd,onRelease]);(0,_reactNativeReanimated.useAnimatedReaction)(function(){var _f=function _f(){return spacerIndexAnim.value;};_f._closure={spacerIndexAnim:spacerIndexAnim};_f.asString="function _f(){const{spacerIndexAnim}=jsThis._closure;{return spacerIndexAnim.value;}}";_f.__workletHash=2960108028947;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (262:4)";return _f;}(),function(){var _f=function _f(cur,prev){if(prev!==null&&cur!==prev&&cur>=0&&prev>=0){(0,_reactNativeReanimated.runOnJS)(onPlaceholderIndexChange)(cur);}};_f._closure={runOnJS:_reactNativeReanimated.runOnJS,onPlaceholderIndexChange:onPlaceholderIndexChange};_f.asString="function _f(cur,prev){const{runOnJS,onPlaceholderIndexChange}=jsThis._closure;{if(prev!==null&&cur!==prev&&cur>=0&&prev>=0){runOnJS(onPlaceholderIndexChange)(cur);}}}";_f.__workletHash=16965253726735;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (265:4)";return _f;}(),[spacerIndexAnim]);var gestureDisabled=(0,_reactNativeReanimated.useSharedValue)(false);var panGesture=_reactNativeGestureHandler.Gesture.Pan().onBegin(function(){var _f=function _f(evt){gestureDisabled.value=disabled.value;if(gestureDisabled.value)return;panGestureState.value=evt.state;};_f._closure={gestureDisabled:gestureDisabled,disabled:disabled,panGestureState:panGestureState};_f.asString="function _f(evt){const{gestureDisabled,disabled,panGestureState}=jsThis._closure;{gestureDisabled.value=disabled.value;if(gestureDisabled.value)return;panGestureState.value=evt.state;}}";_f.__workletHash=17574034116918;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (276:13)";return _f;}()).onUpdate(function(){var _f=function _f(evt){if(gestureDisabled.value)return;panGestureState.value=evt.state;var translation=horizontalAnim.value?evt.translationX:evt.translationY;touchTranslate.value=translation;};_f._closure={gestureDisabled:gestureDisabled,panGestureState:panGestureState,horizontalAnim:horizontalAnim,touchTranslate:touchTranslate};_f.asString="function _f(evt){const{gestureDisabled,panGestureState,horizontalAnim,touchTranslate}=jsThis._closure;{if(gestureDisabled.value)return;panGestureState.value=evt.state;const translation=horizontalAnim.value?evt.translationX:evt.translationY;touchTranslate.value=translation;}}";_f.__workletHash=5455568984874;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (281:14)";return _f;}()).onEnd(function(){var _f=function _f(evt){if(gestureDisabled.value)return;isTouchActiveNative.value=false;var translation=horizontalAnim.value?evt.translationX:evt.translationY;touchTranslate.value=translation+autoScrollDistance.value;panGestureState.value=evt.state;if(activeIndexAnim.value===-1||disabled.value)return;disabled.value=true;(0,_reactNativeReanimated.runOnJS)(onRelease)(activeIndexAnim.value);var springTo=placeholderOffset.value-activeCellOffset.value;touchTranslate.value=(0,_reactNativeReanimated.withSpring)(springTo,animationConfigRef.value,function(){var _f=function _f(){(0,_reactNativeReanimated.runOnJS)(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});disabled.value=false;};_f._closure={runOnJS:_reactNativeReanimated.runOnJS,onDragEnd:onDragEnd,activeIndexAnim:activeIndexAnim,spacerIndexAnim:spacerIndexAnim,disabled:disabled};_f.asString="function _f(){const{runOnJS,onDragEnd,activeIndexAnim,spacerIndexAnim,disabled}=jsThis._closure;{runOnJS(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});disabled.value=false;}}";_f.__workletHash=1618704508901;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (308:8)";return _f;}());};_f._closure={gestureDisabled:gestureDisabled,isTouchActiveNative:isTouchActiveNative,horizontalAnim:horizontalAnim,touchTranslate:touchTranslate,autoScrollDistance:autoScrollDistance,panGestureState:panGestureState,activeIndexAnim:activeIndexAnim,disabled:disabled,runOnJS:_reactNativeReanimated.runOnJS,onRelease:onRelease,placeholderOffset:placeholderOffset,activeCellOffset:activeCellOffset,withSpring:_reactNativeReanimated.withSpring,animationConfigRef:animationConfigRef,onDragEnd:onDragEnd,spacerIndexAnim:spacerIndexAnim};_f.asString="function _f(evt){const{gestureDisabled,isTouchActiveNative,horizontalAnim,touchTranslate,autoScrollDistance,panGestureState,activeIndexAnim,disabled,runOnJS,onRelease,placeholderOffset,activeCellOffset,withSpring,animationConfigRef,onDragEnd,spacerIndexAnim}=jsThis._closure;{if(gestureDisabled.value)return;isTouchActiveNative.value=false;const translation=horizontalAnim.value?evt.translationX:evt.translationY;touchTranslate.value=translation+autoScrollDistance.value;panGestureState.value=evt.state;if(activeIndexAnim.value===-1||disabled.value)return;disabled.value=true;runOnJS(onRelease)(activeIndexAnim.value);const springTo=placeholderOffset.value-activeCellOffset.value;touchTranslate.value=withSpring(springTo,animationConfigRef.value,function(){runOnJS(onDragEnd)({from:activeIndexAnim.value,to:spacerIndexAnim.value});disabled.value=false;});}}";_f.__workletHash=7842863214419;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (289:11)";return _f;}()).onTouchesDown(function(){var _f=function _f(){(0,_reactNativeReanimated.runOnJS)(onContainerTouchStart)();};_f._closure={runOnJS:_reactNativeReanimated.runOnJS,onContainerTouchStart:onContainerTouchStart};_f.asString="function _f(){const{runOnJS,onContainerTouchStart}=jsThis._closure;{runOnJS(onContainerTouchStart)();}}";_f.__workletHash=4756906064016;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (317:19)";return _f;}()).onTouchesUp(function(){var _f=function _f(){(0,_reactNativeReanimated.runOnJS)(onContainerTouchEnd)();};_f._closure={runOnJS:_reactNativeReanimated.runOnJS,onContainerTouchEnd:onContainerTouchEnd};_f.asString="function _f(){const{runOnJS,onContainerTouchEnd}=jsThis._closure;{runOnJS(onContainerTouchEnd)();}}";_f.__workletHash=9596402198608;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (320:17)";return _f;}());if(dragHitSlop)panGesture.hitSlop(dragHitSlop);if(activationDistanceProp){var activeOffset=[-activationDistanceProp,activationDistanceProp];if(props.horizontal){panGesture.activeOffsetX(activeOffset);}else{panGesture.activeOffsetY(activeOffset);}}var onScroll=(0,_useStableCallback.useStableCallback)(function(scrollOffset){props.onScrollOffsetChange==null?void 0:props.onScrollOffsetChange(scrollOffset);});var scrollHandler=(0,_reactNativeReanimated.useAnimatedScrollHandler)({onScroll:function(){var _f=function _f(evt){scrollOffset.value=horizontalAnim.value?evt.contentOffset.x:evt.contentOffset.y;(0,_reactNativeReanimated.runOnJS)(onScroll)(scrollOffset.value);};_f._closure={scrollOffset:scrollOffset,horizontalAnim:horizontalAnim,runOnJS:_reactNativeReanimated.runOnJS,onScroll:onScroll};_f.asString="function _f(evt){const{scrollOffset,horizontalAnim,runOnJS,onScroll}=jsThis._closure;{scrollOffset.value=horizontalAnim.value?evt.contentOffset.x:evt.contentOffset.y;runOnJS(onScroll)(scrollOffset.value);}}";_f.__workletHash=5653789960368;_f.__location="/Users/danielmerrill/code/oss/react-native-draggable-flatlist/src/components/DraggableFlatList.tsx (342:16)";return _f;}()},[horizontalAnim]);(0,_useAutoScroll.useAutoScroll)();var onViewableItemsChanged=(0,_useStableCallback.useStableCallback)(function(info){var viewableIndices=info.viewableItems.filter(function(item){return item.isViewable;}).map(function(item){return item.index;}).filter(function(index){return typeof index==="number";});var min=Math.min.apply(Math,(0,_toConsumableArray2.default)(viewableIndices));var max=Math.max.apply(Math,(0,_toConsumableArray2.default)(viewableIndices));viewableIndexMin.value=min;viewableIndexMax.value=max;props.onViewableItemsChanged==null?void 0:props.onViewableItemsChanged(info);});return _react.default.createElement(_draggableFlatListContext.default,{activeKey:activeKey,keyExtractor:keyExtractor,horizontal:!!props.horizontal,layoutAnimationDisabled:layoutAnimationDisabled,__self:this,__source:{fileName:_jsxFileName,lineNumber:370,columnNumber:5}},_react.default.createElement(_reactNativeGestureHandler.GestureDetector,{gesture:panGesture,__self:this,__source:{fileName:_jsxFileName,lineNumber:376,columnNumber:7}},_react.default.createElement(_reactNativeReanimated.default.View,{style:props.containerStyle,ref:containerRef,onLayout:onContainerLayout,__self:this,__source:{fileName:_jsxFileName,lineNumber:377,columnNumber:9}},props.renderPlaceholder&&_react.default.createElement(_PlaceholderItem.default,{renderPlaceholder:props.renderPlaceholder,__self:this,__source:{fileName:_jsxFileName,lineNumber:383,columnNumber:13}}),_react.default.createElement(AnimatedFlatList,(0,_extends2.default)({},props,{data:props.data,onViewableItemsChanged:onViewableItemsChanged,CellRendererComponent:_CellRendererComponent.default,ref:flatlistRef,onContentSizeChange:onListContentSizeChange,scrollEnabled:!activeKey&&scrollEnabled,renderItem:renderItem,extraData:extraData,keyExtractor:keyExtractor,onScroll:scrollHandler,scrollEventThrottle:16,simultaneousHandlers:props.simultaneousHandlers,removeClippedSubviews:false,__self:this,__source:{fileName:_jsxFileName,lineNumber:385,columnNumber:11}})),!!props.onScrollOffsetChange&&_react.default.createElement(_ScrollOffsetListener.default,{onScrollOffsetChange:props.onScrollOffsetChange,scrollOffset:scrollOffset,__self:this,__source:{fileName:_jsxFileName,lineNumber:402,columnNumber:13}}))));}function DraggableFlatList(props,ref){return _react.default.createElement(_propsContext.default,(0,_extends2.default)({},props,{__self:this,__source:{fileName:_jsxFileName,lineNumber:418,columnNumber:5}}),_react.default.createElement(_animatedValueContext.default,{__self:this,__source:{fileName:_jsxFileName,lineNumber:419,columnNumber:7}},_react.default.createElement(_refContext.default,{flatListRef:ref,__self:this,__source:{fileName:_jsxFileName,lineNumber:420,columnNumber:9}},_react.default.createElement(MemoizedInner,(0,_extends2.default)({},props,{__self:this,__source:{fileName:_jsxFileName,lineNumber:421,columnNumber:11}})))));}var MemoizedInner=(0,_utils.typedMemo)(DraggableFlatListInner);var _default=_react.default.forwardRef(DraggableFlatList);exports.default=_default; + //# sourceMappingURL=DraggableFlatList.js.map +\ No newline at end of file diff --git a/patches/react-native-plaid-link-sdk/details.md b/patches/react-native-plaid-link-sdk/details.md index 2c1c449fc5e6..d8a5c21c52ba 100644 --- a/patches/react-native-plaid-link-sdk/details.md +++ b/patches/react-native-plaid-link-sdk/details.md @@ -24,3 +24,16 @@ - Upstream PR/issue: - - E/App issue: https://github.com/Expensify/App/issues/87757 - PR introducing patch: https://github.com/Expensify/App/pull/88534 + +### [react-native-plaid-link-sdk+12.5.3+002+rn088-kotlin-currentActivity.patch](react-native-plaid-link-sdk+12.5.3+002+rn088-kotlin-currentActivity.patch) + +- Reason: + + ``` + In React Native 0.88 `ReactContextBaseJavaModule.getCurrentActivity()` is a plain Kotlin `fun`, so the bare + `currentActivity` property reads in `PlaidModule.kt` fail to compile. Read `reactApplicationContext.currentActivity`. + ``` + +- Upstream PR/issue: Fixed upstream from 12.7.0 (12.6.0 is still broken). Drop this patch when bumping to >= 12.7.0. +- E/App issue: https://github.com/Expensify/App/issues/106110 +- PR introducing patch: https://github.com/Expensify/App/pull/101739 diff --git a/patches/react-native-plaid-link-sdk/react-native-plaid-link-sdk+12.5.3+002+rn088-kotlin-currentActivity.patch b/patches/react-native-plaid-link-sdk/react-native-plaid-link-sdk+12.5.3+002+rn088-kotlin-currentActivity.patch new file mode 100644 index 000000000000..0262490ec7d8 --- /dev/null +++ b/patches/react-native-plaid-link-sdk/react-native-plaid-link-sdk+12.5.3+002+rn088-kotlin-currentActivity.patch @@ -0,0 +1,21 @@ +diff --git a/node_modules/react-native-plaid-link-sdk/android/src/main/java/com/plaid/PlaidModule.kt b/node_modules/react-native-plaid-link-sdk/android/src/main/java/com/plaid/PlaidModule.kt +--- a/node_modules/react-native-plaid-link-sdk/android/src/main/java/com/plaid/PlaidModule.kt ++++ b/node_modules/react-native-plaid-link-sdk/android/src/main/java/com/plaid/PlaidModule.kt +@@ -126,7 +126,7 @@ class PlaidModule internal constructor(reactContext: ReactApplicationContext) : + + @ReactMethod + override fun open(onSuccessCallback: Callback, onExitCallback: Callback) { +- val activity = currentActivity ?: throw IllegalStateException("Current activity is null") ++ val activity = reactApplicationContext.currentActivity ?: throw IllegalStateException("Current activity is null") + + plaidHandler?.let { handler -> + // Work with nonNullValue here +@@ -176,7 +176,7 @@ class PlaidModule internal constructor(reactContext: ReactApplicationContext) : + onSuccessCallback: Callback, + onExitCallback: Callback + ) { +- val activity = currentActivity ?: throw IllegalStateException("Current activity is null") ++ val activity = reactApplicationContext.currentActivity ?: throw IllegalStateException("Current activity is null") + this.onSuccessCallback = onSuccessCallback + this.onExitCallback = onExitCallback + diff --git a/patches/react-native/details.md b/patches/react-native/details.md index 6820ac52fb7d..703530d9fe6a 100644 --- a/patches/react-native/details.md +++ b/patches/react-native/details.md @@ -1,13 +1,6 @@ # `react-native` patches -### [react-native+0.86.0+001+initial.patch](react-native+0.86.0+001+initial.patch) - -- Reason: Fixes keyboard flickering issue when opening/closing modals. When an input is blurred and a modal is opened, the `rootView` becomes the `firstResponder`, causing the system to retain an incorrect keyboard state. This leads to keyboard flickering when the modal is closed. The patch adds code to resign the `rootView`'s `firstResponder` status before presenting the modal to prevent this issue. -- Upstream PR/issue: 🛑 -- E/App issue: 🛑 -- PR Introducing Patch: https://github.com/Expensify/App/pull/23994 - -### [react-native+0.86.0+002+fixMVCPAndroid.patch](react-native+0.86.0+002+fixMVCPAndroid.patch) +### [react-native+0.88.0+001+fixMVCPAndroid.patch](react-native+0.88.0+001+fixMVCPAndroid.patch) - Reason: Fixes content jumping issues with `MaintainVisibleContentPosition` on Android, particularly in bidirectional pagination scenarios. The patch: 1. Changes when the first visible view is calculated - now happens on scroll events instead of during Fabric's willMountItems lifecycle, which was causing incorrect updates @@ -18,60 +11,53 @@ - Expected release: React Native 0.89.0, [currently scheduled for 2026-12-07](https://reactnative.dev/releases/overview), unless cherry-picked into an earlier release. The fix landed after the 0.88 branch cut and before the scheduled 0.89 branch cut on 2026-11-03. - Reproducer: https://github.com/react/react-native/pull/59360 adds the RNTester reproduction, without a runtime fix. The standalone reproduction and proposed anchor patch are in https://github.com/margelo/react-native-mvcp-reproducer. - Earlier proposal: https://github.com/react/react-native/pull/46247 closed without merging. -- Removal: Expected to be removable when the adopted React Native release contains `9bc1a28`. Before removing it, verify bidirectional pagination, changing row heights, and LegendList's positioned-anchor corrections with the patch disabled. Keep it on React Native 0.86 unless the upstream fix is backported. +- Removal: Expected to be removable when the adopted React Native release contains `9bc1a28`. Before removing it, verify bidirectional pagination, changing row heights, and LegendList's positioned-anchor corrections with the patch disabled. Keep it on React Native 0.88 unless the upstream fix is backported. - E/App issue: 🛑 - PR Introducing Patch: https://github.com/Expensify/App/pull/46315 (introduced), https://github.com/Expensify/App/pull/45289 (refactored) -### [react-native+0.86.0+003+disableTextInputRecycling.patch](react-native+0.86.0+003+disableTextInputRecycling.patch) +### [react-native+0.88.0+002+disableTextInputRecycling.patch](react-native+0.88.0+002+disableTextInputRecycling.patch) - Reason: Disables text input recycling to prevent issues with state of recycled component - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: https://github.com/Expensify/App/pull/13767 -### [react-native+0.86.0+004+iOSFontResolution.patch](react-native+0.86.0+004+iOSFontResolution.patch) +### [react-native+0.88.0+003+iOSFontResolution.patch](react-native+0.88.0+003+iOSFontResolution.patch) - Reason: Fixes font resolution issues on iOS by properly preserving font properties when loading fonts by name. When a font is loaded by its name, the patch now correctly extracts and uses its actual weight and style properties instead of ignoring them. - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: https://github.com/Expensify/App/pull/13767 -### [react-native+0.86.0+005+resetAutoresizingOnView.patch](react-native+0.86.0+005+resetAutoresizingOnView.patch) +### [react-native+0.88.0+004+resetAutoresizingOnView.patch](react-native+0.88.0+004+resetAutoresizingOnView.patch) - Reason: This is a workaround fix for an issue with `UIPageViewController` and Fabric's view recycling system. The problem occurs because pager-view was incorrectly using a Fabric-provided view as its content-view. This is problematic because `UIPageViewController` modifies its content view, and when Fabric later recycles this modified view, it can lead to unexpected layout issues. The patch addresses this by resetting the autoresizing mask on the view to prevent layout corruption when views are recycled. The root cause should be addressed in react-native-pager-view: https://github.com/callstack/react-native-pager-view/issues/819 - Upstream PR/issue: https://github.com/facebook/react-native/issues/42732 - E/App issue: 🛑 - PR Introducing Patch: https://github.com/Expensify/App/pull/13767 -### [react-native+0.86.0+006+disableNonTranslucentStatusBar.patch](react-native+0.86.0+006+disableNonTranslucentStatusBar.patch) - -- Reason: Disables non-translucent status bar to fix UI issues -- Upstream PR/issue: 🛑 -- E/App issue: 🛑 -- PR Introducing Patch: 🛑 - -### [react-native+0.86.0+007+TextInput.patch](react-native+0.86.0+007+TextInput.patch) +### [react-native+0.88.0+005+TextInput.patch](react-native+0.88.0+005+TextInput.patch) - Reason: Fixes TextInput component issues - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: 🛑 -### [react-native+0.86.0+008+copyStateOnClone.patch](react-native+0.86.0+008+copyStateOnClone.patch) +### [react-native+0.88.0+006+copyStateOnClone.patch](react-native+0.88.0+006+copyStateOnClone.patch) - Reason: Ensures state is properly copied when cloning components - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: 🛑 -### [react-native+0.86.0+009+textinput-clear-command.patch](react-native+0.86.0+009+textinput-clear-command.patch) +### [react-native+0.88.0+007+textinput-clear-command.patch](react-native+0.88.0+007+textinput-clear-command.patch) - Reason: Adds clear command functionality to TextInput - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: 🛑 -### [react-native+0.86.0+010+Add-onPaste-to-TextInput.patch](react-native+0.86.0+010+Add-onPaste-to-TextInput.patch) +### [react-native+0.88.0+008+Add-onPaste-to-TextInput.patch](react-native+0.88.0+008+Add-onPaste-to-TextInput.patch) - Reasons: - Adds `onPaste` callback to `TextInput` to support image pasting on native @@ -88,59 +74,59 @@ - https://github.com/Expensify/App/issues/75991 - PR Introducing Patch: [#47203](https://github.com/Expensify/App/pull/47203) -### [react-native+0.86.0+011+alert-style.patch](react-native+0.86.0+011+alert-style.patch) +### [react-native+0.88.0+009+alert-style.patch](react-native+0.88.0+009+alert-style.patch) - Reason: Fixes alert styling issues - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: 🛑 -### [react-native+0.86.0+012+fixScrollViewState.patch](react-native+0.86.0+012+fixScrollViewState.patch) +### [react-native+0.88.0+010+fixScrollViewState.patch](react-native+0.88.0+010+fixScrollViewState.patch) - Reason: Fixes ScrollView state management issues - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: 🛑 -### [react-native+0.86.0+013+fix-mask-persisting-recycling.patch](react-native+0.86.0+013+fix-mask-persisting-recycling.patch) +### [react-native+0.88.0+011+fix-mask-persisting-recycling.patch](react-native+0.88.0+011+fix-mask-persisting-recycling.patch) - Reason: Fixes mask persisting and recycling issues - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: 🛑 -### [react-native+0.86.0+014+fix-text-selecting-on-change.patch](react-native+0.86.0+014+fix-text-selecting-on-change.patch) +### [react-native+0.88.0+012+fix-text-selecting-on-change.patch](react-native+0.88.0+012+fix-text-selecting-on-change.patch) - Reason: Fixes text selection issues during onChange events - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: 🛑 -### [react-native+0.86.0+015+fix-merged-transaction-mount-order.patch](react-native+0.86.0+015+fix-merged-transaction-mount-order.patch) +### [react-native+0.88.0+013+fix-merged-transaction-mount-order.patch](react-native+0.88.0+013+fix-merged-transaction-mount-order.patch) - Reason: Fixes the Android Fabric mount-item failures behind `APP-7AR` (`addViewAt: failed to insert view into parent`, underlying `IndexOutOfBoundsException: index=1 count=0`) and `APP-H7A` (`Unable to remove a view from a view that is not a ViewGroup`). Both fire when a mount batch is applied to a native view tree that no longer matches the shadow tree the batch was computed against. On Android, `FabricUIManagerBinding::schedulerDidFinishTransaction` merges a finished transaction into the one still pending for the same surface whenever commits outpace UI-thread mounting, and `FabricMountingManager::executeMount` then writes `Delete` mount items last and splits `Update`s into their own buckets. React Native's own comment on that block says the optimization "is incorrect when multiple transactions are merged together": a merged `REMOVE -> DELETE | CREATE -> INSERT` sequence is mounted as `INSERT -> REMOVE -> DELETE`, which destroys a view the shadow tree still considers mounted, and every index computed for that parent afterwards is stale. The patch sets `maintainMutationOrder` whenever the transaction is a merge of several commits (`MountingTransaction::wasMerged()`), so a merged batch is mounted in differ order and no mutation pairing can be reordered. Transactions that were never merged keep the delete-batching optimization exactly as it is, and differ-order mounting is already a supported mode - it is what `disableMountItemReorderingAndroid` turns on globally. -- Why the whole `maintainMutationOrder` flag and not just the deletes: the FIXME is attached to the deletes-last write block, but the same flag also un-buckets the six `Update` categories, which are otherwise emitted ahead of every `Delete`. That second half matters - in a merged batch, bucketing hoists an `Update(X)` from commit N in front of a `Create(X)` from commit N+1, so commit N's props land on the view commit N+1 created. Narrowing this patch to deletes only would reintroduce that case. The cost is that a merged batch writes one int-buffer preamble per instruction run instead of one per type, so an insert-heavy merged batch carries a slightly larger int array; it is still a single batch, a single JNI call and the same mount-item count, and it is cheaper than the two separate batches `+015` produced whenever it refused a merge. -- Takes the slot of the previous `+015` patch (`fix-dropping-mutations-in-transactions`), which is deleted here. That patch guarded the same hazard from the other side, by refusing the merge when the incoming transaction created a tag the pending one deleted. It only inspected `Type::Create`, so pairings such as `Delete(tag)` + `Insert(same tag)` still merged, and refusing a merge left a surface holding several pending transactions - a state upstream's merge-target lookup and its swap-then-mount drain do not expect. Mounting merged transactions in differ order closes the hazard for every pairing, so both the guard and the multi-pending state it created are unnecessary. +- Why the whole `maintainMutationOrder` flag and not just the deletes: the FIXME is attached to the deletes-last write block, but the same flag also un-buckets the six `Update` categories, which are otherwise emitted ahead of every `Delete`. That second half matters - in a merged batch, bucketing hoists an `Update(X)` from commit N in front of a `Create(X)` from commit N+1, so commit N's props land on the view commit N+1 created. Narrowing this patch to deletes only would reintroduce that case. The cost is that a merged batch writes one int-buffer preamble per instruction run instead of one per type, so an insert-heavy merged batch carries a slightly larger int array; it is still a single batch, a single JNI call and the same mount-item count, and it is cheaper than the two separate batches `fix-dropping-mutations-in-transactions` produced whenever it refused a merge. +- Replaces the previous `fix-dropping-mutations-in-transactions` patch, which is deleted here. That patch guarded the same hazard from the other side, by refusing the merge when the incoming transaction created a tag the pending one deleted. It only inspected `Type::Create`, so pairings such as `Delete(tag)` + `Insert(same tag)` still merged, and refusing a merge left a surface holding several pending transactions - a state upstream's merge-target lookup and its swap-then-mount drain do not expect. Mounting merged transactions in differ order closes the hazard for every pairing, so both the guard and the multi-pending state it created are unnecessary. - Upstream PR/issue: React Native's own `FIXME: this optimization is incorrect when multiple transactions are merged together` in [`FabricMountingManager.cpp`](https://github.com/facebook/react-native/blob/v0.86.0/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp#L974-L980). The merging this patch makes safe is upstream behaviour, but the FIXME is unfixed upstream, so there is nothing to adopt. - E/App issue: [#98791](https://github.com/Expensify/App/issues/98791) (parent tracker [#91302](https://github.com/Expensify/App/issues/91302)) - PR introducing patch: https://github.com/Expensify/App/pull/101057 -- 0.86.0 migration note: drop this patch once `disableMountItemReorderingAndroid` defaults to true upstream, or if Android stops merging mounting transactions - either one makes it redundant. Re-check on the RN 0.87 upgrade. +- Removal: drop this patch once `disableMountItemReorderingAndroid` defaults to true upstream (still `false` in 0.88.0), or if Android stops merging mounting transactions - either one makes it redundant. -### [react-native+0.86.0+016+fix-crash-when-deleting-expense.patch](react-native+0.86.0+016+fix-crash-when-deleting-expense.patch) +### [react-native+0.88.0+014+fix-crash-when-deleting-expense.patch](react-native+0.88.0+014+fix-crash-when-deleting-expense.patch) - Reason: Fixes crash when deleting expenses - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: 🛑 -### [react-native+0.86.0+017+publish-gradle.patch](react-native+0.86.0+017+publish-gradle.patch) +### [react-native+0.88.0+015+publish-gradle.patch](react-native+0.88.0+015+publish-gradle.patch) - Reason: This patch customizes the Gradle publishing script to allow publishing our custom React Native artifacts to GitHub Packages. The POM records the patches hash and the Hermes version the artifact was compiled against, which `scripts/artifacts-utils/lib/artifactsResolver.ts` matches before consuming an artifact. - Upstream PR/issue: 🛑 - E/App issue: 🛑 - PR Introducing Patch: https://github.com/Expensify/App/pull/59738 -### [react-native+0.86.0+018+textinput-prevent-focus-on-first-responder.patch](react-native+0.86.0+018+textinput-prevent-focus-on-first-responder.patch) +### [react-native+0.88.0+016+textinput-prevent-focus-on-first-responder.patch](react-native+0.88.0+016+textinput-prevent-focus-on-first-responder.patch) - Reason: On iOS, a text input automatically becomes the "first responder" in UIKit's "UIResponder" chain. Once a text input becomes the first responder, it will be automatically focused. (This also causes the keyboard to open) - This is not handled by React or React Native, but is rather a native iOS/UIKit behaviour. This patch adds an additional `TextInput` prop (`preventFocusOnFirstResponder`) and a ref method (`preventFocusOnFirstResponderOnce`) to bypass the focus on first responder. @@ -149,60 +135,54 @@ - E/App issue: [#54813](https://github.com/Expensify/App/issues/54813) - PR Introducing Patch: [#61492](https://github.com/Expensify/App/pull/61492) -### [react-native+0.86.0+019+fix-modal-transparent-navigation-bar.patch](react-native+0.86.0+019+fix-modal-transparent-navigation-bar.patch) +### [react-native+0.88.0+017+fix-modal-transparent-navigation-bar.patch](react-native+0.88.0+017+fix-modal-transparent-navigation-bar.patch) - Reason: This patch fixes an issue where it is not possible to enable a transparent navigation bar on Android, and keeps the modal's system bar icons in sync with the activity. The `dialog === newDialog` check in the call that `showOrUpdate()` posts fixes the fatal `IllegalStateException: dialog must exist when we call updateProperties` behind `APP-M66`, which happens when the modal is dismissed before that call runs. Keep this check when regenerating the patch. - Upstream PR/issue: 🛑 - E/App issue: [#69005](https://github.com/Expensify/App/issues/69005), [#103778](https://github.com/Expensify/App/issues/103778) - PR introducing patch: [#69004](https://github.com/Expensify/App/pull/69004) (introduced), [#104689](https://github.com/Expensify/App/pull/104689) (`APP-M66` guard) -### [react-native+0.86.0+021+perf-increase-initial-heap-size.patch](react-native+0.86.0+021+perf-increase-initial-heap-size.patch) +### [react-native+0.88.0+018+perf-increase-initial-heap-size.patch](react-native+0.88.0+018+perf-increase-initial-heap-size.patch) - Reason: This patch increases the initial heap size of the Hermes runtime. This allows us to disable Hermes Young-Gen Garbage Collection (GC) in a separate patch, which improves initial TTI and app startup time. - Upstream PR/issue: This is not intended to be upstreamed, since this is a low-level fix very specific to the Expensify app's requirements. - E/App issue: [#76859](https://github.com/Expensify/App/issues/76859) - PR introducing patch: [#76154](https://github.com/Expensify/App/pull/76154) -### [react-native+0.86.0+022+perf-disable-hermes-young-gc-before-tti-reached.patch](react-native+0.86.0+022+perf-disable-hermes-young-gc-before-tti-reached.patch) +### [react-native+0.88.0+019+perf-disable-hermes-young-gc-before-tti-reached.patch](react-native+0.88.0+019+perf-disable-hermes-young-gc-before-tti-reached.patch) - Reason: This patch disables Hermes Young-Gen Garbage Collection (GC), which improves initial TTI and app startup time, by delaying GC for early allocated memory to the first Old-Gen GC run. - Upstream PR/issue: This is not intended to be upstreamed, since this is a low-level fix very specific to the Expensify app's requirements. - E/App issue: [#76859](https://github.com/Expensify/App/issues/76859) - PR introducing patch: [#76154](https://github.com/Expensify/App/pull/76154) -### [react-native+0.86.0+023+strip-hermes-debug-info.patch](react-native+0.86.0+023+strip-hermes-debug-info.patch) +### [react-native+0.88.0+020+strip-hermes-debug-info.patch](react-native+0.88.0+020+strip-hermes-debug-info.patch) - Reason: Always pass `-output-source-map` to `hermesc` for production iOS builds, stripping ~13.4MB of debug metadata from the Hermes bytecode. Previously this flag was only passed when `SOURCEMAP_FILE` was set; if the build environment didn't propagate that variable, debug info remained in the shipped bundle. - Upstream PR/issue: This should ideally be the default behavior upstream, but no PR has been filed yet. - E/App issue: [#83000](https://github.com/Expensify/App/issues/83000) - PR introducing patch: [#83256](https://github.com/Expensify/App/pull/83256) -### [react-native+0.86.0+025+fix-display-contents-dirty-flag.patch](react-native+0.86.0+025+fix-display-contents-dirty-flag.patch) +### [react-native+0.88.0+022+fix-display-contents-dirty-flag.patch](react-native+0.88.0+022+fix-display-contents-dirty-flag.patch) - Reason: When a child node has `display: contents`, Yoga may reuse cached layout results from a previous pass even though the subtree has changed. This patch marks the parent yoga node as dirty when it encounters a child with `display: contents`, ensuring Yoga re-visits and recalculates the layout for that subtree instead of skipping it. - Upstream PR/issue: 🛑 - E/App issue: https://github.com/Expensify/App/issues/85877 - PR introducing patch: 🛑 -### [react-native+0.86.0+026+fix-fabric-collapsed-accessibility-announcement.patch](react-native+0.86.0+026+fix-fabric-collapsed-accessibility-announcement.patch) +### [react-native+0.88.0+023+fix-fabric-collapsed-accessibility-announcement.patch](react-native+0.88.0+023+fix-fabric-collapsed-accessibility-announcement.patch) - Reason: Fixes a Fabric regression where VoiceOver on iOS only announces "expanded" but never "collapsed" for elements with `accessibilityState.expanded`. In `RCTViewComponentView.mm`, the code uses `value_or(false)` which skips the announcement entirely when `expanded` is `false`. This patch changes the logic to use `has_value()` and correctly announce both "expanded" and "collapsed" states, matching the old architecture (Paper) behavior. - Upstream PR/issue: https://github.com/facebook/react-native/issues/56296 - E/App issue: [#76929](https://github.com/Expensify/App/issues/76929) -### [react-native+0.86.0+027+fix-pressability-new-arch.patch](react-native+0.86.0+027+fix-pressability-new-arch.patch) +### [react-native+0.88.0+024+fix-pressability-new-arch.patch](react-native+0.88.0+024+fix-pressability-new-arch.patch) - Reason: Fixes an Android-specific issue (reproducible on certain Samsung models) where `onPress` events do not trigger for `Pressable` components when used inside a `Tooltip`. The root cause is that in the new architecture, `Pressability.measure()` reads stale layout information from the shadow tree instead of the actual native view hierarchy. This patch introduces a new `measureAsyncOnUI` method that measures the view asynchronously using the native layout hierarchy on the UI thread, bypassing stale shadow tree data. - Upstream PR/issue: [facebook/react-native#51835](https://github.com/facebook/react-native/pull/51835) - E/App issue: [#59953](https://github.com/Expensify/App/issues/59953) -### [react-native+0.86.0+028+fix-turbomodule-event-emitter-uaf.patch](react-native+0.86.0+028+fix-turbomodule-event-emitter-uaf.patch) - -- Reason: Fixes an Android use-after-free crash in `JavaTurboModule::configureEventEmitterCallback`. The event-emitter callback lambda captured `this` by reference (`[&]`), so when the C++ TurboModule was deallocated (e.g. on screen unmount) a background thread invoking the callback would dereference freed memory via `eventEmitterMap_[name]` and crash with `SIGSEGV`. The fix copies the `shared_ptr` map by value into the lambda and replaces `operator[]` with `find()` + null-check, which both keeps the map alive for the callback's lifetime and avoids inserting empty entries on missing keys. -- Upstream PR/issue: [facebook/react-native#55398](https://github.com/facebook/react-native/pull/55398) -- E/App issue: [#90623](https://github.com/Expensify/App/issues/90623) - -### [react-native+0.86.0+029+fix-deadlock-APP-7B2.patch](react-native+0.86.0+029+fix-deadlock-APP-7B2.patch) +### [react-native+0.88.0+025+fix-deadlock-APP-7B2.patch](react-native+0.88.0+025+fix-deadlock-APP-7B2.patch) - Reason: Fixes a fatal iOS app hang (APP-7B2) caused by a deadlock in Fabric's `ComponentDescriptorRegistry`. During HybridApp OldDot->NewDot transitions, a background thread lazily registering legacy interop component descriptors via `ComponentDescriptorRegistry::add()` holds a `unique_lock(mutex_)` while constructing a descriptor that calls `RCTUnsafeExecuteOnMainQueueSync`. Simultaneously, the main thread (driven by `CADisplayLink` animation ticks) tries to acquire `shared_lock(mutex_)` in `findComponentDescriptorByHandle_DO_NOT_USE_THIS_IS_BROKEN`. This creates a circular dependency: main waits for the lock, background waits for main. The fix moves descriptor construction outside the `unique_lock`, so the lock is only held for the two map insertions. - Upstream PR/issue: https://github.com/facebook/react-native/issues/53128 @@ -210,14 +190,14 @@ - PR introducing patch: https://github.com/Expensify/App/pull/91736 -### [react-native+0.86.0+030+fix-nil-BlobModule-crash-APP-8BM.patch](react-native+0.86.0+030+fix-nil-BlobModule-crash-APP-8BM.patch) +### [react-native+0.88.0+026+fix-nil-BlobModule-crash-APP-8BM.patch](react-native+0.88.0+026+fix-nil-BlobModule-crash-APP-8BM.patch) - Reason: Fixes a fatal iOS crash (APP-8BM) in HybridApp where `RCTNetworking`'s default URL-request-handler provider builds its handler list using an Objective-C array literal (`@[...]`) with `[moduleRegistry moduleForName:"BlobModule"]` at index 3. During OldDot↔NewDot bridge transitions, the `__weak _turboModuleRegistry` in `RCTModuleRegistry` is zeroed by ARC at the start of `TurboModuleManager` dealloc — before `[RCTNetworking invalidate]` clears the handler cache — leaving a window where a concurrent in-flight network request calls `prioritizedHandlers`, finds the cache empty, and tries to rebuild it with a nil `BlobModule`. Since `@[…]` compiles to `+[NSArray arrayWithObjects:count:]` which raises `NSInvalidArgumentException` on any nil element, the crash is fatal. The fix replaces the literal with an `NSMutableArray` built from the three always-non-nil handlers (`RCTHTTPRequestHandler`, `RCTDataRequestHandler`, `RCTFileRequestHandler`) and conditionally appends `BlobModule` only when the registry lookup is non-nil, turning a guaranteed crash into a graceful "no blob handler for this window". - Upstream PR/issue: 🛑 - E/App issue: https://github.com/Expensify/App/issues/92413 - PR introducing patch: https://github.com/Expensify/App/pull/92918 -### [react-native+0.86.0+031+nested-text-border-radius.patch](react-native+0.86.0+031+nested-text-border-radius.patch) +### [react-native+0.88.0+027+nested-text-border-radius.patch](react-native+0.88.0+027+nested-text-border-radius.patch) - Reason: @@ -227,7 +207,7 @@ borderBottomLeftRadius / borderBottomRightRadius fields are added to TextAttributes and wired through BaseTextProps and conversions. borderRadius acts as a fallback for unset individual corners; unset corners default to 0 when any radius prop is present. On Android, a custom - DrawCommandSpan with ReactBackgroundDrawSpan draws rounded-rect backgrounds using the four + CanvasEffectSpan with ReactBackgroundDrawSpan draws rounded-rect backgrounds using the four effective corner radii. On iOS, a custom NSLayoutManager subclass (RCTTextLayoutManagerWithBorderRadius) overrides fillBackgroundRectArray to draw per-corner rounded rectangles using CGPath, with per-line outer-corner rounding for multiline spans. @@ -237,22 +217,21 @@ - E/App issue: https://github.com/Expensify/App/issues/78873 - PR introducing patch: https://github.com/Expensify/App/pull/84556 -### [react-native+0.86.0+032+fix-recycled-view-stale-frame.patch](react-native+0.86.0+032+fix-recycled-view-stale-frame.patch) +### [react-native+0.88.0+028+fix-recycled-view-stale-frame.patch](react-native+0.88.0+028+fix-recycled-view-stale-frame.patch) -- Reason: Fixes an iOS Fabric bug where a recycled `RCTViewComponentView` keeps the geometry of its previous occupant, leaving an invisible view that swallows all touches (e.g. the app appears frozen after the `SplashScreenHider` fade/scale animation finishes). `prepareForRecycle` cleared `_layoutMetrics` to `{}` but never updated the physical `center`/`bounds`, nor did it reset the layer transform/opacity that libraries like Reanimated mutate directly on the UI thread (bypassing `_propKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN`). When such a view was later dequeued for a zero-sized wrapper component, `updateLayoutMetrics` saw the incoming zero frame match the (already zero) stored `_layoutMetrics.frame`, skipped updating `center`/`bounds`, and the view retained the splash overlay's full-screen frame. The patch unconditionally realigns `layer.transform`/`layer.opacity` with the shadow-tree props and resets `center`/`bounds` to zero before the view returns to the recycle pool. +- Reason: Fixes an iOS Fabric bug where a recycled `RCTViewComponentView` keeps the geometry of its previous occupant, leaving an invisible view that swallows all touches (e.g. the app appears frozen after the `SplashScreenHider` fade/scale animation finishes). `prepareForRecycle` cleared `_layoutMetrics` to `{}` but never updated the physical `center`/`bounds`, nor did it reset the layer transform/opacity that libraries like Reanimated mutate directly on the UI thread (bypassing `_propKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN`). When such a view was later dequeued for a zero-sized wrapper component, `updateLayoutMetrics` saw the incoming zero frame match the (already zero) stored `_layoutMetrics.frame`, skipped updating `center`/`bounds`, and the view retained the splash overlay's full-screen frame. The patch unconditionally realigns `layer.transform`/`layer.opacity` with the shadow-tree props before the view returns to the recycle pool. Resetting `center`/`bounds` is upstream since 0.88.0 (#57590). - Upstream PR/issue: 🛑 - E/App issue: https://github.com/Expensify/App/issues/91629 - PR introducing patch: https://github.com/Expensify/App/pull/92484 -### [react-native+0.86.0+033+fix-runtime-scheduler-delegate-uaf-APP-25V.patch](react-native+0.86.0+033+fix-runtime-scheduler-delegate-uaf-APP-25V.patch) +### [react-native+0.88.0+029+fix-runtime-scheduler-delegate-uaf-APP-25V.patch](react-native+0.88.0+029+fix-runtime-scheduler-delegate-uaf-APP-25V.patch) -- Reason: Fixes a fatal iOS HybridApp crash (APP-25V) where `RuntimeScheduler_Modern::runEventLoopTick` can drain deferred Fabric rendering updates after the captured `SchedulerDelegate` has been torn down. RN 0.86.0 queues `Scheduler::uiManagerDidFinishTransaction` and `Scheduler::uiManagerDidDispatchCommand` callbacks with lambdas that capture the raw `delegate_` pointer by value. During OldDot↔NewDot lifecycle churn, the delegate can be replaced or destroyed before the scheduled rendering update runs, causing `EXC_BAD_ACCESS` when the lambda dereferences stale native memory. This patch backports the upstream RN scheduler-delegate invalidation guard by adding a per-delegate `shared_ptr>` token, invalidating the old token on delegate changes and Scheduler destruction, and making already-queued lambdas no-op before touching a stale delegate. -- Upstream PR/issue: https://github.com/facebook/react-native/pull/56680 / https://github.com/facebook/react-native/commit/aadbe965792bd900ca70412d6704b76e339d1aca +- Reason: Fixes a fatal iOS HybridApp crash (APP-25V) where `RuntimeScheduler_Modern::runEventLoopTick` can drain deferred Fabric rendering updates after the captured `SchedulerDelegate` has been torn down. React Native queues `Scheduler::uiManagerDidFinishTransaction` and `Scheduler::uiManagerDidDispatchCommand` callbacks with lambdas that capture the raw `delegate_` pointer by value. During OldDot↔NewDot lifecycle churn, the delegate can be replaced or destroyed before the scheduled rendering update runs, causing `EXC_BAD_ACCESS` when the lambda dereferences stale native memory. This patch backports the upstream RN scheduler-delegate invalidation guard by adding a per-delegate `shared_ptr>` token, invalidating the old token on delegate changes and Scheduler destruction, and making already-queued lambdas no-op before touching a stale delegate. +- Upstream PR/issue: https://github.com/facebook/react-native/pull/56680 / https://github.com/facebook/react-native/commit/aadbe965792bd900ca70412d6704b76e339d1aca. Upstream removed the guard again in 0.88.0 (#58138), which still crashes when the delegate is destroyed without a JS error. - E/App issue: https://github.com/Expensify/App/issues/92412 - PR introducing patch: https://github.com/Expensify/App/pull/93878 -- 0.86.0 migration note: upstream RN 0.86.0 ships the same `delegateInvalidated_` guard from PR #56680, but gates it behind `ReactNativeFeatureFlags::enableSchedulerDelegateInvalidation()`, which defaults to `false` and is not overridden anywhere in this app. Re-adding the original members would duplicate upstream's own declarations, so this patch now only strips the feature-flag gating in `Scheduler.cpp` (in the destructor, `setDelegate`, `uiManagerDidFinishTransaction`, and `uiManagerDidDispatchCommand`) so the guard is unconditionally active, matching the original patch's behavior without depending on an experimental flag Meta hasn't promoted to stable. -### [react-native+0.86.0+034+nested-text-border-width.patch](react-native+0.86.0+034+nested-text-border-width.patch) +### [react-native+0.88.0+030+nested-text-border-width.patch](react-native+0.88.0+030+nested-text-border-width.patch) - Reason: @@ -273,7 +252,7 @@ - E/App issue: https://github.com/Expensify/App/issues/57556 - PR introducing patch: https://github.com/Expensify/App/pull/94332 -### [react-native+0.86.0+035+nested-text-padding.patch](react-native+0.86.0+035+nested-text-padding.patch) +### [react-native+0.88.0+031+nested-text-padding.patch](react-native+0.88.0+031+nested-text-padding.patch) - Reason: @@ -294,38 +273,7 @@ - E/App issue: https://github.com/Expensify/App/issues/57556 - PR introducing patch: https://github.com/Expensify/App/pull/94332 -### [react-native+0.86.0+036+fix-find-shadow-node-uaf-APP-HNA.patch](react-native+0.86.0+036+fix-find-shadow-node-uaf-APP-HNA.patch) - -- Reason: Fixes a fatal Android HybridApp crash (APP-HNA) — a SIGSEGV in `findShadowNodeByTagRecursively` reached via `FabricUIManagerBinding::findNextFocusableElement` during focus navigation (D-pad / hardware-keyboard Tab / accessibility focus) inside a scroll view. `UIManager::findShadowNodeByTag_DEPRECATED` has two paths gated on RN's `fixFindShadowNodeByTagRaceCondition` feature flag: the safe path holds the root node alive via a `shared_ptr` for the entire traversal, while the flag-off path grabs a raw root pointer via `tryCommit` (immediately cancelled) that keeps nothing alive. The flag defaults to `false`, so a concurrent commit/unmount on the background thread can free the shadow subtree mid-traversal, leaving a dangling `shared_ptr` that segfaults at `ShadowNode::getTag()`. This patch removes the flag gate and unconditionally uses the safe `shared_ptr`-holding path. Upstream removed the flag (making the safe path the default) in RN 0.87.0, so this patch can be dropped once we upgrade to RN >= 0.87.0. -- Upstream PR/issue: https://github.com/facebook/react-native/pull/55751 (introduced the fix behind the `fixFindShadowNodeByTagRaceCondition` flag) and https://github.com/facebook/react-native/pull/56850 (removed the flag in RN 0.87.0) -- E/App issue: https://github.com/Expensify/App/issues/97471 -- PR introducing patch: https://github.com/Expensify/App/pull/97496 -- 0.86.0 migration note: the `fixFindShadowNodeByTagRaceCondition` flag still defaults to `false` in RN 0.86.0 (unchanged from 0.85.3), and the surrounding code in `UIManager.cpp` is byte-for-byte identical, so the original diff applies with zero fuzz. Only the patch-package filename was renumbered from `0.85.3+040` to `0.86.0+036`; no content changes were needed. - -### [react-native+0.86.0+037+fix-stale-font-scale.patch](react-native+0.86.0+037+fix-stale-font-scale.patch) - -- Reason: Fixes Fabric reusing shadow nodes that hold a stale font scale, leaving text at its old measured size after the OS font size changes. RN 0.86.0 dirties measurable nodes from `SurfaceHandler::constraintLayout` only on the commit where the multiplier changes, and only compares against the *root's* value — so a node cloned from a parent still carrying an obsolete `fontSizeMultiplier` is never re-dirtied. The upstream rewrite stores `fontSizeMultiplier` on `LayoutMetrics` and threads it through `YogaLayoutableShadowNode::configureYogaTree` alongside `pointScaleFactor`, so every commit re-checks each node's own value and calls `markDirtyAndPropagate()` when it is out of date; the now-redundant `dirtyMeasurableNodes`/`dirtyMeasurableNodesRecursive` helpers are removed from `SurfaceHandler`. Gated by RN's existing `enableFontScaleChangesUpdatingLayout` flag, which defaults to `true` in 0.86.0. -- Upstream PR/issue: https://github.com/react/react-native/pull/57246 (fixes https://github.com/react/react-native/issues/52895) -- E/App issue: 🛑 — backport of an upstream fix, no separate E/App issue was filed. -- PR introducing patch: https://github.com/Expensify/App/pull/98507 -- 0.86.0 migration note: **drop this patch with the RN 0.87 upgrade** — upstream commit `45904c8` is absent from every 0.86.x release but ships in `v0.87.0`, and the patch will not apply against it. Two deviations from the upstream commit: the `scripts/cxx-api/api-snapshots/*.api` hunks are omitted (those files are not shipped in the npm package), and `fontSizeMultiplier` is declared *last* in `LayoutMetrics` rather than after `pointScaleFactor`, because `@rnmapbox/maps` initializes that struct positionally and inserting a field mid-struct breaks its iOS build. - -### [react-native+0.86.0+038+log-soft-exception-if-viewState-not-found.patch](react-native+0.86.0+038+log-soft-exception-if-viewState-not-found.patch) - -- Reason: Guards Android Fabric's `updateOverflowInset`, `updatePadding`, and `updateState` batch-mount paths against a view tag that was already unmounted. These methods otherwise resolve the tag through the throwing `getViewState`, so a stale batch instruction throws `RetryableMountingLayerException` from inside `IntBufferBatchMountItem.execute`. `MountItemDispatcher.dispatchMountItems` only retries `DispatchCommandMountItem`s, and `IntBufferBatchMountItem` is not retryable, so the exception propagates and crashes the app. The patch uses `getNullableViewState`, soft-logs the missing state, and returns, matching upstream's established handling for stale batch work. The `updateOverflowInset` hunk restores protection dropped during the RN 0.86 upgrade; the `updatePadding` and `updateState` hunks backport upstream commit `0e86a043` after production release `9.4.46-10` confirmed a fatal `getViewState -> updateState -> IntBufferBatchMountItem` recurrence. -- Upstream PR/issue: [#49077](https://github.com/facebook/react-native/issues/49077) [#56762](https://github.com/facebook/react-native/pull/56762) [#57181](https://github.com/facebook/react-native/pull/57181) [#7493](https://github.com/software-mansion/react-native-reanimated/issues/7493) -- E/App issues: [#82611](https://github.com/Expensify/App/issues/82611) [#93833](https://github.com/Expensify/App/issues/93833) -- PR introducing patch: [#84303](https://github.com/Expensify/App/pull/84303) (original 0.85.3 patch) and [#98604](https://github.com/Expensify/App/pull/98604) (restored `updateOverflowInset` on 0.86.0) -- 0.86.0 migration note: RN 0.86.0 upstreamed the `getNullableViewState` + soft-log guard for `addViewAt`, `updateProps`, `updateLayout`, and `removeViewAt`, which is why the 0.85.3 patch was dropped during the upgrade, but it did not include the corresponding `updateOverflowInset`, `updatePadding`, or `updateState` guards. All three are patched here. Re-check these methods during the RN 0.87 upgrade and drop this patch once the adopted React Native release contains them upstream. - -### [react-native+0.86.0+039+persist-change-bundle-location.patch](react-native+0.86.0+039+persist-change-bundle-location.patch) - -- Reason: Backports React Native's Android fix for persisting the host selected through `Change Bundle Location`. The setting is written to the existing `debug_http_host` preference, restored after process restarts, and removed when the host is reset. This replaces the HybridApp-specific lifecycle workaround and can be removed after upgrading to React Native 0.88 or later. -- Upstream PR/issue: [facebook/react-native#57425](https://github.com/facebook/react-native/pull/57425) / [d2ac1904118](https://github.com/facebook/react-native/commit/d2ac190411877e7a1bc94ffac346c5fd35b65a7c) -- E/App issue: N/A -- PR introducing patch: https://github.com/Expensify/Mobile-Expensify/pull/14058 - -### [react-native+0.86.0+040+fix-android15-text-clipping.patch](react-native+0.86.0+040+fix-android15-text-clipping.patch) +### [react-native+0.88.0+032+fix-android15-text-clipping.patch](react-native+0.88.0+032+fix-android15-text-clipping.patch) - Reason: Backports upstream's fix for Android 15+ text clipping. `TextLayoutManager` sized text layouts from `ceil(Layout.getDesiredWidth(...))`, which sums glyph *advances* only; on Android 15+ a line's visual glyph bounds can exceed that, so the layout ends up a fraction of a pixel too narrow. Line breaking is a step function, so that shortfall moves a whole trailing word onto a second line inside a view whose height was computed for one line, and that line is clipped: the word disappears with no ellipsis and no change in row height. The patch adds a `getDesiredWidth` helper that, on API 35+, builds a probe `StaticLayout` with `setUseBoundsForWidth(true)` and returns `max(advanceWidth, ceil(visualBoundsWidth))`, so the desired width can never shrink below the previous value. Only the `AT_MOST` and `UNDEFINED` measure modes are affected; `EXACTLY` still uses the width Yoga supplies, and the final layout keeps the existing advance-based bounds mode — which is what got the earlier blanket `setUseBoundsForWidth` attempt reverted in [5964a197](https://github.com/facebook/react-native/commit/5964a197) after multiline and wrapping regressions. - Why this rather than reverting `LINEAR_TEXT_FLAG`: RN 0.86 made `Paint.LINEAR_TEXT_FLAG` unconditional ([#56409](https://github.com/facebook/react-native/pull/56409)) — the `enableAndroidLinearText` flag it deleted defaulted to `false` in OSS, so 0.85.3 never set it. Disabling hinting shifts glyph advance widths by a fraction of a pixel, widening the advance-vs-visual-bounds gap and pushing borderline strings over the wrapping threshold; that is why the bug presents as a 0.85.3 → 0.86.0 regression. Reverting the flag was verified to fix the reported cases too, but it only removes the amplifier — the advance-based measurement stays wrong and borderline strings can still wrap. This patch fixes the measurement itself, keeps 0.86's intended text rendering, and is not a deviation from upstream. @@ -334,76 +282,44 @@ - PR introducing patch: https://github.com/Expensify/App/pull/99069 - Reproduction: Android 16, custom font, non-default font scale *and* non-default display density — e.g. `wm size 1080x2340`, `wm density 420` (physical 450), `settings put system font_scale 0.8`, matching the Galaxy S25 FE the bug was reported on. The layout must be re-mounted (navigate forward, then back) before the clipping appears. Devices at their physical density are far less likely to hit it: at 450 dpi a 1080 px screen is exactly 384 dp, while the 420 dpi override makes it 411.428571… dp, so every derived width carries a fractional residue for `ceil`/`floor` to disagree on. - Upstream history: this is upstream's *third* attempt at the same bug. [#54721](https://github.com/facebook/react-native/pull/54721) (commit [8347cc4b5](https://github.com/facebook/react-native/commit/8347cc4b50ca9229b638d0823d3148fed50b9a61)) closed [#53286](https://github.com/facebook/react-native/issues/53286) in December 2025 by calling `setUseBoundsForWidth(true)` on the final `StaticLayout`, but it was gated behind `fixTextClippingAndroid15useBoundsForWidth`, which **defaulted to `false` in OSS** — so 0.85.3 never ran it. RN 0.86.0 removed the flag and both call sites after multiline and wrapping regressions, leaving only the now-unused `setUseBoundsForWidthMethod` reflection handle in `TextLayoutManager` (which this patch reuses). The bug was refiled as [#56402](https://github.com/facebook/react-native/issues/56402) and is still open. #57117 is the narrower retry: the visual-bounds layout is only a measurement probe, so the final layout keeps advance-based bounds. **Because the two earlier attempts were reverted for wrapping regressions specifically, wrapping is the thing to regression-test on Android 15+.** -- 0.86.0 migration note: **upstream #57117 is still open and has not been reviewed by Meta.** Re-evaluate on the RN 0.87 upgrade and drop this patch once the fix lands upstream. Two things to weigh before shipping: the probe layout costs one extra `StaticLayout` build per text measure on API 35+ for `AT_MOST`/`UNDEFINED`, on a hot path; and widening measured text can change wrapping app-wide on Android 15+. The upstream diff's `TextLayoutManagerAbsoluteLayoutWithFractionalPixelTest.kt` hunks are omitted because the npm package does not ship `ReactAndroid/src/test`. +- Removal: drop this patch once #57117 (still open) or an equivalent fix lands in the adopted React Native release. -### [react-native+0.86.0+041+ios-responder-ignore-scroll.patch](react-native+0.86.0+041+ios-responder-ignore-scroll.patch) +### [react-native+0.88.0+033+clamp-blob-range-APP-KDN.patch](react-native+0.88.0+033+clamp-blob-range-APP-KDN.patch) -- Reason: On iOS a tap could be silently cancelled when the list scrolled underneath it, even if the scroll moved nothing. React Native negotiates for the touch on every scroll event unless the event carries `responderIgnoreScroll`, and `ScrollView` claims it whenever a finger is down. iOS never sent that key, Android always has, which is why only iOS was affected. This adds the field to `ScrollEvent` and sets it on iOS from `_isUserTriggeredScrolling`, so a real drag still cancels a press as before, and does the same for text inputs, the only other source of these events on iOS. Merged upstream on 2026-08-20 but after the 0.87 cut, so it first ships in React Native 0.88.0 and **this patch can be dropped on that upgrade**. The upstream commit also updates a `types_DEPRECATED/` declaration, omitted because that directory is not shipped in the npm package. -- Upstream PR/issue: https://github.com/react/react-native/pull/57546 (merged as `06eb1fe`) -- E/App issue: https://github.com/Expensify/App/issues/97127 -- PR introducing patch: https://github.com/Expensify/App/pull/98095 - -### [react-native+0.86.0+042+fix-jsi-string-truncated-at-nul-APP-KDN.patch](react-native+0.86.0+042+fix-jsi-string-truncated-at-nul-APP-KDN.patch) - -- Reason: Strings crossing the JS/native boundary were truncated at the first NUL byte, because the converters passed `.c_str()` to NUL-terminated C-string APIs (`stringWithUTF8String:`, `stringWithCString:`, `NewStringUTF`) instead of using the byte length they already had. That is the producer behind the APP-KDN crash: `BlobManager.js` records the blob's `size` from the whole string, native stores the truncated bytes, and `subdataWithRange:` then overruns the stored data the next time that blob is used as a part of another blob. Backports upstream's fix, which replaces those calls with length-aware equivalents — `initWithBytes:length:encoding:` and `dataUsingEncoding:` on iOS, UTF-16 in both directions on Android. -- Blast radius: this covers **every** string argument crossing into a TurboModule on both platforms, plus Fabric text, not just blobs. Strings without NULs are unaffected; strings that previously arrived truncated now arrive whole. Two call sites (`convertJSIStringToNSString`, `RCTNSAttributedStringFragmentFromFragment`) now return `@""` where invalid UTF-8 previously gave `nil`, which is upstream's behaviour, not a deviation. -- Upstream PR/issue: [react/react-native#57906](https://github.com/react/react-native/pull/57906) (merged as [`5906cfb`](https://github.com/react/react-native/commit/5906cfb06085a4ae7ae2e5ac5bb190e0c1e90a42), fixes [#24129](https://github.com/react/react-native/issues/24129)) -- E/App issue: https://github.com/Expensify/App/issues/100843 -- PR introducing patch: this PR. -- 0.86.0 migration note: **drop this patch on the RN 0.88 upgrade** — `5906cfb` is absent from `v0.87.1` and ships in `v0.88.0`. Every hunk here is byte-identical to the 0.88 sources, so the drop needs no re-derivation. The commit's `React/Tests/Text/RCTAttributedTextUtilsTest.mm` hunks are omitted: that file ships in the npm package but is not part of any target the App builds, so patching it would add noise and test nothing. - -### [react-native+0.86.0+043+clamp-blob-range-APP-KDN.patch](react-native+0.86.0+043+clamp-blob-range-APP-KDN.patch) - -- Reason: Defence in depth for the same crash (APP-KDN, `NSRangeException: -[NSConcreteMutableData subdataWithRange:]: range {0, 321} exceeds data length 318`). `RCTBlobManager resolve:offset:size:` sliced the stored `NSData` with the JS-supplied offset and size without range-checking them, so any descriptor/data desync raised an `NSRangeException` on a background queue where no JS frame can catch it and the app dies. This clamps the range to the bytes actually stored and logs when it has to — an out-of-bounds offset returns `nil`, an oversized size is truncated — and adds the same logging to the silently-0-byte part paths in `createFromParts:withId:`. `size < 0` still means "the whole blob", preserving the existing `-1` contract. Android is already forgiving here ([`Arrays.copyOfRange`](https://github.com/facebook/react-native/blob/v0.86.0/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobModule.kt)), which is why the crash is iOS-only. -- Why both patches: patch 042 fixes the producer; on its own this one would turn the crash into silent data loss (a leading NUL resolves to 0 bytes and uploads as an empty attachment as if it had succeeded). It is here so any *future* desync degrades and logs instead of killing the app. `RCTLogWarn` rather than `RCTLogError` deliberately: this runs on a background queue and `RCTLogError` red-boxes on every occurrence in dev. +- Reason: Defence in depth for the APP-KDN crash (`NSRangeException: -[NSConcreteMutableData subdataWithRange:]: range {0, 321} exceeds data length 318`). `RCTBlobManager resolve:offset:size:` sliced the stored `NSData` with the JS-supplied offset and size without range-checking them, so any descriptor/data desync raised an `NSRangeException` on a background queue where no JS frame can catch it and the app dies. This clamps the range to the bytes actually stored and logs when it has to — an out-of-bounds offset returns `nil`, an oversized size is truncated — and adds the same logging to the silently-0-byte part paths in `createFromParts:withId:`. `size < 0` still means "the whole blob", preserving the existing `-1` contract. Android is already forgiving here ([`Arrays.copyOfRange`](https://github.com/facebook/react-native/blob/v0.86.0/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobModule.kt)), which is why the crash is iOS-only. +- Why it is still needed: React Native 0.88 fixes the producer ([`5906cfb`](https://github.com/react/react-native/commit/5906cfb06085a4ae7ae2e5ac5bb190e0c1e90a42)); without that fix this patch alone would turn the crash into silent data loss (a leading NUL resolves to 0 bytes and uploads as an empty attachment as if it had succeeded). It is here so any *future* desync degrades and logs instead of killing the app. `RCTLogWarn` rather than `RCTLogError` deliberately: this runs on a background queue and `RCTLogError` red-boxes on every occurrence in dev. - Upstream PR/issue: [react/react-native#58566](https://github.com/react/react-native/pull/58566) — open, not merged. Still unfixed in every release to date: `v0.88.0-rc.1` has the same unchecked `subdataWithRange:`. Re-check on each RN upgrade and drop this patch once the adopted release contains it. - E/App issue: https://github.com/Expensify/App/issues/100843 - PR introducing patch: this PR. -### [react-native+0.86.0+044+run-insertion-effect-cleanup-in-hidden-subtree.patch](react-native+0.86.0+044+run-insertion-effect-cleanup-in-hidden-subtree.patch) - -- Reason: Fabric skips the cleanup of `useInsertionEffect` when a component is removed while its `` is hidden (visible, then hidden, then removed), so whatever the effect registered leaks. react-dom 19.2 runs that cleanup. The renderer bundled with RN 0.86 is React 19.2.3 built with the `native-oss` feature flags, where `enableHiddenSubtreeInsertionEffectCleanup` stayed `false` after React flipped the default for react-dom, and React 19.3 removed the flag and runs the cleanup unconditionally. The patch drops the `offscreenSubtreeWasHidden` guard in front of the insertion cleanup in `commitDeletionEffectsOnFiber` of the dev, prod and profiling builds, which is exactly what the flag controlled. Hiding alone still leaves insertion effects untouched. `react-test-renderer` carries the same patch so jest matches the runtime. -- Upstream PR/issue: fix behind the flag in https://github.com/facebook/react/pull/30954, enabled for react-dom in https://github.com/facebook/react/pull/34372, flag removed in https://github.com/facebook/react/pull/35918. react-native `main` already ships the React 19.3 renderer with the unconditional cleanup; drop this patch when the adopted RN release does. -- E/App issue: https://github.com/Expensify/App/issues/98254 -- PR introducing patch: https://github.com/Expensify/App/pull/101577 - -### [react-native+0.86.0+045+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch](react-native+0.86.0+045+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch) +### [react-native+0.88.0+034+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch](react-native+0.88.0+034+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch) -- Reason: Fixes the fatal `IllegalStateException: Unable to add a view into a view that is not a ViewGroup` behind `APP-K0G`. `SurfaceMountingManager.addViewAt` throws when the parent tag has a `ViewState` whose view is null or not a `ViewGroup`. The usual source is a placeholder `ViewState` with no view, which `updateEventEmitter` creates for a tag Java no longer has; the next batch's `Insert` into that tag then throws, and `IntBufferBatchMountItem` is not retryable, so the app crashes. The crash kept firing after `+015` shipped in `9.4.93-3` (last seen on `9.4.94-0`), so the remaining sources (delayed deletes during touches, differ flatten/unflatten bugs, Reanimated-rewritten transactions) still reach it. The patch soft-logs a `ReactNoCrashSoftException` with the parent view class and skips the insert, which matches upstream's handling of the same condition in `removeViewAt` and the missing-`ViewState` case already handled a few lines above in `addViewAt`. The child may be missing until the next render that rebuilds that parent, instead of the app crashing. +- Reason: Fixes the fatal `IllegalStateException: Unable to add a view into a view that is not a ViewGroup` behind `APP-K0G`. `SurfaceMountingManager.addViewAt` throws when the parent tag has a `ViewState` whose view is null or not a `ViewGroup`. The usual source is a placeholder `ViewState` with no view, which `updateEventEmitter` creates for a tag Java no longer has; the next batch's `Insert` into that tag then throws, and `IntBufferBatchMountItem` is not retryable, so the app crashes. The crash kept firing after `+013` shipped in `9.4.93-3` (last seen on `9.4.94-0`), so the remaining sources (delayed deletes during touches, differ flatten/unflatten bugs, Reanimated-rewritten transactions) still reach it. The patch soft-logs a `ReactNoCrashSoftException` with the parent view class and skips the insert, which matches upstream's handling of the same condition in `removeViewAt` and the missing-`ViewState` case already handled a few lines above in `addViewAt`. The child may be missing until the next render that rebuilds that parent, instead of the app crashing. - Upstream PR/issue: [react-native@3f553d7](https://github.com/react/react-native/commit/3f553d76bc3f4f57e62653d11bab415a21cd02a8) (same change for `removeViewAt`), [react-native#58526](https://github.com/react/react-native/issues/58526) (placeholder `ViewState` from `updateEventEmitter`), [react-native#58527](https://github.com/react/react-native/pull/58527) (open, guards only the child) - E/App issue: https://github.com/Expensify/App/issues/102741 - PR introducing patch: https://github.com/Expensify/App/pull/102901 -- 0.86.0 migration note: drop this patch once the adopted React Native release no longer throws for a non-`ViewGroup` parent in `addViewAt`. Re-check on the RN 0.87 upgrade. +- Removal: drop this patch once the adopted React Native release soft-fails a null or non-`ViewGroup` parent in `addViewAt`. -### [react-native+0.86.0+046+fix-differ-nested-flatten-moved-view.patch](react-native+0.86.0+046+fix-differ-nested-flatten-moved-view.patch) +### [react-native+0.88.0+035+fix-differ-nested-flatten-moved-view.patch](react-native+0.88.0+035+fix-differ-nested-flatten-moved-view.patch) -- Reason: Backports an upstream differ fix. When a view flattens in the same commit in which its parent unflattens, and one of its children has a negative `zIndex`, the differ creates that child again while it is still mounted, or deletes it even though it only moves. The patch makes the final create/delete loop in `calculateShadowViewMutationsFlattener` also skip candidates whose tag the recursion recorded in the sub-visited map, and stops `unvisitedRecursiveChildPairs` from storing a pointer to a loop-local copy. Mutations like these leave the native tree out of sync with the shadow tree, which is one of the sources of the Android Fabric mount crashes tracked in `APP-K0G`, `APP-7AR`, and `APP-H7A`. The only change from upstream is `find(...) != end()` in place of `contains(...)`, because 0.86.0's `DiffMap` has no `contains`. +- Reason: Backports an upstream differ fix. When a view flattens in the same commit in which its parent unflattens, and one of its children has a negative `zIndex`, the differ creates that child again while it is still mounted, or deletes it even though it only moves. The patch makes the final create/delete loop in `calculateShadowViewMutationsFlattener` also skip candidates whose tag the recursion recorded in the sub-visited map, and stops `unvisitedRecursiveChildPairs` from storing a pointer to a loop-local copy. Mutations like these leave the native tree out of sync with the shadow tree, which is one of the sources of the Android Fabric mount crashes tracked in `APP-K0G`, `APP-7AR`, and `APP-H7A`. The only change from upstream is `find(...) != end()` in place of `contains(...)`, which is equivalent. - Upstream PR/issue: [react-native#58648](https://github.com/react/react-native/pull/58648) / [react-native@361bc24](https://github.com/react/react-native/commit/361bc240e42fb4db0568c1d411116c6bf8f7049d), issue [react-native#58647](https://github.com/react/react-native/issues/58647) - E/App issue: https://github.com/Expensify/App/issues/102741 - PR introducing patch: https://github.com/Expensify/App/pull/102901 -- 0.86.0 migration note: drop this patch once the adopted React Native release contains `361bc24`. +- Removal: drop this patch once the adopted React Native release contains `361bc24` (0.88.0 does not). -### [react-native+0.86.0+047+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch](react-native+0.86.0+047+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch) +### [react-native+0.88.0+036+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch](react-native+0.88.0+036+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch) -- Reason: Fixes the fatal `IllegalStateException: Unable to remove a view from a view that is not a ViewGroup` behind `APP-H7A`. `SurfaceMountingManager.removeViewAt` throws when the parent tag has a `ViewState` whose view is null or not a `ViewGroup`. It is the `Remove` counterpart of `APP-K0G` (`+045`), with the same sources: a placeholder `ViewState` with no view created by `updateEventEmitter`, delayed deletes during touches, and differ flatten/unflatten bugs (`+046` closes one of them). `IntBufferBatchMountItem` is not retryable, so the throw kills the app. A view that is not a `ViewGroup` cannot hold children, so the removal is a no-op. The patch soft-logs a `ReactNoCrashSoftException` with the parent view class and returns, which is the upstream fix. If the child is still attached to a stale native parent, the next `addViewAt` of that child already detaches it (the "View already has a parent" branch), so nothing crashes later. The log message keeps 0.86.0's wording and adds `ParentView` the same way `+045` does. Unlike upstream, the patch also covers a null `parentView`: 0.86.0 has no `checkNotNull(parentView)` before this check, so null falls into the same branch, while upstream still crashes on it. +- Reason: Fixes the fatal `IllegalStateException: Unable to remove a view from a view that is not a ViewGroup` behind `APP-H7A`. `SurfaceMountingManager.removeViewAt` throws when the parent tag has a `ViewState` whose view is null or not a `ViewGroup`. It is the `Remove` counterpart of `APP-K0G` (`+034`), with the same sources: a placeholder `ViewState` with no view created by `updateEventEmitter`, delayed deletes during touches, and differ flatten/unflatten bugs (`+035` closes one of them). `IntBufferBatchMountItem` is not retryable, so the throw kills the app. A view that is not a `ViewGroup` cannot hold children, so the removal is a no-op. React Native 0.88.0 already soft-fails a non-`ViewGroup` parent (`3f553d7`), but keeps a `checkNotNull(parentView)` right before that check, so a null `parentView` (the placeholder `ViewState` from [react-native#58526](https://github.com/react/react-native/issues/58526)) still crashes. The patch removes that `checkNotNull` and makes the class-name lookup in upstream's log message null-safe, so a null parent takes the same soft-fail branch. If the child is still attached to a stale native parent, the next `addViewAt` of that child already detaches it (the "View already has a parent" branch), so nothing crashes later. - Upstream PR/issue: [react-native#57860](https://github.com/react/react-native/pull/57860) / [react-native@3f553d7](https://github.com/react/react-native/commit/3f553d76bc3f4f57e62653d11bab415a21cd02a8) - E/App issue: https://github.com/Expensify/App/issues/103369 - PR introducing patch: https://github.com/Expensify/App/pull/103447 -- 0.86.0 migration note: the adopted release containing `3f553d7` is not enough to drop this patch. `0.87.0` still throws here and already has `checkNotNull(parentView)` right before this check. `0.88` soft-fails a non-`ViewGroup` parent but keeps that `checkNotNull`, so a null `parentView` (the placeholder `ViewState` from [react-native#58526](https://github.com/react/react-native/issues/58526)) still crashes. On the 0.88 upgrade, reduce it to soft-failing the `checkNotNull` only. Drop it once upstream handles a null `parentView` in `removeViewAt`. +- Removal: drop this patch once upstream handles a null `parentView` in `removeViewAt`. -### [react-native+0.86.0+048+fix-hermes-tarball-root-after-repo-move.patch](react-native+0.86.0+048+fix-hermes-tarball-root-after-repo-move.patch) +### [react-native+0.88.0+037+fix-hermes-tarball-root-after-repo-move.patch](react-native+0.88.0+037+fix-hermes-tarball-root-after-repo-move.patch) - Reason: Fixes Android builds that compile React Native from source (the artifacts publish workflow, any build that misses the prebuilt artifacts, `BUILD_RN_FROM_SOURCE=1`) failing at `hermes-engine:configureBuildForHermes` with `The source directory ".../sdks/hermes" does not appear to contain CMakeLists.txt`. On 2026-10-28 `facebook/hermes` moved to `meta/hermes`. The old tarball URL still redirects, but GitHub names the archive's top-level folder `--`, so it is now `meta-hermes-/` and `unzipHermes` only flattened `facebook-hermes-*`, leaving the sources one level too deep. The patch is the upstream fix: download from `meta/hermes` and strip the single top-level folder whatever its name (`includeEmptyDirs = false` keeps the empty wrapper folder from being recreated), the same way `ReactAndroid/build.gradle.kts` extracts folly, fmt and fast_float. -- Upstream PR/issue: [react-native#59587](https://github.com/react/react-native/issues/59587) / [react-native#59589](https://github.com/react/react-native/pull/59589) ([react-native@f6a5042](https://github.com/react/react-native/commit/f6a5042c8)), merged to `main` on 2026-10-28, not in any `0.86.x` release (`0.86.3` predates the move) nor on `0.86-stable`. +- Upstream PR/issue: [react-native#59587](https://github.com/react/react-native/issues/59587) / [react-native#59589](https://github.com/react/react-native/pull/59589) ([react-native@f6a5042](https://github.com/react/react-native/commit/f6a5042c8)), merged to `main` on 2026-10-28. It is not in 0.88.0, which still downloads from `facebook/hermes` and only flattens `facebook-hermes-*`. - E/App issue: https://github.com/Expensify/App/issues/105383 - PR introducing patch: https://github.com/Expensify/App/pull/105381 -- 0.86.0 migration note: drop once we adopt a React Native release that contains `f6a5042`. Adding this patch changes the patches hash, so merging it republishes the prebuilt artifacts; that publish is also the first CI build from source since the move, so confirm it passes. - -### [react-native+0.86.0+049+fix-stale-mvcp-anchor-ios.patch](react-native+0.86.0+049+fix-stale-mvcp-anchor-ios.patch) - -- Reason: The report page goes blank after adding a second expense to a chat that is scrolled up, on iOS. `RCTScrollViewComponentView`'s `_adjustForMaintainVisibleContentPosition` never validates the anchor view it saved in `_prepareForMaintainVisibleScrollPosition`. Its only guard sits behind `ReactNativeFeatureFlags::enableViewCulling()`, which defaults to `false` in 0.86 and is not overridden in App — so the guard is dead code. When the list crosses the 250 px threshold, `maintainVisibleContentPosition` is disabled and re-enabled; flash-list patch 007 only passes the prop to the native ScrollView while it is enabled, so the prop is removed and re-added, and the first commit after it comes back reuses whatever anchor iOS saved last time. A nil or recycled anchor reads `frame.origin.y == 0` against a recorded 1,000,000 (where flash-list parks its `ScrollAnchor`), giving a `deltaY` of roughly −1,000,000. The list ends up parked where nothing is materialized: a blank page. This patch replaces the flag-gated block with the three unconditional abort conditions upstream added — nil, tag (view recycled), and superview (view deleted) — which is also what Android already does. -- Blast radius: iOS only, and confined to the MVCP adjustment path. The new conditions can only cause an early `return`, i.e. skip a scroll-offset correction that would have been computed from an invalid anchor. Cases where the anchor is still valid are unchanged. -- Upstream PR/issue: [react/react-native#57294](https://github.com/react/react-native/pull/57294) — landed as [`3b90423`](https://github.com/facebook/react-native/commit/3b90423076cfa5d5310bb0190cd1abb69f72dc40) (the PR shows as closed because it was imported through Meta's internal system rather than merged directly), fixes [#25239](https://github.com/facebook/react-native/issues/25239). -- E/App issue: https://github.com/Expensify/App/issues/100303 -- PR introducing patch: this PR. -- 0.86.0 migration note: **drop this patch on the RN 0.88 upgrade** — the unconditional `_firstVisibleView.tag` and `superview` guards are present in `0.88-stable` and absent from `v0.87.1`, which still has only the `enableViewCulling()`-gated check. +- Removal: drop this patch once the adopted React Native release contains `f6a5042`. diff --git a/patches/react-native/react-native+0.86.0+001+initial.patch b/patches/react-native/react-native+0.86.0+001+initial.patch deleted file mode 100644 index 1f63ad379aaf..000000000000 --- a/patches/react-native/react-native+0.86.0+001+initial.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff --git a/node_modules/react-native/React/Views/RCTModalHostViewManager.m b/node_modules/react-native/React/Views/RCTModalHostViewManager.m -index eccf05f..e2ae7e2 100644 ---- a/node_modules/react-native/React/Views/RCTModalHostViewManager.m -+++ b/node_modules/react-native/React/Views/RCTModalHostViewManager.m -@@ -64,6 +64,13 @@ - (void)presentModalHostView:(RCTModalHostView *)modalHostView - if (self->_presentationBlock) { - self->_presentationBlock([modalHostView reactViewController], viewController, animated, completionBlock); - } else { -+ // In our App, If an input is blurred and a modal is opened, the rootView will become the firstResponder, which -+ // will cause system to retain a wrong keyboard state, and then the keyboard to flicker when the modal is closed. -+ // We first resign the rootView to avoid this problem. -+ UIWindow *window = RCTKeyWindow(); -+ if (window && window.rootViewController && [window.rootViewController.view isFirstResponder]) { -+ [window.rootViewController.view resignFirstResponder]; -+ } - [[modalHostView reactViewController] presentViewController:viewController - animated:animated - completion:completionBlock]; diff --git a/patches/react-native/react-native+0.86.0+006+disableNonTranslucentStatusBar.patch b/patches/react-native/react-native+0.86.0+006+disableNonTranslucentStatusBar.patch deleted file mode 100644 index fedfe544f353..000000000000 --- a/patches/react-native/react-native+0.86.0+006+disableNonTranslucentStatusBar.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/node_modules/react-native/Libraries/Components/StatusBar/StatusBar.js b/node_modules/react-native/Libraries/Components/StatusBar/StatusBar.js -index 2ac3d1f..5a400bf 100644 ---- a/node_modules/react-native/Libraries/Components/StatusBar/StatusBar.js -+++ b/node_modules/react-native/Libraries/Components/StatusBar/StatusBar.js -@@ -479,8 +479,7 @@ class StatusBar extends React.Component { - } - // Activities are not translucent by default, so always set if true. - if ( -- !oldProps || -- oldProps.translucent !== mergedProps.translucent || -+ (oldProps && oldProps.translucent !== mergedProps.translucent) || - mergedProps.translucent - ) { - NativeStatusBarManagerAndroid.setTranslucent(mergedProps.translucent); diff --git a/patches/react-native/react-native+0.86.0+025+fix-display-contents-dirty-flag.patch b/patches/react-native/react-native+0.86.0+025+fix-display-contents-dirty-flag.patch deleted file mode 100644 index c8ab532b98b2..000000000000 --- a/patches/react-native/react-native+0.86.0+025+fix-display-contents-dirty-flag.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp -index bd327ef..a51c45d 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp -+++ b/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp -@@ -118,6 +118,9 @@ YogaLayoutableShadowNode::YogaLayoutableShadowNode( - if (auto layoutableChild = - std::dynamic_pointer_cast( - child)) { -+ if (static_cast(layoutableChild->yogaNode_.style().display()) == YGDisplayContents) { -+ yogaNode_.setDirty(true); -+ } - yogaLayoutableChildren_.push_back(std::move(layoutableChild)); - } - } diff --git a/patches/react-native/react-native+0.86.0+028+fix-turbomodule-event-emitter-uaf.patch b/patches/react-native/react-native+0.86.0+028+fix-turbomodule-event-emitter-uaf.patch deleted file mode 100644 index 1fb90269518d..000000000000 --- a/patches/react-native/react-native+0.86.0+028+fix-turbomodule-event-emitter-uaf.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff --git a/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp b/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp -index 5c9b464..5766844 100644 ---- a/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp -+++ b/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp -@@ -982,12 +982,17 @@ void JavaTurboModule::configureEventEmitterCallback() { - FACEBOOK_JNI_THROW_PENDING_EXCEPTION(); - } - -- auto callback = JCxxCallbackImpl::newObjectCxxArgs([&](folly::dynamic args) { -- auto eventName = args.at(0).asString(); -- auto& eventEmitter = static_cast&>( -- *eventEmitterMap_[eventName].get()); -- eventEmitter.emit(args.size() > 1 ? std::move(args).at(1) : nullptr); -- }); -+ auto emitterMap = eventEmitterMap_; -+ auto callback = -+ JCxxCallbackImpl::newObjectCxxArgs([emitterMap](folly::dynamic args) { -+ auto eventName = args.at(0).asString(); -+ auto it = emitterMap.find(eventName); -+ if (it != emitterMap.end() && it->second) { -+ auto& eventEmitter = -+ static_cast&>(*it->second); -+ eventEmitter.emit(args.size() > 1 ? std::move(args).at(1) : nullptr); -+ } -+ }); - - jvalue args[1]; - args[0].l = callback.release(); diff --git a/patches/react-native/react-native+0.86.0+033+fix-runtime-scheduler-delegate-uaf-APP-25V.patch b/patches/react-native/react-native+0.86.0+033+fix-runtime-scheduler-delegate-uaf-APP-25V.patch deleted file mode 100644 index 8b1c7f7aee33..000000000000 --- a/patches/react-native/react-native+0.86.0+033+fix-runtime-scheduler-delegate-uaf-APP-25V.patch +++ /dev/null @@ -1,68 +0,0 @@ -diff --git a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp -index 7ea5fc3..b30a23f 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp -+++ b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp -@@ -176,10 +176,7 @@ Scheduler::~Scheduler() { - // captured a raw delegate_ pointer; without this they'd dereference a - // dangling SchedulerDelegate after Scheduler teardown. (No replacement - // token is allocated here — Scheduler is going away.) -- // Gated to allow controlled rollout / rollback. -- if (ReactNativeFeatureFlags::enableSchedulerDelegateInvalidation()) { -- *delegateInvalidated_ = true; -- } -+ *delegateInvalidated_ = true; - - auto weakRuntimeScheduler = - contextContainer_->find>( -@@ -270,9 +267,7 @@ Scheduler::findComponentDescriptorByHandle_DO_NOT_USE_THIS_IS_BROKEN( - #pragma mark - Delegate - - void Scheduler::setDelegate(SchedulerDelegate* delegate) { -- // Gated to allow controlled rollout / rollback. -- if (ReactNativeFeatureFlags::enableSchedulerDelegateInvalidation() && -- delegate_ != delegate) { -+ if (delegate_ != delegate) { - // Mark the *current* token invalid: any rendering-update lambda already - // queued holds a shared_ptr to this atomic and will observe `true` on - // its next read, so it no-ops instead of calling into the previous -@@ -313,19 +308,12 @@ void Scheduler::uiManagerDidFinishTransaction( - if (!mountSynchronously) { - auto surfaceId = mountingCoordinator->getSurfaceId(); - -- // Capture the gating flag at queue time: the lambda's decision to -- // honor the invalidation guard is fixed when we enqueue, not when it -- // later runs. Avoids per-invocation feature-flag reads and keeps the -- // contract for an in-flight lambda stable across flag flips. -- auto guardEnabled = -- ReactNativeFeatureFlags::enableSchedulerDelegateInvalidation(); - runtimeScheduler_->scheduleRenderingUpdate( - surfaceId, - [delegate = delegate_, - invalidated = delegateInvalidated_, -- guardEnabled, - mountingCoordinator = std::move(mountingCoordinator)]() { -- if (guardEnabled && *invalidated) { -+ if (*invalidated) { - return; - } - delegate->schedulerShouldRenderTransactions(mountingCoordinator); -@@ -350,18 +338,14 @@ void Scheduler::uiManagerDidDispatchCommand( - "Scheduler::uiManagerDispatchCommand", "commandName", commandName); - if (delegate_ != nullptr) { - auto shadowView = ShadowView(*shadowNode); -- // See comment in uiManagerDidFinishTransaction above for gating shape. -- auto guardEnabled = -- ReactNativeFeatureFlags::enableSchedulerDelegateInvalidation(); - runtimeScheduler_->scheduleRenderingUpdate( - shadowNode->getSurfaceId(), - [delegate = delegate_, - invalidated = delegateInvalidated_, -- guardEnabled, - shadowView = std::move(shadowView), - commandName, - args]() { -- if (guardEnabled && *invalidated) { -+ if (*invalidated) { - return; - } - delegate->schedulerDidDispatchCommand(shadowView, commandName, args); diff --git a/patches/react-native/react-native+0.86.0+036+fix-find-shadow-node-uaf-APP-HNA.patch b/patches/react-native/react-native+0.86.0+036+fix-find-shadow-node-uaf-APP-HNA.patch deleted file mode 100644 index fd2675736a86..000000000000 --- a/patches/react-native/react-native+0.86.0+036+fix-find-shadow-node-uaf-APP-HNA.patch +++ /dev/null @@ -1,44 +0,0 @@ -diff --git a/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp b/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp ---- a/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp -+++ b/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp -@@ -522,30 +522,16 @@ std::shared_ptr UIManager::findShadowNodeByTag_DEPRECATED( - auto shadowNode = std::shared_ptr{}; - - shadowTreeRegistry_.enumerate([&](const ShadowTree& shadowTree, bool& stop) { -- // Obtain a pointer to the root node. The flag-gated path uses -- // getCurrentRevision() which keeps the root alive via shared_ptr for -- // the entire traversal, fixing a use-after-free race condition. -- RootShadowNode::Shared rootShadowNodeHolder; -- const RootShadowNode* rootShadowNode = nullptr; -- if (ReactNativeFeatureFlags::fixFindShadowNodeByTagRaceCondition()) { -- rootShadowNodeHolder = shadowTree.getCurrentRevision().rootShadowNode; -- rootShadowNode = rootShadowNodeHolder.get(); -- } else { -- // TODO(T257154369): Remove after flag rollout. -- // The public interface of `ShadowTree` discourages accessing a stored -- // pointer to a root node because of the possible data race. -- // To work around this, we ask for a commit and immediately cancel it -- // returning `nullptr` instead of a new shadow tree. -- // We don't want to add a way to access a stored pointer to a root -- // node because this `findShadowNodeByTag` is deprecated. It is only -- // added to make migration to the new architecture easier. -- shadowTree.tryCommit( -- [&](const RootShadowNode& oldRootShadowNode) { -- rootShadowNode = &oldRootShadowNode; -- return nullptr; -- }, -- {/* default commit options */}); -- } -+ // APP-HNA: Always keep the root node alive via a shared_ptr for the entire -+ // traversal to avoid a use-after-free race (SIGSEGV crash in -+ // findShadowNodeByTagRecursively when the shadow subtree is torn down on a -+ // background thread mid-traversal). This unconditionally enables the safe -+ // behavior that upstream React Native gates behind the -+ // `fixFindShadowNodeByTagRaceCondition` feature flag. Remove this patch once -+ // that flag is enabled by default upstream. -+ RootShadowNode::Shared rootShadowNodeHolder = -+ shadowTree.getCurrentRevision().rootShadowNode; -+ const RootShadowNode* rootShadowNode = rootShadowNodeHolder.get(); - - if (rootShadowNode != nullptr) { - const auto& children = rootShadowNode->getChildren(); diff --git a/patches/react-native/react-native+0.86.0+037+fix-stale-font-scale.patch b/patches/react-native/react-native+0.86.0+037+fix-stale-font-scale.patch deleted file mode 100644 index 5957f12794d1..000000000000 --- a/patches/react-native/react-native+0.86.0+037+fix-stale-font-scale.patch +++ /dev/null @@ -1,246 +0,0 @@ -diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp -index c0f5dab..0a09558 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp -+++ b/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp -@@ -469,6 +469,7 @@ void YogaLayoutableShadowNode::updateYogaProps() { - - void YogaLayoutableShadowNode::configureYogaTree( - float pointScaleFactor, -+ Float fontSizeMultiplier, - YGErrata defaultErrata, - bool swapLeftAndRight) { - ensureUnsealed(); -@@ -478,6 +479,18 @@ void YogaLayoutableShadowNode::configureYogaTree( - YGConfigSetErrata(&yogaConfig_, errata); - YGConfigSetPointScaleFactor(&yogaConfig_, pointScaleFactor); - -+ // A measurable node's measurement depends on `fontSizeMultiplier`, but unlike -+ // `pointScaleFactor` it is not part of the Yoga config, so a change does not -+ // invalidate Yoga's layout cache. Dirty the node when it changes to force -+ // re-measurement. We propagate up to the root so an unchanged, still-cached -+ // ancestor isn't skipped by `calculateLayoutInternal` before reaching us. -+ if (ReactNativeFeatureFlags::enableFontScaleChangesUpdatingLayout() && -+ getTraits().check(ShadowNodeTraits::Trait::MeasurableYogaNode) && -+ !floatEquality( -+ getLayoutMetrics().fontSizeMultiplier, fontSizeMultiplier)) { -+ yogaNode_.markDirtyAndPropagate(); -+ } -+ - // TODO: `swapLeftAndRight` modified backing props and cannot be undone - if (swapLeftAndRight) { - swapStyleLeftAndRight(); -@@ -496,6 +509,8 @@ void YogaLayoutableShadowNode::configureYogaTree( - - if (child.yogaTreeHasBeenConfigured_ && - childLayoutMetrics.pointScaleFactor == pointScaleFactor && -+ floatEquality( -+ childLayoutMetrics.fontSizeMultiplier, fontSizeMultiplier) && - childLayoutMetrics.wasLeftAndRightSwapped == swapLeftAndRight && - childErrata == child.resolveErrata(errata)) { - continue; -@@ -504,10 +519,13 @@ void YogaLayoutableShadowNode::configureYogaTree( - if (doesOwn(child)) { - auto& mutableChild = const_cast(child); - mutableChild.configureYogaTree( -- pointScaleFactor, child.resolveErrata(errata), swapLeftAndRight); -+ pointScaleFactor, -+ fontSizeMultiplier, -+ child.resolveErrata(errata), -+ swapLeftAndRight); - } else { - cloneChildInPlace(i).configureYogaTree( -- pointScaleFactor, errata, swapLeftAndRight); -+ pointScaleFactor, fontSizeMultiplier, errata, swapLeftAndRight); - } - } - } -@@ -604,6 +622,7 @@ void YogaLayoutableShadowNode::layoutTree( - TraceSection s2("YogaLayoutableShadowNode::configureYogaTree"); - configureYogaTree( - layoutContext.pointScaleFactor, -+ layoutContext.fontSizeMultiplier, - YGErrataAll /*defaultErrata*/, - swapLeftAndRight); - } -@@ -669,6 +688,7 @@ void YogaLayoutableShadowNode::layoutTree( - if (yogaNode_.getHasNewLayout()) { - auto layoutMetrics = layoutMetricsFromYogaNode(yogaNode_); - layoutMetrics.pointScaleFactor = layoutContext.pointScaleFactor; -+ layoutMetrics.fontSizeMultiplier = layoutContext.fontSizeMultiplier; - layoutMetrics.wasLeftAndRightSwapped = swapLeftAndRight; - setLayoutMetrics(layoutMetrics); - yogaNode_.setHasNewLayout(false); -@@ -716,6 +736,7 @@ void YogaLayoutableShadowNode::layout(LayoutContext layoutContext) { - - auto newLayoutMetrics = layoutMetricsFromYogaNode(*childYogaNode); - newLayoutMetrics.pointScaleFactor = layoutContext.pointScaleFactor; -+ newLayoutMetrics.fontSizeMultiplier = layoutContext.fontSizeMultiplier; - newLayoutMetrics.wasLeftAndRightSwapped = - layoutContext.swapLeftAndRightInRTL && - newLayoutMetrics.layoutDirection == LayoutDirection::RightToLeft; -diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.h b/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.h -index 25714d5..fff9c00 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.h -+++ b/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.h -@@ -137,7 +137,8 @@ class YogaLayoutableShadowNode : public LayoutableShadowNode { - * ShadowTree has been constructed, but before it has been is laid out or - * committed. - */ -- void configureYogaTree(float pointScaleFactor, YGErrata defaultErrata, bool swapLeftAndRight); -+ void -+ configureYogaTree(float pointScaleFactor, Float fontSizeMultiplier, YGErrata defaultErrata, bool swapLeftAndRight); - - /** - * Return an errata based on a `layoutConformance` prop if given, otherwise -diff --git a/node_modules/react-native/ReactCommon/react/renderer/core/LayoutMetrics.h b/node_modules/react-native/ReactCommon/react/renderer/core/LayoutMetrics.h -index 794f899..cb38378 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/core/LayoutMetrics.h -+++ b/node_modules/react-native/ReactCommon/react/renderer/core/LayoutMetrics.h -@@ -45,6 +45,10 @@ struct LayoutMetrics { - // Negative values indicate that children are clipped inside the node - // (like when using `overflow: clip` on Web). - EdgeInsets overflowInset{}; -+ // Surface font scale this node was last laid out with. Declared last so that -+ // positional aggregate initialization of the fields above (as done by -+ // @rnmapbox/maps) still binds each initializer to the intended field. -+ Float fontSizeMultiplier{1.0}; - - // Origin: the outer border of the node. - // Size: includes content only. -@@ -120,6 +124,7 @@ struct hash { - layoutMetrics.displayType, - layoutMetrics.layoutDirection, - layoutMetrics.pointScaleFactor, -+ layoutMetrics.fontSizeMultiplier, - layoutMetrics.overflowInset); - } - }; -diff --git a/node_modules/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp b/node_modules/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp -index 3d4adc6..930472f 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp -+++ b/node_modules/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp -@@ -9,7 +9,6 @@ - - #include - #include --#include - #include - - namespace facebook::react { -@@ -213,78 +212,6 @@ Size SurfaceHandler::measure( - return rootShadowNode->getLayoutMetrics().frame.size; - } - --std::shared_ptr SurfaceHandler::dirtyMeasurableNodesRecursive( -- std::shared_ptr node) const { -- const auto nodeHasChildren = !node->getChildren().empty(); -- const auto isMeasurableYogaNode = -- node->getTraits().check(ShadowNodeTraits::Trait::MeasurableYogaNode); -- -- // Node is not measurable and has no children, its layout will not be affected -- if (!nodeHasChildren && !isMeasurableYogaNode) { -- return nullptr; -- } -- -- std::shared_ptr>> -- newChildren = ShadowNodeFragment::childrenPlaceholder(); -- -- if (nodeHasChildren) { -- std::shared_ptr>> -- newChildrenMutable = nullptr; -- for (size_t i = 0; i < node->getChildren().size(); i++) { -- const auto& child = node->getChildren()[i]; -- -- if (const auto& layoutableNode = -- std::dynamic_pointer_cast( -- child)) { -- auto newChild = dirtyMeasurableNodesRecursive(layoutableNode); -- -- if (newChild != nullptr) { -- if (newChildrenMutable == nullptr) { -- newChildrenMutable = std::make_shared< -- std::vector>>( -- node->getChildren()); -- newChildren = newChildrenMutable; -- } -- -- (*newChildrenMutable)[i] = newChild; -- } -- } -- } -- -- // Node is not measurable and its children were not dirtied, its layout will -- // not be affected -- if (!isMeasurableYogaNode && newChildrenMutable == nullptr) { -- return nullptr; -- } -- } -- -- const auto newNode = node->getComponentDescriptor().cloneShadowNode( -- *node, -- { -- .children = newChildren, -- // Preserve the original state of the node -- .state = node->getState(), -- }); -- -- if (isMeasurableYogaNode) { -- std::static_pointer_cast(newNode)->dirtyLayout(); -- } -- -- return newNode; --} -- --void SurfaceHandler::dirtyMeasurableNodes(ShadowNode& root) const { -- for (const auto& child : root.getChildren()) { -- if (const auto& layoutableNode = -- std::dynamic_pointer_cast(child)) { -- const auto newChild = dirtyMeasurableNodesRecursive(layoutableNode); -- if (newChild != nullptr) { -- root.replaceChild(*child, newChild); -- } -- } -- } --} -- - void SurfaceHandler::constraintLayout( - const LayoutConstraints& layoutConstraints, - const LayoutContext& layoutContext) const { -@@ -315,19 +242,8 @@ void SurfaceHandler::constraintLayout( - link_.shadowTree && "`link_.shadowTree` must not be null."); - link_.shadowTree->commit( - [&](const RootShadowNode& oldRootShadowNode) { -- auto newRoot = oldRootShadowNode.clone( -+ return oldRootShadowNode.clone( - propsParserContext, layoutConstraints, layoutContext); -- -- // Dirty all measurable nodes when the fontSizeMultiplier changes to -- // trigger re-measurement. -- if (ReactNativeFeatureFlags::enableFontScaleChangesUpdatingLayout() && -- layoutContext.fontSizeMultiplier != -- oldRootShadowNode.getConcreteProps() -- .layoutContext.fontSizeMultiplier) { -- dirtyMeasurableNodes(*newRoot); -- } -- -- return newRoot; - }, - {/* default commit options */}); - } -diff --git a/node_modules/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.h b/node_modules/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.h -index b031a51..93cfb22 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.h -+++ b/node_modules/react-native/ReactCommon/react/renderer/scheduler/SurfaceHandler.h -@@ -151,12 +151,6 @@ class SurfaceHandler { - - void applyDisplayMode(DisplayMode displayMode) const; - -- /* -- * An utility for dirtying all measurable shadow nodes present in the tree. -- */ -- void dirtyMeasurableNodes(ShadowNode &root) const; -- std::shared_ptr dirtyMeasurableNodesRecursive(std::shared_ptr node) const; -- - #pragma mark - Link & Parameters - - /* diff --git a/patches/react-native/react-native+0.86.0+038+log-soft-exception-if-viewState-not-found.patch b/patches/react-native/react-native+0.86.0+038+log-soft-exception-if-viewState-not-found.patch deleted file mode 100644 index 42523793e8d7..000000000000 --- a/patches/react-native/react-native+0.86.0+038+log-soft-exception-if-viewState-not-found.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt ---- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt -+++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt -@@ -873,8 +873,15 @@ internal constructor( - if (isStopped) { - return - } -- -+ -- val viewState = getViewState(reactTag) -+ val viewState = getNullableViewState(reactTag) -+ if (viewState == null) { -+ ReactSoftExceptionLogger.logSoftException( -+ ReactSoftExceptionLogger.Categories.SURFACE_MOUNTING_MANAGER_MISSING_VIEWSTATE, -+ ReactNoCrashSoftException("Unable to find viewState for tag $reactTag for updatePadding"), -+ ) -+ return -+ } - // Do not layout Root Views - if (viewState.isRoot) { - return -@@ -899,9 +906,18 @@ internal constructor( - if (isStopped) { - return - } - -- val viewState = getViewState(reactTag) -+ val viewState = getNullableViewState(reactTag) -+ if (viewState == null) { -+ ReactSoftExceptionLogger.logSoftException( -+ ReactSoftExceptionLogger.Categories.SURFACE_MOUNTING_MANAGER_MISSING_VIEWSTATE, -+ ReactNoCrashSoftException( -+ "Unable to find viewState for tag $reactTag for updateOverflowInset" -+ ), -+ ) -+ return -+ } - // Do not layout Root Views - if (viewState.isRoot) { - return - } -@@ -925,8 +941,15 @@ internal constructor( - if (isStopped) { - return - } -- -+ -- val viewState = getViewState(reactTag) -- -+ val viewState = getNullableViewState(reactTag) -+ if (viewState == null) { -+ ReactSoftExceptionLogger.logSoftException( -+ ReactSoftExceptionLogger.Categories.SURFACE_MOUNTING_MANAGER_MISSING_VIEWSTATE, -+ ReactNoCrashSoftException("Unable to find viewState for tag $reactTag for updateState"), -+ ) -+ return -+ } -+ - val prevStateWrapper = viewState.stateWrapper - viewState.stateWrapper = stateWrapper diff --git a/patches/react-native/react-native+0.86.0+039+persist-change-bundle-location.patch b/patches/react-native/react-native+0.86.0+039+persist-change-bundle-location.patch deleted file mode 100644 index 9250eb6cfda2..000000000000 --- a/patches/react-native/react-native+0.86.0+039+persist-change-bundle-location.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/PackagerConnectionSettings.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/PackagerConnectionSettings.kt -index 72fda13..24880b2 100644 ---- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/PackagerConnectionSettings.kt -+++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/PackagerConnectionSettings.kt -@@ -21,7 +21,7 @@ public open class PackagerConnectionSettings(private val appContext: Context) { - public val packageName: String = appContext.packageName - - init { -- resetDebugServerHost() -+ _cachedOrOverrideHost = null - } - - public open var debugServerHost: String -@@ -50,13 +50,16 @@ public open class PackagerConnectionSettings(private val appContext: Context) { - } - set(host) { - if (host.isEmpty()) { -+ preferences.edit().remove(PREFS_DEBUG_SERVER_HOST_KEY).apply() - _cachedOrOverrideHost = null - } else { -+ preferences.edit().putString(PREFS_DEBUG_SERVER_HOST_KEY, host).apply() - _cachedOrOverrideHost = host - } - } - - public open fun resetDebugServerHost() { -+ preferences.edit().remove(PREFS_DEBUG_SERVER_HOST_KEY).apply() - _cachedOrOverrideHost = null - } - diff --git a/patches/react-native/react-native+0.86.0+041+ios-responder-ignore-scroll.patch b/patches/react-native/react-native+0.86.0+041+ios-responder-ignore-scroll.patch deleted file mode 100644 index 7967bab97dce..000000000000 --- a/patches/react-native/react-native+0.86.0+041+ios-responder-ignore-scroll.patch +++ /dev/null @@ -1,87 +0,0 @@ -diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm -index a087536..c52de75 100644 ---- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm -+++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm -@@ -590,6 +590,7 @@ - (BOOL)_shouldDisableScrollInteraction - metrics.containerSize = RCTSizeFromCGSize(_scrollView.bounds.size); - metrics.zoomScale = _scrollView.zoomScale; - metrics.timestamp = CACurrentMediaTime(); -+ metrics.responderIgnoreScroll = !_isUserTriggeredScrolling; - - if (_layoutMetrics.layoutDirection == LayoutDirection::RightToLeft) { - metrics.contentOffset.x = metrics.contentSize.width - metrics.containerSize.width - metrics.contentOffset.x; -diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -index 58ec8ec..2c3f9c0 100644 ---- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -+++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -@@ -565,7 +565,9 @@ - (void)textInputDidPaste:(NSString *)type withData:(NSString *)data - - (void)scrollViewDidScroll:(UIScrollView *)scrollView - { - if (_eventEmitter) { -- static_cast(*_eventEmitter).onScroll([self _textInputMetrics]); -+ auto metrics = [self _textInputMetrics]; -+ metrics.responderIgnoreScroll = !(scrollView.isDragging || scrollView.isDecelerating); -+ static_cast(*_eventEmitter).onScroll(metrics); - } - } - -diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.cpp -index 7adacc5..5307df6 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.cpp -+++ b/node_modules/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.cpp -@@ -44,6 +44,7 @@ jsi::Value ScrollEvent::asJSIValue(jsi::Runtime& runtime) const { - - payload.setProperty(runtime, "zoomScale", zoomScale); - payload.setProperty(runtime, "timestamp", timestamp * 1000); -+ payload.setProperty(runtime, "responderIgnoreScroll", responderIgnoreScroll); - - return payload; - } -@@ -67,7 +68,8 @@ folly::dynamic ScrollEvent::asDynamic() const { - "contentInset", std::move(contentInsetObj))( - "contentSize", std::move(contentSizeObj))( - "layoutMeasurement", std::move(containerSizeObj))( -- "zoomScale", zoomScale)("timestamp", timestamp * 1000); -+ "zoomScale", zoomScale)("timestamp", timestamp * 1000)( -+ "responderIgnoreScroll", responderIgnoreScroll); - - return metrics; - }; -diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.h b/node_modules/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.h -index fb2cd8b..c3fd958 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.h -+++ b/node_modules/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.h -@@ -21,6 +21,7 @@ struct ScrollEvent : public EventPayload { - EdgeInsets contentInset; - Size containerSize; - Float zoomScale{}; -+ bool responderIgnoreScroll{false}; - - /* - * The time in seconds when the touch occurred or when it was last mutated. -diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp -index 5cbcc60..4841983 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp -+++ b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp -@@ -86,6 +86,9 @@ static jsi::Value textInputMetricsScrollPayload( - "zoomScale", - textInputMetrics.zoomScale != 0.0f ? textInputMetrics.zoomScale : 1); - -+ payload.setProperty( -+ runtime, "responderIgnoreScroll", textInputMetrics.responderIgnoreScroll); -+ - return payload; - }; - -diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h -index c1118e3..e9daa32 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h -+++ b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h -@@ -27,6 +27,7 @@ class TextInputEventEmitter : public ViewEventEmitter { - int eventCount; - Size layoutMeasurement; - Float zoomScale; -+ bool responderIgnoreScroll{false}; - Tag target; - }; - diff --git a/patches/react-native/react-native+0.86.0+042+fix-jsi-string-truncated-at-nul-APP-KDN.patch b/patches/react-native/react-native+0.86.0+042+fix-jsi-string-truncated-at-nul-APP-KDN.patch deleted file mode 100644 index 1c811a2d5d26..000000000000 --- a/patches/react-native/react-native+0.86.0+042+fix-jsi-string-truncated-at-nul-APP-KDN.patch +++ /dev/null @@ -1,90 +0,0 @@ -diff --git a/node_modules/react-native/React/Fabric/RCTConversions.h b/node_modules/react-native/React/Fabric/RCTConversions.h ---- a/node_modules/react-native/React/Fabric/RCTConversions.h -+++ b/node_modules/react-native/React/Fabric/RCTConversions.h -@@ -35,4 +35,5 @@ - const NSStringEncoding &encoding = NSUTF8StringEncoding) - { -- return [NSString stringWithCString:string.c_str() encoding:encoding] ?: @""; -+ NSString *result = [[NSString alloc] initWithBytes:string.data() length:string.size() encoding:encoding]; -+ return result != nil ? result : @""; - } -@@ -47,4 +48,11 @@ - inline std::string RCTStringFromNSString(NSString *string) - { -- return std::string{string.UTF8String ?: ""}; -+ if (string == nil) { -+ return ""; -+ } -+ NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; -+ if (data == nil) { -+ return ""; -+ } -+ return std::string{static_cast(data.bytes), data.length}; - } -diff --git a/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp b/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp ---- a/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp -+++ b/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp -@@ -403,5 +403,7 @@ - "string", argIndex, methodName, arg, &rt); - } -- jarg->l = makeGlobalIfNecessary( -- env->NewStringUTF(arg->getString(rt).utf8(rt).c_str())); -+ auto utf16 = rt.utf16(arg->getString(rt)); -+ jarg->l = makeGlobalIfNecessary(env->NewString( -+ reinterpret_cast(utf16.data()), -+ static_cast(utf16.size()))); - } else if (type == "Lcom/facebook/react/bridge/Callback;") { -@@ -751,8 +753,11 @@ - jsi::Value returnValue = jsi::Value::null(); - if (returnString != nullptr) { -- const char* js = env->GetStringUTFChars(returnString, nullptr); -- std::string result = js; -- env->ReleaseStringUTFChars(returnString, js); -- returnValue = -- jsi::Value(runtime, jsi::String::createFromUtf8(runtime, result)); -+ jsize length = env->GetStringLength(returnString); -+ const jchar* chars = env->GetStringChars(returnString, nullptr); -+ auto jsiString = jsi::String::createFromUtf16( -+ runtime, -+ reinterpret_cast(chars), -+ static_cast(length)); -+ env->ReleaseStringChars(returnString, chars); -+ returnValue = jsi::Value(runtime, jsiString); - } -diff --git a/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm b/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm ---- a/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm -+++ b/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm -@@ -111,4 +111,6 @@ - static NSString *convertJSIStringToNSString(jsi::Runtime &runtime, const jsi::String &value) - { -- return [NSString stringWithUTF8String:value.utf8(runtime).c_str()]; -+ auto utf8 = value.utf8(runtime); -+ NSString *result = [[NSString alloc] initWithBytes:utf8.data() length:utf8.size() encoding:NSUTF8StringEncoding]; -+ return result != nil ? result : @""; - } -diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm ---- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm -+++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm -@@ -431,5 +431,8 @@ - return [[NSMutableAttributedString attributedStringWithAttachment:attachment] mutableCopy]; - } else { -- NSString *string = [NSString stringWithUTF8String:fragment.string.c_str()]; -+ NSString *decoded = [[NSString alloc] initWithBytes:fragment.string.data() -+ length:fragment.string.size() -+ encoding:NSUTF8StringEncoding]; -+ NSString *string = decoded != nil ? decoded : @""; - - if (fragment.textAttributes.textTransform.has_value()) { -diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm ---- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm -+++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm -@@ -211,5 +211,7 @@ - CGFloat baseline = [layoutManager locationForGlyphAtIndex:range.location].y; -- const char *renderedUTF8 = [renderedString UTF8String]; -+ NSData *renderedData = [renderedString dataUsingEncoding:NSUTF8StringEncoding]; - auto line = LineMeasurement{ -- std::string(renderedUTF8 != nullptr ? renderedUTF8 : ""), -+ std::string( -+ renderedData != nil ? static_cast(renderedData.bytes) : "", -+ renderedData != nil ? renderedData.length : 0), - rect, diff --git a/patches/react-native/react-native+0.86.0+044+run-insertion-effect-cleanup-in-hidden-subtree.patch b/patches/react-native/react-native+0.86.0+044+run-insertion-effect-cleanup-in-hidden-subtree.patch deleted file mode 100644 index 1e37ca7fa5cd..000000000000 --- a/patches/react-native/react-native+0.86.0+044+run-insertion-effect-cleanup-in-hidden-subtree.patch +++ /dev/null @@ -1,50 +0,0 @@ -diff --git a/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js b/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js -index daab0e3..c742021 100644 ---- a/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js -+++ b/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js -@@ -11346,12 +11346,11 @@ __DEV__ && - case 11: - case 14: - case 15: -- offscreenSubtreeWasHidden || -- commitHookEffectListUnmount( -- Insertion, -- deletedFiber, -- nearestMountedAncestor -- ); -+ commitHookEffectListUnmount( -+ Insertion, -+ deletedFiber, -+ nearestMountedAncestor -+ ); - offscreenSubtreeWasHidden || - commitHookLayoutUnmountEffects( - deletedFiber, -diff --git a/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js b/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js -index 2625bf6..f263080 100644 ---- a/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js -+++ b/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js -@@ -7935,8 +7935,7 @@ function commitDeletionEffectsOnFiber( - case 11: - case 14: - case 15: -- offscreenSubtreeWasHidden || -- commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); -+ commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); - offscreenSubtreeWasHidden || - commitHookEffectListUnmount(4, deletedFiber, nearestMountedAncestor); - recursivelyTraverseDeletionEffects( -diff --git a/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js b/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js -index 544c754..f0b460a 100644 ---- a/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js -+++ b/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js -@@ -8666,8 +8666,7 @@ function commitDeletionEffectsOnFiber( - case 11: - case 14: - case 15: -- offscreenSubtreeWasHidden || -- commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); -+ commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); - offscreenSubtreeWasHidden || - commitHookLayoutUnmountEffects(deletedFiber, nearestMountedAncestor, 4); - recursivelyTraverseDeletionEffects( diff --git a/patches/react-native/react-native+0.86.0+047+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch b/patches/react-native/react-native+0.86.0+047+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch deleted file mode 100644 index 4bd20b786a25..000000000000 --- a/patches/react-native/react-native+0.86.0+047+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt ---- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt -+++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt -@@ -442,10 +442,13 @@ - - val parentView = parentViewState.view - if (parentView !is ViewGroup) { -- val message = -- "Unable to remove a view from a view that is not a ViewGroup. ParentTag: $parentTag - Tag: $tag - Index: $index" -- FLog.e(TAG, message) -- throw IllegalStateException(message) -+ ReactSoftExceptionLogger.logSoftException( -+ TAG, -+ ReactNoCrashSoftException( -+ "Unable to remove a view from a view that is not a ViewGroup. ParentTag: $parentTag - Tag: $tag - Index: $index - ParentView: ${parentView?.javaClass?.simpleName}" -+ ), -+ ) -+ return - } - - if (SHOW_CHANGED_VIEW_HIERARCHIES) { diff --git a/patches/react-native/react-native+0.86.0+049+fix-stale-mvcp-anchor-ios.patch b/patches/react-native/react-native+0.86.0+049+fix-stale-mvcp-anchor-ios.patch deleted file mode 100644 index 6b669009a348..000000000000 --- a/patches/react-native/react-native+0.86.0+049+fix-stale-mvcp-anchor-ios.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm -index c52de75..03065ec 100644 ---- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm -+++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm -@@ -1084,11 +1084,27 @@ - (void)_adjustForMaintainVisibleContentPosition - return; - } - -- if (ReactNativeFeatureFlags::enableViewCulling()) { -- // Abort if the first visible view has changed (different tag) -- if (_firstVisibleView && _firstVisibleView.tag != _firstVisibleViewTag) { -- return; -- } -+ // Abort if no first visible view (e.g., list was empty during mount) -+ if (!_firstVisibleView) { -+ return; -+ } -+ -+ // Abort if the first visible view has been recycled for a different item. -+ // The tag was captured in _prepareForMaintainVisibleScrollPosition (before -+ // mounting), and RCTComponentViewRegistry assigns new tags during dequeue -+ // (mounting) and resets them to 0 during enqueue (unmounting). When items -+ // are removed and re-added, recycled views get new tags based on their -+ // position, so the view at position 0 may have a different tag than before. -+ // If the tag changed, we bail out to avoid applying the MVCP delta to the -+ // wrong view, which would produce incorrect scroll offsets. -+ if (_firstVisibleView.tag != _firstVisibleViewTag) { -+ return; -+ } -+ -+ // Abort if the first visible view was deleted during mount (not recycled) -+ // This prevents MVCP from applying a delta after scrollToOffset(0) during reset/clear -+ if (_firstVisibleView.superview != _contentView) { -+ return; - } - - std::optional autoscrollThreshold = props.maintainVisibleContentPosition.value().autoscrollToTopThreshold; diff --git a/patches/react-native/react-native+0.86.0+002+fixMVCPAndroid.patch b/patches/react-native/react-native+0.88.0+001+fixMVCPAndroid.patch similarity index 68% rename from patches/react-native/react-native+0.86.0+002+fixMVCPAndroid.patch rename to patches/react-native/react-native+0.88.0+001+fixMVCPAndroid.patch index 90b705c6df69..3f4aae76e90a 100644 --- a/patches/react-native/react-native+0.86.0+002+fixMVCPAndroid.patch +++ b/patches/react-native/react-native+0.88.0+001+fixMVCPAndroid.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/MaintainVisibleScrollPositionHelper.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/MaintainVisibleScrollPositionHelper.kt -index 2bee605..ba26e7b 100644 +index cca66c7..b407ba0 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/MaintainVisibleScrollPositionHelper.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/MaintainVisibleScrollPositionHelper.kt -@@ -79,10 +79,11 @@ internal class MaintainVisibleScrollPositionHelper( +@@ -83,10 +83,11 @@ internal class MaintainVisibleScrollPositionHelper( return } isListening = false @@ -15,7 +15,7 @@ index 2bee605..ba26e7b 100644 val config = config ?: return val firstVisibleViewRef = firstVisibleViewRef ?: return val prevFirstVisibleFrame = prevFirstVisibleFrame ?: return -@@ -115,12 +116,18 @@ internal class MaintainVisibleScrollPositionHelper( +@@ -119,12 +120,18 @@ internal class MaintainVisibleScrollPositionHelper( } } @@ -35,7 +35,7 @@ index 2bee605..ba26e7b 100644 for (i in config.minIndexForVisible until contentView.childCount) { val child = contentView.getChildAt(i) -@@ -128,27 +135,57 @@ internal class MaintainVisibleScrollPositionHelper( +@@ -132,27 +139,57 @@ internal class MaintainVisibleScrollPositionHelper( val position = if (horizontal) child.x + child.width else child.y + child.height + // Virtualized lists can use a zero-sized, positioned first child as their scroll anchor. @@ -102,32 +102,39 @@ index 2bee605..ba26e7b 100644 } override fun didDispatchMountItems(uiManager: UIManager) { -diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java -index fb8918f..246eb9f 100644 ---- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java -+++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java -@@ -654,7 +654,9 @@ public class ReactHorizontalScrollView extends HorizontalScrollView - mVirtualViewContainerState.updateState(); - } +diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.kt +index 289cd05..2d292c1 100644 +--- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.kt ++++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.kt +@@ -637,6 +637,7 @@ constructor(context: Context, private val fpsListener: FpsListener? = null) : + ) + _virtualViewContainerState?.updateState() } -- -+ if (mMaintainVisibleContentPositionHelper != null) { -+ mMaintainVisibleContentPositionHelper.onScroll(); -+ } ++ maintainVisibleContentPositionHelper?.onScroll() } finally { - Systrace.endSection(Systrace.TRACE_TAG_REACT); + Systrace.endSection(Systrace.TRACE_TAG_REACT) } -diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java -index d263aab..3bc7f7c 100644 ---- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java -+++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java -@@ -598,6 +598,9 @@ public class ReactScrollView extends ScrollView - mVirtualViewContainerState.updateState(); - } +diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.kt +index b284e24..1f9e380 100644 +--- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.kt ++++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.kt +@@ -557,6 +557,7 @@ constructor(context: Context, private val fpsListener: FpsListener? = null) : + ) + _virtualViewContainerState?.updateState() } -+ if (mMaintainVisibleContentPositionHelper != null) { -+ mMaintainVisibleContentPositionHelper.onScroll(); -+ } ++ maintainVisibleContentPositionHelper?.onScroll() + } finally { + Systrace.endSection(Systrace.TRACE_TAG_REACT) + } +diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.kt +index b553f6a..ff31231 100644 +--- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.kt ++++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.kt +@@ -549,6 +549,7 @@ constructor(context: Context, private val fpsListener: FpsListener? = null) : + ) + _virtualViewContainerState?.updateState() + } ++ maintainVisibleContentPositionHelper?.onScroll() } finally { - Systrace.endSection(Systrace.TRACE_TAG_REACT); + Systrace.endSection(Systrace.TRACE_TAG_REACT) } diff --git a/patches/react-native/react-native+0.86.0+003+disableTextInputRecycling.patch b/patches/react-native/react-native+0.88.0+002+disableTextInputRecycling.patch similarity index 87% rename from patches/react-native/react-native+0.86.0+003+disableTextInputRecycling.patch rename to patches/react-native/react-native+0.88.0+002+disableTextInputRecycling.patch index 0876db4f636a..5832cd537a05 100644 --- a/patches/react-native/react-native+0.86.0+003+disableTextInputRecycling.patch +++ b/patches/react-native/react-native+0.88.0+002+disableTextInputRecycling.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -index b5d7242..fef4ed3 100644 +index 8f55121..7f3f8f5 100644 --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -@@ -177,6 +177,11 @@ static NSSet *returnKeyTypesSet; +@@ -183,6 +183,11 @@ - (NSObject *)accessibilityElement #pragma mark - RCTComponentViewProtocol diff --git a/patches/react-native/react-native+0.86.0+004+iOSFontResolution.patch b/patches/react-native/react-native+0.88.0+003+iOSFontResolution.patch similarity index 90% rename from patches/react-native/react-native+0.86.0+004+iOSFontResolution.patch rename to patches/react-native/react-native+0.88.0+003+iOSFontResolution.patch index 3d37febb94ad..d174a2d3f27a 100644 --- a/patches/react-native/react-native+0.86.0+004+iOSFontResolution.patch +++ b/patches/react-native/react-native+0.88.0+003+iOSFontResolution.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontUtils.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontUtils.mm -index 9b04cad..407ef5d 100644 +index 81a0b31..7d25d9d 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontUtils.mm +++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontUtils.mm -@@ -40,9 +40,6 @@ static RCTFontProperties RCTResolveFontProperties( +@@ -41,9 +41,6 @@ static RCTFontProperties RCTResolveFontProperties( { fontProperties.family = (fontProperties.family.length != 0u) ? fontProperties.family : baseFontProperties.family; fontProperties.size = !isnan(fontProperties.size) ? fontProperties.size : baseFontProperties.size; @@ -12,7 +12,7 @@ index 9b04cad..407ef5d 100644 fontProperties.variant = fontProperties.variant != RCTFontVariantUndefined ? fontProperties.variant : baseFontProperties.variant; return fontProperties; -@@ -350,10 +347,14 @@ UIFont *RCTFontWithFontProperties(RCTFontProperties fontProperties) +@@ -405,10 +402,14 @@ static UIFontDescriptorSystemDesign RCTGetFontDescriptorSystemDesign(NSString *f } else if ([fontProperties.family isEqualToString:defaultFontProperties.family]) { // Handle system font as special case. This ensures that we preserve // the specific metrics of the standard system font as closely as possible. @@ -27,7 +27,7 @@ index 9b04cad..407ef5d 100644 if (fontNames.count == 0) { // Gracefully handle being given a font name rather than font family, for -@@ -366,15 +367,18 @@ UIFont *RCTFontWithFontProperties(RCTFontProperties fontProperties) +@@ -421,15 +422,18 @@ static UIFontDescriptorSystemDesign RCTGetFontDescriptorSystemDesign(NSString *f // Failback to system font. font = RCTDefaultFontWithFontProperties(fontProperties); } diff --git a/patches/react-native/react-native+0.86.0+005+resetAutoresizingOnView.patch b/patches/react-native/react-native+0.88.0+004+resetAutoresizingOnView.patch similarity index 89% rename from patches/react-native/react-native+0.86.0+005+resetAutoresizingOnView.patch rename to patches/react-native/react-native+0.88.0+004+resetAutoresizingOnView.patch index 892f1d1e0a23..8f38a05d6c8f 100644 --- a/patches/react-native/react-native+0.86.0+005+resetAutoresizingOnView.patch +++ b/patches/react-native/react-native+0.88.0+004+resetAutoresizingOnView.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm -index b033b7c..e9d532c 100644 +index 0912c50..0e2c4a1 100644 --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm -@@ -717,6 +717,8 @@ - (void)prepareForRecycle +@@ -775,6 +775,8 @@ - (void)prepareForRecycle _filterLayer = nil; [self clearExistingBackgroundImageLayers]; diff --git a/patches/react-native/react-native+0.86.0+007+TextInput.patch b/patches/react-native/react-native+0.88.0+005+TextInput.patch similarity index 93% rename from patches/react-native/react-native+0.86.0+007+TextInput.patch rename to patches/react-native/react-native+0.88.0+005+TextInput.patch index 90b0f761e4f5..de1c226928fb 100644 --- a/patches/react-native/react-native+0.86.0+007+TextInput.patch +++ b/patches/react-native/react-native+0.88.0+005+TextInput.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp -index e9a546e..a764b13 100644 +index 5a09063..301bde7 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp -@@ -36,17 +36,6 @@ Size AndroidTextInputShadowNode::measureContent( +@@ -37,17 +37,6 @@ Size AndroidTextInputShadowNode::measureContent( .surfaceId = getSurfaceId(), }; diff --git a/patches/react-native/react-native+0.86.0+008+copyStateOnClone.patch b/patches/react-native/react-native+0.88.0+006+copyStateOnClone.patch similarity index 88% rename from patches/react-native/react-native+0.86.0+008+copyStateOnClone.patch rename to patches/react-native/react-native+0.88.0+006+copyStateOnClone.patch index 517bf0fd386a..cc7a8655a576 100644 --- a/patches/react-native/react-native+0.86.0+008+copyStateOnClone.patch +++ b/patches/react-native/react-native+0.88.0+006+copyStateOnClone.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp b/node_modules/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp -index a3af28d..9c0282a 100644 +index c147f37..e06b26a 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp -@@ -399,9 +399,8 @@ std::shared_ptr ShadowNode::cloneTree( +@@ -409,9 +409,8 @@ std::shared_ptr ShadowNode::cloneTree( children[childIndex] = childNode; childNode = parentNode.clone( diff --git a/patches/react-native/react-native+0.86.0+009+textinput-clear-command.patch b/patches/react-native/react-native+0.88.0+007+textinput-clear-command.patch similarity index 81% rename from patches/react-native/react-native+0.86.0+009+textinput-clear-command.patch rename to patches/react-native/react-native+0.88.0+007+textinput-clear-command.patch index c6bc264832be..c6f4b333776d 100644 --- a/patches/react-native/react-native+0.86.0+009+textinput-clear-command.patch +++ b/patches/react-native/react-native+0.88.0+007+textinput-clear-command.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js b/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js -index b0cf8da..8e3709c 100644 +index 37f4fa6..26b7cba 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +++ b/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js -@@ -429,6 +429,13 @@ export type AndroidTextInputNativeProps = Readonly<{ +@@ -432,6 +432,13 @@ export type AndroidTextInputNativeProps = Readonly<{ Readonly<{target: Int32, text: string}>, >, @@ -16,7 +16,7 @@ index b0cf8da..8e3709c 100644 /** * Callback that is called when a key is pressed. * This will be called with `{ nativeEvent: { key: keyValue } }` -@@ -660,6 +667,9 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { +@@ -664,6 +671,9 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { }, }, directEventTypes: { @@ -26,7 +26,7 @@ index b0cf8da..8e3709c 100644 topScroll: { registrationName: 'onScroll', }, -@@ -691,6 +701,7 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { +@@ -695,6 +705,7 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { textTransform: true, returnKeyType: true, keyboardType: true, @@ -35,10 +35,10 @@ index b0cf8da..8e3709c 100644 color: colorAttribute, autoComplete: true, diff --git a/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js b/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js -index cccc623..0ee1e8a 100644 +index ada8aef..490d1b5 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js +++ b/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js -@@ -83,6 +83,9 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { +@@ -86,6 +86,9 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { topContentSizeChange: { registrationName: 'onContentSizeChange', }, @@ -48,7 +48,7 @@ index cccc623..0ee1e8a 100644 topChangeSync: { registrationName: 'onChangeSync', }, -@@ -151,6 +154,7 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { +@@ -155,6 +158,7 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { lineBreakModeIOS: true, smartInsertDelete: true, ...ConditionallyIgnoredEventHandlers({ @@ -56,33 +56,15 @@ index cccc623..0ee1e8a 100644 onChange: true, onSelectionChange: true, onContentSizeChange: true, -diff --git a/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts b/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts -index 97535f6..ed7437f 100644 ---- a/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts -+++ b/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts -@@ -839,6 +839,13 @@ export interface TextInputProps - */ - onBlur?: ((e: BlurEvent) => void) | undefined; - -+ /** -+ * Callback that is called when the text input was cleared using the native clear command. -+ */ -+ onClear?: -+ | ((e: NativeSyntheticEvent) => void) -+ | undefined; -+ - /** - * Callback that is called when the text input's text changes. - */ diff --git a/node_modules/react-native/Libraries/Components/TextInput/TextInput.js b/node_modules/react-native/Libraries/Components/TextInput/TextInput.js -index adca4e3..3339947 100644 +index abcc3d8..e265ba3 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/TextInput.js +++ b/node_modules/react-native/Libraries/Components/TextInput/TextInput.js -@@ -534,6 +534,11 @@ function InternalTextInput(props: TextInputProps): React.Node { +@@ -424,6 +424,11 @@ function InternalTextInput(props: TextInputProps): React.Node { }); }; -+ const _onClear = (event: ChangeEvent) => { ++ const _onClear = (event: TextInputChangeEvent) => { + setMostRecentEventCount(event.nativeEvent.eventCount); + props.onClear && props.onClear(event); + }; @@ -90,7 +72,7 @@ index adca4e3..3339947 100644 const _onFocus = (event: FocusEvent) => { TextInputState.focusInput(inputRef.current); if (props.onFocus) { -@@ -709,6 +714,7 @@ function InternalTextInput(props: TextInputProps): React.Node { +@@ -599,6 +604,7 @@ function InternalTextInput(props: TextInputProps): React.Node { nativeID={id ?? props.nativeID} numberOfLines={props.rows ?? props.numberOfLines} onBlur={_onBlur} @@ -98,31 +80,19 @@ index adca4e3..3339947 100644 onChange={_onChange} onContentSizeChange={props.onContentSizeChange} onFocus={_onFocus} -@@ -782,6 +788,7 @@ function InternalTextInput(props: TextInputProps): React.Node { - nativeID={id ?? props.nativeID} - numberOfLines={props.rows ?? props.numberOfLines} - onBlur={_onBlur} -+ onClear={_onClear} - onChange={_onChange} - onFocus={_onFocus} - /* $FlowFixMe[prop-missing] the types for AndroidTextInput don't match -diff --git a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm -index 3503ccf..5d3a675 100644 ---- a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm -+++ b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm -@@ -69,6 +69,7 @@ @implementation RCTBaseTextInputViewManager { - - RCT_EXPORT_VIEW_PROPERTY(onChange, RCTBubblingEventBlock) - RCT_EXPORT_VIEW_PROPERTY(onKeyPressSync, RCTDirectEventBlock) -+RCT_EXPORT_VIEW_PROPERTY(onClear, RCTDirectEventBlock) - RCT_EXPORT_VIEW_PROPERTY(onChangeSync, RCTDirectEventBlock) - RCT_EXPORT_VIEW_PROPERTY(onSelectionChange, RCTDirectEventBlock) - RCT_EXPORT_VIEW_PROPERTY(onScroll, RCTDirectEventBlock) +@@ -673,6 +679,7 @@ function InternalTextInput(props: TextInputProps): React.Node { + nativeID={id ?? props.nativeID} + numberOfLines={props.rows ?? props.numberOfLines} + onBlur={_onBlur} ++ onClear={_onClear} + onChange={_onChange} + onFocus={_onFocus} + /* $FlowFixMe[prop-missing] the types for AndroidTextInput don't match diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -index c0e56ac..6898c33 100644 +index 7f3f8f5..c8e132c 100644 --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -@@ -565,6 +565,19 @@ - (void)blur +@@ -592,6 +592,19 @@ - (void)blur [_backedTextInputView resignFirstResponder]; } @@ -173,8 +143,67 @@ index fe3376a..f674d98 100644 if ([commandName isEqualToString:@"setTextAndSelection"]) { #if RCT_DEBUG +diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextClearEvent.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextClearEvent.java +new file mode 100644 +index 0000000..0c142a0 +--- /dev/null ++++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextClearEvent.java +@@ -0,0 +1,53 @@ ++/* ++ * Copyright (c) Meta Platforms, Inc. and affiliates. ++ * ++ * This source code is licensed under the MIT license found in the ++ * LICENSE file in the root directory of this source tree. ++ */ ++ ++package com.facebook.react.views.textinput; ++ ++import androidx.annotation.Nullable; ++ ++import com.facebook.react.bridge.Arguments; ++import com.facebook.react.bridge.WritableMap; ++import com.facebook.react.uimanager.common.ViewUtil; ++import com.facebook.react.uimanager.events.Event; ++ ++/** ++ * Event emitted by EditText native view when text changes. VisibleForTesting from {@link ++ * TextInputEventsTestCase}. ++ */ ++public class ReactTextClearEvent extends Event { ++ ++ public static final String EVENT_NAME = "topClear"; ++ ++ private String mText; ++ private int mEventCount; ++ ++ @Deprecated ++ public ReactTextClearEvent(int viewId, String text, int eventCount) { ++ this(ViewUtil.NO_SURFACE_ID, viewId, text, eventCount); ++ } ++ ++ public ReactTextClearEvent(int surfaceId, int viewId, String text, int eventCount) { ++ super(surfaceId, viewId); ++ mText = text; ++ mEventCount = eventCount; ++ } ++ ++ @Override ++ public String getEventName() { ++ return EVENT_NAME; ++ } ++ ++ @Nullable ++ @Override ++ protected WritableMap getEventData() { ++ WritableMap eventData = Arguments.createMap(); ++ eventData.putString("text", mText); ++ eventData.putInt("eventCount", mEventCount); ++ eventData.putInt("target", getViewTag()); ++ return eventData; ++ } ++} diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt -index 9e40dbe..9e548c0 100644 +index 49a75f0..9a68415 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt @@ -15,6 +15,7 @@ import android.graphics.BlendModeColorFilter @@ -185,7 +214,7 @@ index 9e40dbe..9e548c0 100644 import android.text.InputFilter import android.text.InputFilter.LengthFilter import android.text.InputType -@@ -50,6 +51,8 @@ import com.facebook.react.uimanager.ReactStylesDiffMap +@@ -51,6 +52,8 @@ import com.facebook.react.uimanager.ReactStylesDiffMap import com.facebook.react.uimanager.StateWrapper import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.UIManagerHelper @@ -194,16 +223,16 @@ index 9e40dbe..9e548c0 100644 import com.facebook.react.uimanager.ViewDefaults import com.facebook.react.uimanager.ViewProps import com.facebook.react.uimanager.annotations.ReactProp -@@ -141,6 +144,8 @@ public open class ReactTextInputManager public constructor() : +@@ -144,6 +147,8 @@ public open class ReactTextInputManager public constructor() : eventTypeConstants.putAll( - mapOf(getJSEventName(ScrollEventType.SCROLL) to mapOf("registrationName" to "onScroll")) + mapOf(getJSEventName(ScrollEventType.SCROLL) to mapOf("registrationName" to "onScroll")), ) + eventTypeConstants.putAll( + mapOf(ReactTextClearEvent.EVENT_NAME to mapOf("registrationName" to "onClear"))) return eventTypeConstants } -@@ -183,6 +188,26 @@ public open class ReactTextInputManager public constructor() : +@@ -186,6 +191,26 @@ public open class ReactTextInputManager public constructor() : } reactEditText.maybeSetSelection(mostRecentEventCount, start, end) } @@ -231,10 +260,10 @@ index 9e40dbe..9e548c0 100644 } diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp -index 2982b12..2117872 100644 +index 7da2622..8caac07 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp -@@ -139,6 +139,10 @@ void TextInputEventEmitter::onBlur(const Metrics& textInputMetrics) const { +@@ -142,6 +142,10 @@ void TextInputEventEmitter::onBlur(const Metrics& textInputMetrics) const { dispatchTextInputEvent("blur", textInputMetrics); } @@ -246,10 +275,10 @@ index 2982b12..2117872 100644 dispatchTextInputEvent( "change", textInputMetrics, /* includeSelectionState */ true); diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h -index a3f2e01..f88919c 100644 +index 8c1a443..9639fcf 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h +++ b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h -@@ -37,6 +37,7 @@ class TextInputEventEmitter : public ViewEventEmitter { +@@ -40,6 +40,7 @@ class TextInputEventEmitter : public ViewEventEmitter { void onFocus(const Metrics &textInputMetrics) const; void onBlur(const Metrics &textInputMetrics) const; @@ -257,62 +286,21 @@ index a3f2e01..f88919c 100644 void onChange(const Metrics &textInputMetrics) const; void onContentSizeChange(const Metrics &textInputMetrics) const; void onSelectionChange(const Metrics &textInputMetrics) const; -diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextClearEvent.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextClearEvent.java -new file mode 100644 -index 0000000..0c142a0 ---- /dev/null -+++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextClearEvent.java -@@ -0,0 +1,53 @@ -+/* -+ * Copyright (c) Meta Platforms, Inc. and affiliates. -+ * -+ * This source code is licensed under the MIT license found in the -+ * LICENSE file in the root directory of this source tree. -+ */ -+ -+package com.facebook.react.views.textinput; -+ -+import androidx.annotation.Nullable; -+ -+import com.facebook.react.bridge.Arguments; -+import com.facebook.react.bridge.WritableMap; -+import com.facebook.react.uimanager.common.ViewUtil; -+import com.facebook.react.uimanager.events.Event; -+ -+/** -+ * Event emitted by EditText native view when text changes. VisibleForTesting from {@link -+ * TextInputEventsTestCase}. -+ */ -+public class ReactTextClearEvent extends Event { -+ -+ public static final String EVENT_NAME = "topClear"; -+ -+ private String mText; -+ private int mEventCount; -+ -+ @Deprecated -+ public ReactTextClearEvent(int viewId, String text, int eventCount) { -+ this(ViewUtil.NO_SURFACE_ID, viewId, text, eventCount); -+ } -+ -+ public ReactTextClearEvent(int surfaceId, int viewId, String text, int eventCount) { -+ super(surfaceId, viewId); -+ mText = text; -+ mEventCount = eventCount; -+ } -+ -+ @Override -+ public String getEventName() { -+ return EVENT_NAME; -+ } +diff --git a/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts b/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts +index 21bb5c6..8eec1d6 100644 +--- a/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts ++++ b/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts +@@ -816,6 +816,13 @@ export interface TextInputProps + */ + onBlur?: ((e: BlurEvent) => void) | undefined; + ++ /** ++ * Callback that is called when the text input was cleared using the native clear command. ++ */ ++ onClear?: ++ | ((e: NativeSyntheticEvent) => void) ++ | undefined; + -+ @Nullable -+ @Override -+ protected WritableMap getEventData() { -+ WritableMap eventData = Arguments.createMap(); -+ eventData.putString("text", mText); -+ eventData.putInt("eventCount", mEventCount); -+ eventData.putInt("target", getViewTag()); -+ return eventData; -+ } -+} + /** + * Callback that is called when the text input's text changes. + */ diff --git a/patches/react-native/react-native+0.86.0+010+Add-onPaste-to-TextInput.patch b/patches/react-native/react-native+0.88.0+008+Add-onPaste-to-TextInput.patch similarity index 83% rename from patches/react-native/react-native+0.86.0+010+Add-onPaste-to-TextInput.patch rename to patches/react-native/react-native+0.88.0+008+Add-onPaste-to-TextInput.patch index 343bf304f822..125374947a08 100644 --- a/patches/react-native/react-native+0.86.0+010+Add-onPaste-to-TextInput.patch +++ b/patches/react-native/react-native+0.88.0+008+Add-onPaste-to-TextInput.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js b/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js -index 8e3709c..f6c0b7f 100644 +index 26b7cba..d1daaec 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +++ b/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js -@@ -479,6 +479,21 @@ export type AndroidTextInputNativeProps = Readonly<{ +@@ -482,6 +482,21 @@ export type AndroidTextInputNativeProps = Readonly<{ }>, >, @@ -24,7 +24,7 @@ index 8e3709c..f6c0b7f 100644 /** * The string that will be rendered before text input has been entered. */ -@@ -673,6 +688,9 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { +@@ -677,6 +692,9 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { topScroll: { registrationName: 'onScroll', }, @@ -34,7 +34,7 @@ index 8e3709c..f6c0b7f 100644 }, validAttributes: { acceptDragAndDropTypes: true, -@@ -720,6 +738,7 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { +@@ -724,6 +742,7 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { secureTextEntry: true, textBreakStrategy: true, onScroll: true, @@ -43,10 +43,10 @@ index 8e3709c..f6c0b7f 100644 disableFullscreenUI: true, includeFontPadding: true, diff --git a/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js b/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js -index 0ee1e8a..106a147 100644 +index 490d1b5..e1a9d25 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js +++ b/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js -@@ -86,6 +86,9 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { +@@ -89,6 +89,9 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { topClear: { registrationName: 'onClear', }, @@ -56,7 +56,7 @@ index 0ee1e8a..106a147 100644 topChangeSync: { registrationName: 'onChangeSync', }, -@@ -159,6 +162,7 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { +@@ -163,6 +166,7 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { onSelectionChange: true, onContentSizeChange: true, onScroll: true, @@ -64,44 +64,8 @@ index 0ee1e8a..106a147 100644 onChangeSync: true, onKeyPressSync: true, }), -diff --git a/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts b/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts -index ed7437f..f3418e7 100644 ---- a/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts -+++ b/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts -@@ -562,6 +562,16 @@ export interface TextInputSubmitEditingEventData { - export type TextInputSubmitEditingEvent = - NativeSyntheticEvent; - -+/** -+ * @see TextInputProps.onPaste -+ */ -+export interface TextInputPasteEventData extends TargetedEvent { -+items: Array<{ -+ type: string; -+ data: string; -+ }>; -+} -+ - /** - * @see https://reactnative.dev/docs/textinput#props - */ -@@ -924,6 +934,14 @@ export interface TextInputProps - */ - onKeyPress?: ((e: TextInputKeyPressEvent) => void) | undefined; - -+ /** -+ * Invoked when the user performs the paste action. -+ */ -+ onPaste?: -+ | ((e: NativeSyntheticEvent) => void) -+ | undefined; -+ -+ - /** - * The string that will be rendered before text input has been entered - */ diff --git a/node_modules/react-native/Libraries/Components/TextInput/TextInput.flow.js b/node_modules/react-native/Libraries/Components/TextInput/TextInput.flow.js -index 85e6c69..28fa2be 100644 +index eaf81c8..8a5f953 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/TextInput.flow.js +++ b/node_modules/react-native/Libraries/Components/TextInput/TextInput.flow.js @@ -139,6 +139,18 @@ export type TextInputSubmitEditingEvent = @@ -123,7 +87,7 @@ index 85e6c69..28fa2be 100644 type DataDetectorTypesType = | 'phoneNumber' | 'link' -@@ -910,6 +922,11 @@ type TextInputBaseProps = Readonly<{ +@@ -889,6 +901,11 @@ type TextInputBaseProps = Readonly<{ */ onScroll?: ?(e: ScrollEvent) => unknown, @@ -136,10 +100,10 @@ index 85e6c69..28fa2be 100644 * The string that will be rendered before text input has been entered. */ diff --git a/node_modules/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.mm b/node_modules/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.mm -index cbda377..a3bd3fc 100644 +index a803387..22d3d10 100644 --- a/node_modules/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.mm +++ b/node_modules/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.mm -@@ -217,7 +217,19 @@ static UIColor *defaultPlaceholderColor(void) +@@ -216,7 +216,19 @@ - (void)scrollRangeToVisible:(NSRange)range - (void)paste:(id)sender { _textWasPasted = YES; @@ -160,7 +124,7 @@ index cbda377..a3bd3fc 100644 } // Turn off scroll animation to fix flaky scrolling. -@@ -309,6 +321,10 @@ static UIColor *defaultPlaceholderColor(void) +@@ -308,6 +320,10 @@ - (BOOL)canPerformAction:(SEL)action withSender:(id)sender return NO; } @@ -306,7 +270,7 @@ index 9633ab9..e57910a 100644 #pragma mark - RCTBackedTextFieldDelegateAdapter (for UITextField) static void *TextFieldSelectionObservingContext = &TextFieldSelectionObservingContext; -@@ -165,6 +229,11 @@ static void *TextFieldSelectionObservingContext = &TextFieldSelectionObservingCo +@@ -165,6 +229,11 @@ - (void)selectedTextRangeWasSet [self textFieldProbablyDidChangeSelection]; } @@ -318,7 +282,7 @@ index 9633ab9..e57910a 100644 #pragma mark - Generalization - (void)textFieldProbablyDidChangeSelection -@@ -364,6 +433,11 @@ static void *TextFieldSelectionObservingContext = &TextFieldSelectionObservingCo +@@ -364,6 +433,11 @@ - (void)skipNextTextInputDidChangeSelectionEventWithTextRange:(UITextRange *)tex _previousSelectedTextRange = textRange; } @@ -330,66 +294,11 @@ index 9633ab9..e57910a 100644 #pragma mark - Generalization - (void)textViewProbablyDidChangeSelection -diff --git a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.h b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.h -index 228d9ca..b807146 100644 ---- a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.h -+++ b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.h -@@ -40,6 +40,7 @@ __attribute__((deprecated("This API will be removed along with the legacy archit - @property (nonatomic, copy, nullable) RCTDirectEventBlock onChange; - @property (nonatomic, copy, nullable) RCTDirectEventBlock onChangeSync; - @property (nonatomic, copy, nullable) RCTDirectEventBlock onScroll; -+@property (nonatomic, copy, nullable) RCTDirectEventBlock onPaste; - - @property (nonatomic, assign) NSInteger mostRecentEventCount; - @property (nonatomic, assign, readonly) NSInteger nativeEventCount; -diff --git a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm -index 9fa7b92..76e1ce1 100644 ---- a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm -+++ b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm -@@ -601,6 +601,26 @@ - (void)textInputDidChangeSelection - }); - } - -+- (void)textInputDidPaste:(NSString *)type withData:(NSString *)data -+{ -+ if (!_onPaste) { -+ return; -+ } -+ -+ NSMutableArray *items = [NSMutableArray new]; -+ [items addObject:@{ -+ @"type" : type, -+ @"data" : data, -+ }]; -+ -+ NSDictionary *payload = @{ -+ @"target" : self.reactTag, -+ @"items" : items, -+ }; -+ -+ _onPaste(payload); -+} -+ - - (void)updateLocalData - { - [self enforceTextAttributesIfNeeded]; -diff --git a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm -index 5d3a675..a92904d 100644 ---- a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm -+++ b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm -@@ -73,6 +73,7 @@ @implementation RCTBaseTextInputViewManager { - RCT_EXPORT_VIEW_PROPERTY(onChangeSync, RCTDirectEventBlock) - RCT_EXPORT_VIEW_PROPERTY(onSelectionChange, RCTDirectEventBlock) - RCT_EXPORT_VIEW_PROPERTY(onScroll, RCTDirectEventBlock) -+RCT_EXPORT_VIEW_PROPERTY(onPaste, RCTDirectEventBlock) - - RCT_EXPORT_SHADOW_PROPERTY(text, NSString) - RCT_EXPORT_SHADOW_PROPERTY(placeholder, NSString) diff --git a/node_modules/react-native/Libraries/Text/TextInput/Singleline/RCTUITextField.mm b/node_modules/react-native/Libraries/Text/TextInput/Singleline/RCTUITextField.mm -index 052c003..641d318 100644 +index 064b48b..c7470dd 100644 --- a/node_modules/react-native/Libraries/Text/TextInput/Singleline/RCTUITextField.mm +++ b/node_modules/react-native/Libraries/Text/TextInput/Singleline/RCTUITextField.mm -@@ -180,6 +180,10 @@ +@@ -179,6 +179,10 @@ - (BOOL)canPerformAction:(SEL)action withSender:(id)sender return NO; } @@ -400,7 +309,7 @@ index 052c003..641d318 100644 return [super canPerformAction:action withSender:sender]; } -@@ -263,7 +267,19 @@ +@@ -262,7 +266,19 @@ - (void)scrollRangeToVisible:(NSRange)range - (void)paste:(id)sender { _textWasPasted = YES; @@ -422,10 +331,10 @@ index 052c003..641d318 100644 #pragma mark - Layout diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -index 6898c33..c80f180 100644 +index c8e132c..986a7c2 100644 --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -@@ -525,6 +525,13 @@ - (void)textInputDidChangeSelection +@@ -539,6 +539,13 @@ - (void)textInputDidChangeSelection } } @@ -463,10 +372,10 @@ index 0000000..a0cc12d + public void onPaste(String type, String data); +} diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt -index a0f2152..cc3f151 100644 +index e27330c..bec43b2 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt -@@ -8,12 +8,18 @@ +@@ -8,6 +8,10 @@ package com.facebook.react.views.textinput import android.annotation.SuppressLint @@ -477,15 +386,16 @@ index a0f2152..cc3f151 100644 import android.content.Context import android.content.res.Configuration import android.graphics.Canvas - import android.graphics.Color +@@ -15,6 +19,8 @@ import android.graphics.Color import android.graphics.Paint import android.graphics.Rect + import android.graphics.Typeface +import android.net.Uri +import com.facebook.react.uimanager.UIManagerHelper.getReactContext import android.os.Build import android.os.Bundle import android.text.Editable -@@ -123,6 +129,7 @@ public open class ReactEditText public constructor(context: Context) : AppCompat +@@ -130,6 +136,7 @@ public open class ReactEditText public constructor(context: Context) : AppCompat private var selectionWatcher: SelectionWatcher? = null private var contentSizeWatcher: ContentSizeWatcher? = null private var scrollWatcher: ScrollWatcher? @@ -493,7 +403,7 @@ index a0f2152..cc3f151 100644 private var keyListener: InternalKeyListener? = null private var detectScrollMovement = false private var onKeyPress = false -@@ -207,6 +214,7 @@ public open class ReactEditText public constructor(context: Context) : AppCompat +@@ -220,6 +227,7 @@ public open class ReactEditText public constructor(context: Context) : AppCompat keyListener = InternalKeyListener() } scrollWatcher = null @@ -501,13 +411,13 @@ index a0f2152..cc3f151 100644 textAttributes = TextAttributes() applyTextAttributes() -@@ -363,10 +371,50 @@ public open class ReactEditText public constructor(context: Context) : AppCompat +@@ -383,10 +391,50 @@ public open class ReactEditText public constructor(context: Context) : AppCompat * Called when a context menu option for the text view is selected. * React Native replaces copy (as rich text) with copy as plain text. */ - override fun onTextContextMenuItem(id: Int): Boolean = - super.onTextContextMenuItem( -- if (id == android.R.id.paste) android.R.id.pasteAsPlainText else id +- if (id == android.R.id.paste) android.R.id.pasteAsPlainText else id, - ) + override fun onTextContextMenuItem(id: Int): Boolean { + val modifiedId = if (id == android.R.id.paste || id == android.R.id.pasteAsPlainText) { @@ -556,7 +466,7 @@ index a0f2152..cc3f151 100644 internal fun clearFocusAndMaybeRefocus() { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P || !isInTouchMode) { -@@ -429,6 +477,10 @@ public open class ReactEditText public constructor(context: Context) : AppCompat +@@ -458,6 +506,10 @@ public open class ReactEditText public constructor(context: Context) : AppCompat this.scrollWatcher = scrollWatcher } @@ -568,10 +478,10 @@ index a0f2152..cc3f151 100644 * Attempt to set a selection or fail silently. Intentionally meant to handle bad inputs. * EventCounter is the same one used as with text. diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt -index 9e548c0..af60048 100644 +index 9a68415..38e0e8a 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt -@@ -146,6 +146,8 @@ public open class ReactTextInputManager public constructor() : +@@ -149,6 +149,8 @@ public open class ReactTextInputManager public constructor() : ) eventTypeConstants.putAll( mapOf(ReactTextClearEvent.EVENT_NAME to mapOf("registrationName" to "onClear"))) @@ -580,7 +490,7 @@ index 9e548c0..af60048 100644 return eventTypeConstants } -@@ -343,6 +345,15 @@ public open class ReactTextInputManager public constructor() : +@@ -351,6 +353,15 @@ public open class ReactTextInputManager public constructor() : } } @@ -596,7 +506,7 @@ index 9e548c0..af60048 100644 @ReactProp(name = "onKeyPress", defaultBoolean = false) public fun setOnKeyPress(view: ReactEditText, onKeyPress: Boolean) { view.setOnKeyPress(onKeyPress) -@@ -981,6 +992,24 @@ public open class ReactTextInputManager public constructor() : +@@ -999,6 +1010,24 @@ public open class ReactTextInputManager public constructor() : } } @@ -618,9 +528,9 @@ index 9e548c0..af60048 100644 + } + } + - override fun getExportedViewConstants(): Map = - mapOf( - "AutoCapitalizationType" to + override fun getExportedViewConstants(): Map = mapOf( + "AutoCapitalizationType" to + mapOf( diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputPasteEvent.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputPasteEvent.kt new file mode 100644 index 0000000..6f5b10b @@ -689,10 +599,10 @@ index 0000000..6f5b10b + } +} diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp -index 2117872..5cbcc60 100644 +index 8caac07..4841983 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp -@@ -182,6 +182,19 @@ void TextInputEventEmitter::onScroll(const Metrics& textInputMetrics) const { +@@ -185,6 +185,19 @@ void TextInputEventEmitter::onScroll(const Metrics& textInputMetrics) const { }); } @@ -713,10 +623,10 @@ index 2117872..5cbcc60 100644 const std::string& name, const Metrics& textInputMetrics, diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h -index f88919c..c1118e3 100644 +index 9639fcf..8428fa8 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h +++ b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h -@@ -45,6 +45,7 @@ class TextInputEventEmitter : public ViewEventEmitter { +@@ -48,6 +48,7 @@ class TextInputEventEmitter : public ViewEventEmitter { void onSubmitEditing(const Metrics &textInputMetrics) const; void onKeyPress(const KeyPressMetrics &keyPressMetrics) const; void onScroll(const Metrics &textInputMetrics) const; @@ -724,3 +634,39 @@ index f88919c..c1118e3 100644 private: void dispatchTextInputEvent( +diff --git a/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts b/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts +index 8eec1d6..aea22a1 100644 +--- a/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts ++++ b/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts +@@ -538,6 +538,16 @@ export interface TextInputSubmitEditingEventData { + export type TextInputSubmitEditingEvent = + NativeSyntheticEvent; + ++/** ++ * @see TextInputProps.onPaste ++ */ ++export interface TextInputPasteEventData extends TargetedEvent { ++items: Array<{ ++ type: string; ++ data: string; ++ }>; ++} ++ + /** + * @see https://reactnative.dev/docs/textinput#props + */ +@@ -899,6 +909,14 @@ export interface TextInputProps + */ + onKeyPress?: ((e: TextInputKeyPressEvent) => void) | undefined; + ++ /** ++ * Invoked when the user performs the paste action. ++ */ ++ onPaste?: ++ | ((e: NativeSyntheticEvent) => void) ++ | undefined; ++ ++ + /** + * The string that will be rendered before text input has been entered + */ diff --git a/patches/react-native/react-native+0.86.0+011+alert-style.patch b/patches/react-native/react-native+0.88.0+009+alert-style.patch similarity index 97% rename from patches/react-native/react-native+0.86.0+011+alert-style.patch rename to patches/react-native/react-native+0.88.0+009+alert-style.patch index e0db18764d71..cf10a347cfd8 100644 --- a/patches/react-native/react-native+0.86.0+011+alert-style.patch +++ b/patches/react-native/react-native+0.88.0+009+alert-style.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/AlertFragment.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/AlertFragment.kt -index 2f1b12b..bce209e 100644 +index 903578c..29c9480 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/AlertFragment.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/AlertFragment.kt @@ -9,6 +9,7 @@ package com.facebook.react.modules.dialog diff --git a/patches/react-native/react-native+0.86.0+012+fixScrollViewState.patch b/patches/react-native/react-native+0.88.0+010+fixScrollViewState.patch similarity index 91% rename from patches/react-native/react-native+0.86.0+012+fixScrollViewState.patch rename to patches/react-native/react-native+0.88.0+010+fixScrollViewState.patch index 50672721e9f2..1cf74bb6ebfd 100644 --- a/patches/react-native/react-native+0.86.0+012+fixScrollViewState.patch +++ b/patches/react-native/react-native+0.88.0+010+fixScrollViewState.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt -index 98b52e0..24c0631 100644 +index e6e0660..632aed1 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt -@@ -632,7 +632,7 @@ public object ReactScrollViewHelper { +@@ -660,7 +660,7 @@ public object ReactScrollViewHelper { /** Get the padding on the bottom for tab bar */ var scrollAwayPaddingBottom: Int = 0, /** Get the Fabric state of last scroll position */ diff --git a/patches/react-native/react-native+0.86.0+013+fix-mask-persisting-recycling.patch b/patches/react-native/react-native+0.88.0+011+fix-mask-persisting-recycling.patch similarity index 88% rename from patches/react-native/react-native+0.86.0+013+fix-mask-persisting-recycling.patch rename to patches/react-native/react-native+0.88.0+011+fix-mask-persisting-recycling.patch index 0b026ce9f383..b9f2163f3dfc 100644 --- a/patches/react-native/react-native+0.86.0+013+fix-mask-persisting-recycling.patch +++ b/patches/react-native/react-native+0.88.0+011+fix-mask-persisting-recycling.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm -index e9d532c..7455807 100644 +index 0e2c4a1..233d3e2 100644 --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm -@@ -719,6 +719,8 @@ - (void)prepareForRecycle +@@ -777,6 +777,8 @@ - (void)prepareForRecycle self.autoresizingMask = UIViewAutoresizingNone; diff --git a/patches/react-native/react-native+0.86.0+014+fix-text-selecting-on-change.patch b/patches/react-native/react-native+0.88.0+012+fix-text-selecting-on-change.patch similarity index 82% rename from patches/react-native/react-native+0.86.0+014+fix-text-selecting-on-change.patch rename to patches/react-native/react-native+0.88.0+012+fix-text-selecting-on-change.patch index a8ebf6e86ffa..a427d71bf6ec 100644 --- a/patches/react-native/react-native+0.86.0+014+fix-text-selecting-on-change.patch +++ b/patches/react-native/react-native+0.88.0+012+fix-text-selecting-on-change.patch @@ -1,16 +1,16 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt -index cc3f151..13807e9 100644 +index bec43b2..d094ec6 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt -@@ -142,6 +142,7 @@ public open class ReactEditText public constructor(context: Context) : AppCompat +@@ -152,6 +152,7 @@ public open class ReactEditText public constructor(context: Context) : AppCompat private var contextMenuHidden = false private var didAttachToWindow = false private var selectTextOnFocus = false + private var hasSelectedTextOnFocus = false; private var placeholder: String? = null - private var overflow = Overflow.VISIBLE - -@@ -293,11 +294,11 @@ public open class ReactEditText public constructor(context: Context) : AppCompat + internal var overflow = Overflow.VISIBLE + private set +@@ -313,11 +314,11 @@ public open class ReactEditText public constructor(context: Context) : AppCompat override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { onContentSizeChange() @@ -24,7 +24,7 @@ index cc3f151..13807e9 100644 } } -@@ -447,6 +448,7 @@ public open class ReactEditText public constructor(context: Context) : AppCompat +@@ -476,6 +477,7 @@ public open class ReactEditText public constructor(context: Context) : AppCompat showSoftKeyboard() } diff --git a/patches/react-native/react-native+0.86.0+015+fix-merged-transaction-mount-order.patch b/patches/react-native/react-native+0.88.0+013+fix-merged-transaction-mount-order.patch similarity index 89% rename from patches/react-native/react-native+0.86.0+015+fix-merged-transaction-mount-order.patch rename to patches/react-native/react-native+0.88.0+013+fix-merged-transaction-mount-order.patch index a9a128fbfdfe..bd4a817c35e1 100644 --- a/patches/react-native/react-native+0.86.0+015+fix-merged-transaction-mount-order.patch +++ b/patches/react-native/react-native+0.88.0+013+fix-merged-transaction-mount-order.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp -index b82bdab..2a63b6b 100644 +index 0ed7581..a380c19 100644 --- a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp +++ b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp -@@ -580,8 +580,13 @@ +@@ -589,8 +589,13 @@ void FabricMountingManager::executeMount( auto surfaceId = transaction.getSurfaceId(); auto& mutations = transaction.getMutations(); @@ -21,7 +21,7 @@ diff --git a/node_modules/react-native/ReactCommon/react/renderer/mounting/Mount index d7dd1bc..e24c746 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/mounting/MountingTransaction.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/mounting/MountingTransaction.cpp -@@ -44,6 +44,7 @@ +@@ -44,6 +44,7 @@ Number MountingTransaction::getNumber() const { void MountingTransaction::mergeWith(MountingTransaction&& transaction) { react_native_assert(transaction.getSurfaceId() == surfaceId_); number_ = transaction.getNumber(); @@ -29,7 +29,7 @@ index d7dd1bc..e24c746 100644 mutations_.insert( mutations_.end(), std::make_move_iterator(transaction.mutations_.begin()), -@@ -54,4 +55,8 @@ +@@ -54,4 +55,8 @@ void MountingTransaction::mergeWith(MountingTransaction&& transaction) { telemetry_ = std::move(transaction.telemetry_); } @@ -39,10 +39,10 @@ index d7dd1bc..e24c746 100644 + } // namespace facebook::react diff --git a/node_modules/react-native/ReactCommon/react/renderer/mounting/MountingTransaction.h b/node_modules/react-native/ReactCommon/react/renderer/mounting/MountingTransaction.h -index 7841b5a..9df6c55 100644 +index c4f13c4..a047312 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/mounting/MountingTransaction.h +++ b/node_modules/react-native/ReactCommon/react/renderer/mounting/MountingTransaction.h -@@ -83,11 +83,21 @@ +@@ -85,11 +85,21 @@ class MountingTransaction final { */ void mergeWith(MountingTransaction &&transaction); diff --git a/patches/react-native/react-native+0.86.0+016+fix-crash-when-deleting-expense.patch b/patches/react-native/react-native+0.88.0+014+fix-crash-when-deleting-expense.patch similarity index 75% rename from patches/react-native/react-native+0.86.0+016+fix-crash-when-deleting-expense.patch rename to patches/react-native/react-native+0.88.0+014+fix-crash-when-deleting-expense.patch index 4887c3023ebf..196d7ad58227 100644 --- a/patches/react-native/react-native+0.86.0+016+fix-crash-when-deleting-expense.patch +++ b/patches/react-native/react-native+0.88.0+014+fix-crash-when-deleting-expense.patch @@ -1,12 +1,12 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt -index 9e53dc8..61f6971 100644 +index bcdbee9..b854262 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt -@@ -372,6 +372,7 @@ internal constructor( +@@ -360,6 +360,7 @@ internal constructor( // thus prevent the RemoveDeleteTree worker from deleting this // View in the future. - if (viewParent is ViewGroup) { -+ viewParent.endViewTransition(view) - viewParent.removeView(view) + if (currParentView is ViewGroup) { ++ currParentView.endViewTransition(view) + currParentView.removeView(view) } erroneouslyReaddedReactTags.add(tag) diff --git a/patches/react-native/react-native+0.86.0+017+publish-gradle.patch b/patches/react-native/react-native+0.88.0+015+publish-gradle.patch similarity index 84% rename from patches/react-native/react-native+0.86.0+017+publish-gradle.patch rename to patches/react-native/react-native+0.88.0+015+publish-gradle.patch index ceecc6e4f98d..8f05f8b7cb90 100644 --- a/patches/react-native/react-native+0.86.0+017+publish-gradle.patch +++ b/patches/react-native/react-native+0.88.0+015+publish-gradle.patch @@ -1,11 +1,3 @@ -diff --git a/node_modules/react-native/.DS_Store b/node_modules/react-native/.DS_Store -new file mode 100644 -index 0000000..60811a9 -Binary files /dev/null and b/node_modules/react-native/.DS_Store differ -diff --git a/node_modules/react-native/ReactAndroid/.DS_Store b/node_modules/react-native/ReactAndroid/.DS_Store -new file mode 100644 -index 0000000..8bfcb73 -Binary files /dev/null and b/node_modules/react-native/ReactAndroid/.DS_Store differ diff --git a/node_modules/react-native/ReactAndroid/publish.gradle b/node_modules/react-native/ReactAndroid/publish.gradle index 32287a7..77f9452 100644 --- a/node_modules/react-native/ReactAndroid/publish.gradle diff --git a/patches/react-native/react-native+0.86.0+018+textinput-prevent-focus-on-first-responder.patch b/patches/react-native/react-native+0.88.0+016+textinput-prevent-focus-on-first-responder.patch similarity index 89% rename from patches/react-native/react-native+0.86.0+018+textinput-prevent-focus-on-first-responder.patch rename to patches/react-native/react-native+0.88.0+016+textinput-prevent-focus-on-first-responder.patch index 15ab1ec7e526..d07d99e4f70c 100644 --- a/patches/react-native/react-native+0.86.0+018+textinput-prevent-focus-on-first-responder.patch +++ b/patches/react-native/react-native+0.88.0+016+textinput-prevent-focus-on-first-responder.patch @@ -25,10 +25,10 @@ index e3f4c09..6032aef 100644 export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { diff --git a/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js b/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js -index 106a147..ea1fbbc 100644 +index e1a9d25..bb8bbc7 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js +++ b/node_modules/react-native/Libraries/Components/TextInput/RCTTextInputViewConfig.js -@@ -156,6 +156,7 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { +@@ -160,6 +160,7 @@ const RCTTextInputViewConfig: PartialViewConfigWithoutName = { lineBreakStrategyIOS: true, lineBreakModeIOS: true, smartInsertDelete: true, @@ -36,49 +36,23 @@ index 106a147..ea1fbbc 100644 ...ConditionallyIgnoredEventHandlers({ onClear: true, onChange: true, -diff --git a/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts b/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts -index f3418e7..3c87fed 100644 ---- a/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts -+++ b/node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts -@@ -841,6 +841,11 @@ export interface TextInputProps - */ - multiline?: boolean | undefined; - -+ /** -+ * If true, the text input will not restore focus when the input becomes first responder. -+ */ -+ preventFocusOnFirstResponder?: boolean | undefined; -+ - /** - * Callback that is called when the text input is blurred - * -@@ -1098,4 +1103,9 @@ export class TextInput extends TextInputBase { - * Sets the start and end positions of text selection. - */ - setSelection: (start: number, end: number) => void; -+ -+ /** -+ * Prevents the text input once from restoring focus when the input becomes first responder. -+ */ -+ preventFocusOnFirstResponderOnce: () => void; - } diff --git a/node_modules/react-native/Libraries/Components/TextInput/TextInput.flow.js b/node_modules/react-native/Libraries/Components/TextInput/TextInput.flow.js -index 28fa2be..522a8ab 100644 +index 8a5f953..883ba44 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/TextInput.flow.js +++ b/node_modules/react-native/Libraries/Components/TextInput/TextInput.flow.js -@@ -1089,6 +1089,7 @@ declare class _TextInputInstance extends ReactNativeElement { - isFocused(): boolean; - getNativeRef(): ?ReactNativeElement; +@@ -1078,6 +1078,7 @@ declare class _TextInputInstance extends ReactNativeElement { + * Sets the start and end positions of text selection. + */ setSelection(start: number, end: number): void; + preventFocusOnFirstResponderOnce(): void; } export type TextInputInstance = _TextInputInstance; diff --git a/node_modules/react-native/Libraries/Components/TextInput/TextInput.js b/node_modules/react-native/Libraries/Components/TextInput/TextInput.js -index 3339947..8e7ed76 100644 +index e265ba3..820cbbe 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/TextInput.js +++ b/node_modules/react-native/Libraries/Components/TextInput/TextInput.js -@@ -491,6 +491,11 @@ function InternalTextInput(props: TextInputProps): React.Node { +@@ -381,6 +381,11 @@ function InternalTextInput(props: TextInputProps): React.Node { ); } }, @@ -91,7 +65,7 @@ index 3339947..8e7ed76 100644 } }, diff --git a/node_modules/react-native/Libraries/Components/TextInput/TextInputNativeCommands.js b/node_modules/react-native/Libraries/Components/TextInput/TextInputNativeCommands.js -index 9da8899..bf87ffd 100644 +index 63cc9a3..5ac655c 100644 --- a/node_modules/react-native/Libraries/Components/TextInput/TextInputNativeCommands.js +++ b/node_modules/react-native/Libraries/Components/TextInput/TextInputNativeCommands.js @@ -22,8 +22,9 @@ export interface TextInputNativeCommands { @@ -106,10 +80,10 @@ index 9da8899..bf87ffd 100644 export default supportedCommands; diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -index 456518f..58ec8ec 100644 +index 986a7c2..a438e62 100644 --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm -@@ -80,6 +80,16 @@ @implementation RCTTextInputComponentView { +@@ -81,6 +81,16 @@ @implementation RCTTextInputComponentView { BOOL _hasInputAccessoryView; CGSize _previousContentSize; @@ -126,7 +100,7 @@ index 456518f..58ec8ec 100644 } #pragma mark - UIView overrides -@@ -322,6 +332,10 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared & +@@ -331,6 +341,10 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared & _backedTextInputView.disableKeyboardShortcuts = newTextInputProps.disableKeyboardShortcuts; } @@ -137,7 +111,7 @@ index 456518f..58ec8ec 100644 if (newTextInputProps.acceptDragAndDropTypes != oldTextInputProps.acceptDragAndDropTypes) { if (!newTextInputProps.acceptDragAndDropTypes.has_value()) { _backedTextInputView.acceptDragAndDropTypes = nil; -@@ -399,6 +413,15 @@ - (void)prepareForRecycle +@@ -408,6 +422,15 @@ - (void)prepareForRecycle - (BOOL)textInputShouldBeginEditing { @@ -153,7 +127,7 @@ index 456518f..58ec8ec 100644 return YES; } -@@ -622,6 +645,16 @@ - (void)setTextAndSelection:(NSInteger)eventCount +@@ -644,6 +667,16 @@ - (void)setTextAndSelection:(NSInteger)eventCount _comingFromJS = NO; } @@ -228,10 +202,10 @@ index ac3adc4..5a84c01 100644 } diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputProps.h b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputProps.h -index 8994a42..332b3d1 100644 +index df8d08b..4234399 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputProps.h +++ b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputProps.h -@@ -77,6 +77,8 @@ class BaseTextInputProps : public ViewProps, public BaseTextProps { +@@ -79,6 +79,8 @@ class BaseTextInputProps : public ViewProps, public BaseTextProps { bool multiline{false}; @@ -240,3 +214,29 @@ index 8994a42..332b3d1 100644 bool disableKeyboardShortcuts{false}; std::optional> acceptDragAndDropTypes{}; +diff --git a/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts b/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts +index aea22a1..e6ed49c 100644 +--- a/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts ++++ b/node_modules/react-native/types_DEPRECATED/Libraries/Components/TextInput/TextInput.d.ts +@@ -818,6 +818,11 @@ export interface TextInputProps + */ + multiline?: boolean | undefined; + ++ /** ++ * If true, the text input will not restore focus when the input becomes first responder. ++ */ ++ preventFocusOnFirstResponder?: boolean | undefined; ++ + /** + * Callback that is called when the text input is blurred + * +@@ -1073,4 +1078,9 @@ export class TextInput extends TextInputBase { + * Sets the start and end positions of text selection. + */ + setSelection: (start: number, end: number) => void; ++ ++ /** ++ * Prevents the text input once from restoring focus when the input becomes first responder. ++ */ ++ preventFocusOnFirstResponderOnce: () => void; + } diff --git a/patches/react-native/react-native+0.86.0+019+fix-modal-transparent-navigation-bar.patch b/patches/react-native/react-native+0.88.0+017+fix-modal-transparent-navigation-bar.patch similarity index 91% rename from patches/react-native/react-native+0.86.0+019+fix-modal-transparent-navigation-bar.patch rename to patches/react-native/react-native+0.88.0+017+fix-modal-transparent-navigation-bar.patch index 2fbefb286dec..b7ed7ae45af8 100644 --- a/patches/react-native/react-native+0.86.0+019+fix-modal-transparent-navigation-bar.patch +++ b/patches/react-native/react-native+0.88.0+017+fix-modal-transparent-navigation-bar.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.kt -index f36a1e3..a51299b 100644 +index 64c61a1..f309949 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.kt @@ -18,6 +18,7 @@ import android.os.Build @@ -10,7 +10,7 @@ index f36a1e3..a51299b 100644 import android.view.ViewGroup import android.view.ViewStructure import android.view.WindowManager -@@ -343,6 +344,13 @@ public class ReactModalHostView(context: ThemedReactContext) : +@@ -345,6 +346,13 @@ public class ReactModalHostView(context: ThemedReactContext) : if (currentActivity?.isFinishing == false) { newDialog.show() updateSystemAppearance() @@ -24,7 +24,7 @@ index f36a1e3..a51299b 100644 window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) (context as ThemedReactContext).onExtraWindowCreate(window) } -@@ -392,7 +400,18 @@ public class ReactModalHostView(context: ThemedReactContext) : +@@ -394,7 +402,18 @@ public class ReactModalHostView(context: ThemedReactContext) : // Navigation bar cannot be translucent without status bar being translucent too if (navigationBarTranslucent) { @@ -44,7 +44,7 @@ index f36a1e3..a51299b 100644 } else { dialogWindow.disableEdgeToEdge() dialogWindow.setStatusBarTranslucency(statusBarTranslucent) -@@ -413,6 +432,10 @@ public class ReactModalHostView(context: ThemedReactContext) : +@@ -415,6 +434,10 @@ public class ReactModalHostView(context: ThemedReactContext) : // window manager FLog.e(TAG, "ReactModalHostView: error while setting window flags: ", e.message) } @@ -55,7 +55,7 @@ index f36a1e3..a51299b 100644 } /** -@@ -439,8 +462,21 @@ public class ReactModalHostView(context: ThemedReactContext) : +@@ -441,8 +464,21 @@ public class ReactModalHostView(context: ThemedReactContext) : WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } @@ -80,10 +80,10 @@ index f36a1e3..a51299b 100644 activityWindow.decorView.rootWindowInsets?.let { insets -> val activityRootWindowInsets = WindowInsetsCompat.toWindowInsetsCompat(insets) diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt -index 400860c..93ddc15 100644 +index b6fd707..b1f6562 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt -@@ -161,7 +161,9 @@ private fun Window.statusBarShow() { +@@ -163,7 +163,9 @@ private fun Window.statusBarShow() { } @Suppress("DEPRECATION") @@ -94,7 +94,7 @@ index 400860c..93ddc15 100644 WindowCompat.setDecorFitsSystemWindows(this, false) val insetsController = WindowInsetsControllerCompat(this, decorView) -@@ -185,7 +187,7 @@ internal fun Window.enableEdgeToEdge() { +@@ -187,7 +189,7 @@ internal fun Window.enableEdgeToEdge() { isStatusBarContrastEnforced = false isNavigationBarContrastEnforced = enforceNavigationBarContrast @@ -103,7 +103,7 @@ index 400860c..93ddc15 100644 insetsController.isAppearanceLightNavigationBars = !isDarkMode } } else { -@@ -194,7 +196,9 @@ internal fun Window.enableEdgeToEdge() { +@@ -196,7 +198,9 @@ internal fun Window.enableEdgeToEdge() { navigationBarColor = if (isAppearanceLightNavigationBars) LightNavigationBarColor else DarkNavigationBarColor diff --git a/patches/react-native/react-native+0.86.0+021+perf-increase-initial-heap-size.patch b/patches/react-native/react-native+0.88.0+018+perf-increase-initial-heap-size.patch similarity index 86% rename from patches/react-native/react-native+0.86.0+021+perf-increase-initial-heap-size.patch rename to patches/react-native/react-native+0.88.0+018+perf-increase-initial-heap-size.patch index f2740e91d968..64b21a5242e1 100644 --- a/patches/react-native/react-native+0.86.0+021+perf-increase-initial-heap-size.patch +++ b/patches/react-native/react-native+0.88.0+018+perf-increase-initial-heap-size.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactCommon/react/runtime/hermes/HermesInstance.cpp b/node_modules/react-native/ReactCommon/react/runtime/hermes/HermesInstance.cpp -index d09f3a7..9018067 100644 +index d843a83..20de7f2 100644 --- a/node_modules/react-native/ReactCommon/react/runtime/hermes/HermesInstance.cpp +++ b/node_modules/react-native/ReactCommon/react/runtime/hermes/HermesInstance.cpp -@@ -126,6 +126,8 @@ std::unique_ptr HermesInstance::createJSRuntime( +@@ -54,6 +54,8 @@ std::unique_ptr HermesInstance::createJSRuntime( assert(msgQueueThread != nullptr); auto gcConfig = ::hermes::vm::GCConfig::Builder() diff --git a/patches/react-native/react-native+0.86.0+022+perf-disable-hermes-young-gc-before-tti-reached.patch b/patches/react-native/react-native+0.88.0+019+perf-disable-hermes-young-gc-before-tti-reached.patch similarity index 89% rename from patches/react-native/react-native+0.86.0+022+perf-disable-hermes-young-gc-before-tti-reached.patch rename to patches/react-native/react-native+0.88.0+019+perf-disable-hermes-young-gc-before-tti-reached.patch index 02cdb490a967..b93b3158151c 100644 --- a/patches/react-native/react-native+0.86.0+022+perf-disable-hermes-young-gc-before-tti-reached.patch +++ b/patches/react-native/react-native+0.88.0+019+perf-disable-hermes-young-gc-before-tti-reached.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactCommon/react/runtime/hermes/HermesInstance.cpp b/node_modules/react-native/ReactCommon/react/runtime/hermes/HermesInstance.cpp -index 9018067..405a36f 100644 +index 20de7f2..2c9508a 100644 --- a/node_modules/react-native/ReactCommon/react/runtime/hermes/HermesInstance.cpp +++ b/node_modules/react-native/ReactCommon/react/runtime/hermes/HermesInstance.cpp -@@ -132,7 +132,11 @@ std::unique_ptr HermesInstance::createJSRuntime( +@@ -60,7 +60,11 @@ std::unique_ptr HermesInstance::createJSRuntime( .withMaxHeapSize(3072 << 20) .withName("RNBridgeless"); diff --git a/patches/react-native/react-native+0.86.0+023+strip-hermes-debug-info.patch b/patches/react-native/react-native+0.88.0+020+strip-hermes-debug-info.patch similarity index 91% rename from patches/react-native/react-native+0.86.0+023+strip-hermes-debug-info.patch rename to patches/react-native/react-native+0.88.0+020+strip-hermes-debug-info.patch index 199e0d9080b6..ce12309c5e1c 100644 --- a/patches/react-native/react-native+0.86.0+023+strip-hermes-debug-info.patch +++ b/patches/react-native/react-native+0.88.0+020+strip-hermes-debug-info.patch @@ -1,7 +1,8 @@ diff --git a/node_modules/react-native/scripts/react-native-xcode.sh b/node_modules/react-native/scripts/react-native-xcode.sh +index fcf05ff..2a5fb5c 100755 --- a/node_modules/react-native/scripts/react-native-xcode.sh +++ b/node_modules/react-native/scripts/react-native-xcode.sh -@@ -173,7 +173,7 @@ +@@ -202,7 +202,7 @@ else else EXTRA_COMPILER_ARGS=-O fi @@ -10,7 +11,7 @@ diff --git a/node_modules/react-native/scripts/react-native-xcode.sh b/node_modu EXTRA_COMPILER_ARGS="$EXTRA_COMPILER_ARGS -output-source-map" fi "$HERMES_CLI_PATH" -emit-binary -max-diagnostic-width=80 $EXTRA_COMPILER_ARGS -out "$DEST/$BUNDLE_NAME.jsbundle" "$BUNDLE_FILE" -@@ -183,6 +183,8 @@ +@@ -211,6 +211,8 @@ else "$NODE_BINARY" "$COMPOSE_SOURCEMAP_PATH" "$PACKAGER_SOURCEMAP_FILE" "$HBC_SOURCEMAP_FILE" -o "$SOURCEMAP_FILE" rm "$HBC_SOURCEMAP_FILE" rm "$PACKAGER_SOURCEMAP_FILE" diff --git a/patches/react-native/react-native+0.88.0+022+fix-display-contents-dirty-flag.patch b/patches/react-native/react-native+0.88.0+022+fix-display-contents-dirty-flag.patch new file mode 100644 index 000000000000..afbe0061902e --- /dev/null +++ b/patches/react-native/react-native+0.88.0+022+fix-display-contents-dirty-flag.patch @@ -0,0 +1,18 @@ +diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp +index eaf72fd..977b9b7 100644 +--- a/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp ++++ b/node_modules/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp +@@ -146,6 +146,13 @@ YogaLayoutableShadowNode::YogaLayoutableShadowNode( + updateYogaChildren(); + } + ++ for (const auto& layoutableChild : yogaLayoutableChildren_) { ++ if (static_cast(layoutableChild->yogaNode_.style().display()) == YGDisplayContents) { ++ yogaNode_.setDirty(true); ++ break; ++ } ++ } ++ + ensureConsistency(); + } + diff --git a/patches/react-native/react-native+0.86.0+026+fix-fabric-collapsed-accessibility-announcement.patch b/patches/react-native/react-native+0.88.0+023+fix-fabric-collapsed-accessibility-announcement.patch similarity index 93% rename from patches/react-native/react-native+0.86.0+026+fix-fabric-collapsed-accessibility-announcement.patch rename to patches/react-native/react-native+0.88.0+023+fix-fabric-collapsed-accessibility-announcement.patch index 3063a9bdb2d6..ad7029f319ef 100644 --- a/patches/react-native/react-native+0.86.0+026+fix-fabric-collapsed-accessibility-announcement.patch +++ b/patches/react-native/react-native+0.88.0+023+fix-fabric-collapsed-accessibility-announcement.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm -index b033b7c..6b3564e 100644 +index 233d3e2..fb542c1 100644 --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm -@@ -1542,9 +1542,16 @@ - (NSString *)accessibilityValue +@@ -1618,9 +1618,16 @@ - (NSString *)accessibilityValue addObject:RCTLocalizedString( "mixed", "a checkbox, radio button, or other widget which is both checked and unchecked")]; } diff --git a/patches/react-native/react-native+0.86.0+027+fix-pressability-new-arch.patch b/patches/react-native/react-native+0.88.0+024+fix-pressability-new-arch.patch similarity index 91% rename from patches/react-native/react-native+0.86.0+027+fix-pressability-new-arch.patch rename to patches/react-native/react-native+0.88.0+024+fix-pressability-new-arch.patch index cb93accd1be5..5b1f92b18964 100644 --- a/patches/react-native/react-native+0.86.0+027+fix-pressability-new-arch.patch +++ b/patches/react-native/react-native+0.88.0+024+fix-pressability-new-arch.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/react-native/Libraries/Pressability/Pressability.js b/node_modules/react-native/Libraries/Pressability/Pressability.js -index 8e04ee5..0d3800f 100644 +index 0be465b..c8e8487 100644 --- a/node_modules/react-native/Libraries/Pressability/Pressability.js +++ b/node_modules/react-native/Libraries/Pressability/Pressability.js @@ -805,7 +805,11 @@ export default class Pressability { @@ -16,10 +16,10 @@ index 8e04ee5..0d3800f 100644 } diff --git a/node_modules/react-native/React/FBReactNativeSpec/FBReactNativeSpecJSI.h b/node_modules/react-native/React/FBReactNativeSpec/FBReactNativeSpecJSI.h -index 0be5e10..095b19e 100644 +index ec277b2..ef3d541 100644 --- a/node_modules/react-native/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +++ b/node_modules/react-native/React/FBReactNativeSpec/FBReactNativeSpecJSI.h -@@ -5936,6 +5936,7 @@ protected: +@@ -6195,6 +6195,7 @@ protected: methodMap_["measure"] = MethodMetadata {.argCount = 2, .invoker = __measure}; methodMap_["measureInWindow"] = MethodMetadata {.argCount = 2, .invoker = __measureInWindow}; methodMap_["measureLayout"] = MethodMetadata {.argCount = 4, .invoker = __measureLayout}; @@ -27,7 +27,7 @@ index 0be5e10..095b19e 100644 methodMap_["setNativeProps"] = MethodMetadata {.argCount = 2, .invoker = __setNativeProps}; } -@@ -6112,6 +6113,15 @@ private: +@@ -6371,6 +6372,15 @@ private: count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt).asFunction(rt));return jsi::Value::undefined(); } @@ -124,10 +124,10 @@ index 9519f18..46e723a 100644 { // Does nothing. diff --git a/node_modules/react-native/React/Fabric/RCTSurfacePresenter.mm b/node_modules/react-native/React/Fabric/RCTSurfacePresenter.mm -index 5da1d1b..cdcb420 100644 +index 0e4bbe3..3bb4785 100644 --- a/node_modules/react-native/React/Fabric/RCTSurfacePresenter.mm +++ b/node_modules/react-native/React/Fabric/RCTSurfacePresenter.mm -@@ -343,6 +343,19 @@ - (void)schedulerDidSetIsJSResponder:(BOOL)isJSResponder +@@ -424,6 +424,19 @@ - (void)schedulerDidSetIsJSResponder:(BOOL)isJSResponder [_mountingManager setIsJSResponder:isJSResponder blockNativeResponder:blockNativeResponder forShadowView:shadowView]; } @@ -148,7 +148,7 @@ index 5da1d1b..cdcb420 100644 { std::unique_lock lock(_observerListMutex); diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java -index 9c29ee6..3ec5712 100644 +index 1ba1a11..63dd508 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -25,6 +25,7 @@ import android.os.SystemClock; @@ -158,8 +158,8 @@ index 9c29ee6..3ec5712 100644 +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; - import androidx.core.view.ViewCompat.FocusDirection; -@@ -33,6 +34,7 @@ import com.facebook.infer.annotation.Assertions; + import androidx.annotation.VisibleForTesting; +@@ -34,6 +35,7 @@ import com.facebook.infer.annotation.Assertions; import com.facebook.infer.annotation.Nullsafe; import com.facebook.infer.annotation.ThreadConfined; import com.facebook.proguard.annotations.DoNotStripAny; @@ -167,7 +167,7 @@ index 9c29ee6..3ec5712 100644 import com.facebook.react.bridge.ColorPropConverter; import com.facebook.react.bridge.GuardedRunnable; import com.facebook.react.bridge.LifecycleEventListener; -@@ -1404,6 +1406,44 @@ public class FabricUIManager +@@ -1440,6 +1442,44 @@ public class FabricUIManager }); } @@ -282,7 +282,7 @@ index 0000000..9680cf5 + } +} diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.kt -index aa03650..fca2d9d 100644 +index b788bb5..a985774 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.kt @@ -22,6 +22,7 @@ import com.facebook.react.bridge.WritableMap @@ -293,7 +293,7 @@ index aa03650..fca2d9d 100644 import com.facebook.react.uimanager.RootViewManager import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.ViewManagerRegistry -@@ -327,6 +328,32 @@ internal class MountingManager( +@@ -326,6 +327,32 @@ internal class MountingManager( attachmentsPositions, ) @@ -323,22 +323,22 @@ index aa03650..fca2d9d 100644 + return true; + } + - fun enqueuePendingEvent( + fun dispatchEvent( surfaceId: Int, reactTag: Int, diff --git a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp -index b82bdab..66436ac 100644 +index a380c19..7bc7d73 100644 --- a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp +++ b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp -@@ -14,6 +14,7 @@ - #include +@@ -15,6 +15,7 @@ #include + #include #include +#include #include #include #include -@@ -1260,4 +1261,16 @@ void FabricMountingManager::scheduleReactRevisionMerge(SurfaceId surfaceId) { +@@ -1277,4 +1278,16 @@ void FabricMountingManager::scheduleReactRevisionMerge(SurfaceId surfaceId) { scheduleReactRevisionMerge(javaUIManager_, surfaceId); } @@ -356,10 +356,10 @@ index b82bdab..66436ac 100644 + } // namespace facebook::react diff --git a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.h b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.h -index 377880b..f1643c1 100644 +index 3d31c58..b8c5d18 100644 --- a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.h +++ b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.h -@@ -76,6 +76,10 @@ class FabricMountingManager final { +@@ -92,6 +92,10 @@ class FabricMountingManager final { void scheduleReactRevisionMerge(SurfaceId surfaceId); @@ -371,10 +371,10 @@ index 377880b..f1643c1 100644 bool isOnMainThread(); diff --git a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp -index dfaac96..3428553 100644 +index 31ccd1e..716cb3c 100644 --- a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp +++ b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp -@@ -797,6 +797,17 @@ void FabricUIManagerBinding::schedulerDidUpdateShadowTree( +@@ -861,6 +861,17 @@ void FabricUIManagerBinding::schedulerDidUpdateShadowTree( // no-op } @@ -393,7 +393,7 @@ index dfaac96..3428553 100644 Tag tag, SurfaceId surfaceId) { diff --git a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.h b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.h -index caf652d..e2f957e 100644 +index ea4b928..3b5b268 100644 --- a/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.h +++ b/node_modules/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.h @@ -117,6 +117,10 @@ class FabricUIManagerBinding : public jni::HybridClass, @@ -408,10 +408,10 @@ index caf652d..e2f957e 100644 void schedulerDidSetViewSnapshot(Tag sourceTag, Tag targetTag, SurfaceId surfaceId) override; diff --git a/node_modules/react-native/ReactCommon/react/nativemodule/dom/NativeDOM.cpp b/node_modules/react-native/ReactCommon/react/nativemodule/dom/NativeDOM.cpp -index da40ea3..8aebe84 100644 +index b01fab0..671fdd8 100644 --- a/node_modules/react-native/ReactCommon/react/nativemodule/dom/NativeDOM.cpp +++ b/node_modules/react-native/ReactCommon/react/nativemodule/dom/NativeDOM.cpp -@@ -466,6 +466,34 @@ void NativeDOM::measureLayout( +@@ -472,6 +472,34 @@ void NativeDOM::measureLayout( onSuccess(rect.x, rect.y, rect.width, rect.height); } @@ -443,14 +443,14 @@ index da40ea3..8aebe84 100644 + uiManagerDelegate->uiManagerMeasureAsyncOnUI(shadowNode, jsCallback); +} + - #pragma mark - Legacy direct manipulation APIs (for `ReactNativeElement`). + #pragma mark - Legacy direct manipulation APIs (for ReactNativeElement). void NativeDOM::setNativeProps( diff --git a/node_modules/react-native/ReactCommon/react/nativemodule/dom/NativeDOM.h b/node_modules/react-native/ReactCommon/react/nativemodule/dom/NativeDOM.h -index 19157a9..9fded72 100644 +index 2c23987..5696d59 100644 --- a/node_modules/react-native/ReactCommon/react/nativemodule/dom/NativeDOM.h +++ b/node_modules/react-native/ReactCommon/react/nativemodule/dom/NativeDOM.h -@@ -108,6 +108,14 @@ class NativeDOM : public NativeDOMCxxSpec { +@@ -110,6 +110,14 @@ class NativeDOM : public NativeDOMCxxSpec { jsi::Function onFail, const MeasureLayoutOnSuccessCallback &onSuccess); @@ -466,10 +466,10 @@ index 19157a9..9fded72 100644 void setNativeProps(jsi::Runtime &rt, std::shared_ptr shadowNode, jsi::Value updatePayload); diff --git a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp -index 7ea5fc3..86fa407 100644 +index e74e802..e301044 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp -@@ -462,6 +462,15 @@ void Scheduler::uiManagerDidStartSurface(const ShadowTree& shadowTree) { +@@ -435,6 +435,15 @@ void Scheduler::uiManagerDidStartSurface(const ShadowTree& shadowTree) { } } @@ -486,10 +486,10 @@ index 7ea5fc3..86fa407 100644 uiManager_->reportMount(surfaceId); } diff --git a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h -index bd6de83..faa7d48 100644 +index 1f5a59d..9b746ae 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h +++ b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h -@@ -103,6 +103,9 @@ class Scheduler final : public UIManagerDelegate { +@@ -106,6 +106,9 @@ class Scheduler final : public UIManagerDelegate { void uiManagerDidFinishReactCommit(const ShadowTree &shadowTree) override; void uiManagerDidPromoteReactRevision(const ShadowTree &shadowTree) override; void uiManagerDidStartSurface(const ShadowTree &shadowTree) override; @@ -500,10 +500,10 @@ index bd6de83..faa7d48 100644 #pragma mark - ContextContainer std::shared_ptr getContextContainer() const; diff --git a/node_modules/react-native/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h b/node_modules/react-native/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h -index 06d9773..ec15e08 100644 +index 10f4501..973fcb1 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h +++ b/node_modules/react-native/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h -@@ -66,6 +66,10 @@ class SchedulerDelegate { +@@ -68,6 +68,10 @@ class SchedulerDelegate { virtual void schedulerDidUpdateShadowTree(const std::unordered_map &tagToProps) = 0; @@ -515,10 +515,10 @@ index 06d9773..ec15e08 100644 virtual void schedulerDidCaptureViewSnapshot(Tag tag, SurfaceId surfaceId) = 0; virtual void schedulerDidSetViewSnapshot(Tag sourceTag, Tag targetTag, SurfaceId surfaceId) = 0; diff --git a/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h b/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h -index 235b1fe..b6aa0cf 100644 +index f88bef9..1da0a68 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h +++ b/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h -@@ -79,6 +79,14 @@ class UIManagerDelegate { +@@ -81,6 +81,14 @@ class UIManagerDelegate { */ virtual void uiManagerShouldRemoveEventListener(const std::shared_ptr &listener) = 0; @@ -533,30 +533,18 @@ index 235b1fe..b6aa0cf 100644 /* * Start surface. */ -diff --git a/node_modules/react-native/src/private/types/HostInstance.js b/node_modules/react-native/src/private/types/HostInstance.js -index cb7dff7..ff01e4b 100644 ---- a/node_modules/react-native/src/private/types/HostInstance.js -+++ b/node_modules/react-native/src/private/types/HostInstance.js -@@ -72,6 +72,11 @@ export interface LegacyHostInstanceMethods { - * prop](docs/view.html#onlayout) instead. - */ - measure(callback: MeasureOnSuccessCallback): void; -+ /** -+ * Same as `measure()`, but instead of using the shadow nodes layout information, -+ * it uses the native layout hierarchy to measure the view on the UI thread. -+ */ -+ measureAsyncOnUI(callback: MeasureOnSuccessCallback): void; - /** - * Determines the location of the given view in the window and returns the - * values via an async callback. If the React root view is embedded in diff --git a/node_modules/react-native/src/private/webapis/dom/nodes/ReactNativeElement.js b/node_modules/react-native/src/private/webapis/dom/nodes/ReactNativeElement.js -index f1e76f6..b6ecafe 100644 +index 6e236da..1a8b2c5 100644 --- a/node_modules/react-native/src/private/webapis/dom/nodes/ReactNativeElement.js +++ b/node_modules/react-native/src/private/webapis/dom/nodes/ReactNativeElement.js -@@ -167,6 +167,18 @@ class ReactNativeElement extends ReadOnlyElement implements NativeMethods { +@@ -196,6 +196,22 @@ class ReactNativeElement extends ReadOnlyElement { } } ++ /** ++ * Same as `measure()`, but instead of using the shadow nodes layout information, ++ * it uses the native layout hierarchy to measure the view on the UI thread. ++ */ + measureAsyncOnUI(callback: MeasureOnSuccessCallback) { + const node = getNativeElementReference(this); + if (node != null) { @@ -569,18 +557,18 @@ index f1e76f6..b6ecafe 100644 + } + } + - measureInWindow(callback: MeasureInWindowOnSuccessCallback) { - const node = getNativeElementReference(this); - if (node != null) { + /** + * Determines the location of the given view in the window and returns the + * values via an async callback. If the React root view is embedded in diff --git a/node_modules/react-native/src/private/webapis/dom/nodes/specs/NativeDOM.js b/node_modules/react-native/src/private/webapis/dom/nodes/specs/NativeDOM.js -index 1cb40bc..3138626 100644 +index 5253243..b6d7b52 100644 --- a/node_modules/react-native/src/private/webapis/dom/nodes/specs/NativeDOM.js +++ b/node_modules/react-native/src/private/webapis/dom/nodes/specs/NativeDOM.js -@@ -159,6 +159,11 @@ export interface Spec extends TurboModule { +@@ -157,6 +157,11 @@ export interface Spec extends TurboModule { onSuccess: MeasureLayoutOnSuccessCallback, ) => void; -+ +measureAsyncOnUI: ( ++ readonly measureAsyncOnUI: ( + nativeElementReference: mixed, + callback: MeasureOnSuccessCallback, + ) => void; @@ -588,11 +576,11 @@ index 1cb40bc..3138626 100644 /** * Legacy direct manipulation APIs (for `ReactNativeElement`). */ -@@ -429,6 +434,11 @@ export interface RefinedSpec { +@@ -431,6 +436,11 @@ export interface RefinedSpec { onSuccess: MeasureLayoutOnSuccessCallback, ) => void; -+ +measureAsyncOnUI: ( ++ readonly measureAsyncOnUI: ( + nativeElementReference: NativeElementReference, + callback: MeasureOnSuccessCallback, + ) => void; diff --git a/patches/react-native/react-native+0.86.0+029+fix-deadlock-APP-7B2.patch b/patches/react-native/react-native+0.88.0+025+fix-deadlock-APP-7B2.patch similarity index 87% rename from patches/react-native/react-native+0.86.0+029+fix-deadlock-APP-7B2.patch rename to patches/react-native/react-native+0.88.0+025+fix-deadlock-APP-7B2.patch index a146923cd02a..52140b5f6175 100644 --- a/patches/react-native/react-native+0.86.0+029+fix-deadlock-APP-7B2.patch +++ b/patches/react-native/react-native+0.88.0+025+fix-deadlock-APP-7B2.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp b/node_modules/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp -index 4838b3b..d23701f 100644 +index e1d4791..35f2317 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp -@@ -30,7 +30,6 @@ ComponentDescriptorRegistry::ComponentDescriptorRegistry( +@@ -32,7 +32,6 @@ ComponentDescriptorRegistry::ComponentDescriptorRegistry( void ComponentDescriptorRegistry::add( const ComponentDescriptorProvider& componentDescriptorProvider) const { @@ -10,7 +10,7 @@ index 4838b3b..d23701f 100644 auto componentDescriptor = componentDescriptorProvider.constructor( {.eventDispatcher = parameters_.eventDispatcher, -@@ -44,6 +43,7 @@ void ComponentDescriptorRegistry::add( +@@ -47,6 +46,7 @@ void ComponentDescriptorRegistry::add( auto sharedComponentDescriptor = std::shared_ptr( std::move(componentDescriptor)); diff --git a/patches/react-native/react-native+0.86.0+030+fix-nil-BlobModule-crash-APP-8BM.patch b/patches/react-native/react-native+0.88.0+026+fix-nil-BlobModule-crash-APP-8BM.patch similarity index 90% rename from patches/react-native/react-native+0.86.0+030+fix-nil-BlobModule-crash-APP-8BM.patch rename to patches/react-native/react-native+0.88.0+026+fix-nil-BlobModule-crash-APP-8BM.patch index d0a50ce8c581..7eeb980d5309 100644 --- a/patches/react-native/react-native+0.86.0+030+fix-nil-BlobModule-crash-APP-8BM.patch +++ b/patches/react-native/react-native+0.88.0+026+fix-nil-BlobModule-crash-APP-8BM.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm b/node_modules/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm -index fabfff3..cefa0fa 100644 +index ae3ae25..43890b1 100644 --- a/node_modules/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm +++ b/node_modules/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm -@@ -103,11 +103,16 @@ void RCTAppSetupPrepareApp(UIApplication *application, BOOL turboModuleEnabled) +@@ -80,12 +80,17 @@ initWithHandlersProvider:^NSArray> *(RCTModuleRegistry *moduleRegistry) { NSArray *URLRequestHandlerModules = extractModuleConformingToProtocol(moduleRegistry, @protocol(RCTURLRequestHandler)); @@ -22,3 +22,4 @@ index fabfff3..cefa0fa 100644 + return [defaultHandlers arrayByAddingObjectsFromArray:URLRequestHandlerModules]; }]; } + // No custom initializer here. diff --git a/patches/react-native/react-native+0.86.0+031+nested-text-border-radius.patch b/patches/react-native/react-native+0.88.0+027+nested-text-border-radius.patch similarity index 86% rename from patches/react-native/react-native+0.86.0+031+nested-text-border-radius.patch rename to patches/react-native/react-native+0.88.0+027+nested-text-border-radius.patch index 47d3fd5c48dd..365d1325ccc1 100644 --- a/patches/react-native/react-native+0.86.0+031+nested-text-border-radius.patch +++ b/patches/react-native/react-native+0.88.0+027+nested-text-border-radius.patch @@ -1,48 +1,25 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java -index a23e1d3..11a7151 100644 +index c20f271..a2206c7 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java -@@ -46,6 +46,7 @@ import com.facebook.react.uimanager.style.BorderRadiusProp; - import com.facebook.react.uimanager.style.BorderStyle; - import com.facebook.react.uimanager.style.LogicalEdge; - import com.facebook.react.uimanager.style.Overflow; -+import com.facebook.react.views.text.internal.span.DrawCommandSpan; - import com.facebook.react.views.text.internal.span.ReactFragmentIndexSpan; - import com.facebook.react.views.text.internal.span.ReactTagSpan; - import com.facebook.yoga.YogaMeasureMode; -@@ -212,6 +213,27 @@ public class ReactTextView extends AppCompatTextView implements ReactCompoundVie - BackgroundStyleApplicator.clipToPaddingBox(this, canvas); - } - -+ // Draw custom DrawCommandSpan backgrounds before the text so they appear behind it. -+ Layout layout = getLayout(); -+ if (spanned != null && layout != null) { -+ DrawCommandSpan[] drawSpans = spanned.getSpans(0, spanned.length(), DrawCommandSpan.class); -+ if (drawSpans.length > 0) { -+ int saveCount = canvas.save(); -+ canvas.translate(getTotalPaddingLeft(), getTotalPaddingTop()); -+ for (DrawCommandSpan span : drawSpans) { -+ span.onPreDraw(spanned.getSpanStart(span), spanned.getSpanEnd(span), canvas, layout); -+ } -+ canvas.restoreToCount(saveCount); -+ } -+ } else if (spanned != null) { -+ // getLayout() is null on this draw (typically right after setText() during view -+ // recycling, before the measure pass has rebuilt mLayout). super.onDraw below -+ // will call assumeLayout() and draw the text. Schedule another frame so the next -+ // onDraw — which will find a non-null layout — can paint the DrawCommandSpan -+ // backgrounds underneath. Without this the no-background frame becomes final state. -+ postInvalidateOnAnimation(); -+ } -+ - super.onDraw(canvas); - } - } +@@ -231,6 +231,12 @@ public class ReactTextView extends AppCompatTextView implements ReactCompoundVie + } + } else { + super.onDraw(canvas); ++ // getLayout() is null on this draw (typically right after setText() during view ++ // recycling, before the measure pass has rebuilt mLayout). super.onDraw above ++ // will call assumeLayout() and draw the text. Schedule another frame so the next ++ // onDraw — which will find a non-null layout — can paint the CanvasEffectSpan ++ // backgrounds underneath. Without this the no-background frame becomes final state. ++ postInvalidateOnAnimation(); + } + } else { + super.onDraw(canvas); diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt -index 45c8bec..8406652 100644 +index 4ebaa56..d91688e 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt -@@ -67,6 +67,18 @@ public class TextAttributeProps private constructor() { +@@ -68,6 +68,18 @@ public class TextAttributeProps private constructor() { public var isBackgroundColorSet: Boolean = false private set @@ -61,21 +38,21 @@ index 45c8bec..8406652 100644 public var opacity: Float = Float.NaN private set -@@ -375,6 +387,10 @@ public class TextAttributeProps private constructor() { - public const val TA_KEY_ROLE: Int = 26 - public const val TA_KEY_TEXT_TRANSFORM: Int = 27 +@@ -402,6 +414,10 @@ public class TextAttributeProps private constructor() { public const val TA_KEY_MAX_FONT_SIZE_MULTIPLIER: Int = 29 -+ public const val TA_KEY_BORDER_TOP_LEFT_RADIUS: Int = 30 -+ public const val TA_KEY_BORDER_TOP_RIGHT_RADIUS: Int = 31 -+ public const val TA_KEY_BORDER_BOTTOM_LEFT_RADIUS: Int = 32 -+ public const val TA_KEY_BORDER_BOTTOM_RIGHT_RADIUS: Int = 33 + public const val TA_KEY_TEXT_EFFECTS: Int = 30 + public const val TA_KEY_FONT_VARIATION_SETTINGS: Int = 31 ++ public const val TA_KEY_BORDER_TOP_LEFT_RADIUS: Int = 32 ++ public const val TA_KEY_BORDER_TOP_RIGHT_RADIUS: Int = 33 ++ public const val TA_KEY_BORDER_BOTTOM_LEFT_RADIUS: Int = 34 ++ public const val TA_KEY_BORDER_BOTTOM_RIGHT_RADIUS: Int = 35 + private const val TE_KEY_NAME: Int = 0 + private const val TE_KEY_PROPS: Int = 1 - public const val UNSET: Int = -1 - -@@ -429,6 +445,14 @@ public class TextAttributeProps private constructor() { - TA_KEY_TEXT_TRANSFORM -> result.setTextTransform(entry.stringValue) - TA_KEY_MAX_FONT_SIZE_MULTIPLIER -> - result.maxFontSizeMultiplier = entry.doubleValue.toFloat() +@@ -477,6 +493,14 @@ public class TextAttributeProps private constructor() { + } + result.textEffects = list + } + TA_KEY_BORDER_TOP_LEFT_RADIUS -> + result.borderTopLeftRadius = entry.doubleValue.toFloat() + TA_KEY_BORDER_TOP_RIGHT_RADIUS -> @@ -88,10 +65,10 @@ index 45c8bec..8406652 100644 } diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt -index eacec69..cf09164 100644 +index 66e6f24..26713a3 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt -@@ -41,6 +41,7 @@ import com.facebook.react.views.text.internal.span.CustomLineHeightSpan +@@ -46,6 +46,7 @@ import com.facebook.react.views.text.internal.span.CustomLineHeightSpan import com.facebook.react.views.text.internal.span.CustomStyleSpan import com.facebook.react.views.text.internal.span.ReactAbsoluteSizeSpan import com.facebook.react.views.text.internal.span.ReactBackgroundColorSpan @@ -99,7 +76,7 @@ index eacec69..cf09164 100644 import com.facebook.react.views.text.internal.span.ReactClickableSpan import com.facebook.react.views.text.internal.span.ReactForegroundColorSpan import com.facebook.react.views.text.internal.span.ReactFragmentIndexSpan -@@ -282,7 +283,23 @@ internal object TextLayoutManager { +@@ -299,7 +300,23 @@ internal object TextLayoutManager { } if (textAttributes.isBackgroundColorSet) { textAttributes.backgroundColor @@ -124,7 +101,7 @@ index eacec69..cf09164 100644 ?.let { SetSpanOperation(start, end, it) } ?.let { ops.add(it) } } -@@ -451,12 +468,25 @@ internal object TextLayoutManager { +@@ -525,12 +542,25 @@ internal object TextLayoutManager { } if (fragment.props.isBackgroundColorSet) { @@ -158,10 +135,10 @@ index eacec69..cf09164 100644 if (!fragment.props.opacity.isNaN()) { diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt new file mode 100644 -index 0000000..326b049 +index 0000000..8bbbf40 --- /dev/null +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt -@@ -0,0 +1,117 @@ +@@ -0,0 +1,118 @@ +/* Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the @@ -175,10 +152,11 @@ index 0000000..326b049 +import android.graphics.Path +import android.graphics.RectF +import android.text.Layout ++import android.text.style.UpdateAppearance +import androidx.annotation.ColorInt + +/** -+ * A [DrawCommandSpan] that draws a rounded-rectangle background behind inline text spans. When ++ * A [CanvasEffectSpan] that draws a rounded-rectangle background behind inline text spans. When + * borderRadius is 0, this draws a plain rectangle identical to [ReactBackgroundColorSpan]. + * + * For multiline spans, only the outer corners are rounded: left corners on the first line, right @@ -190,7 +168,7 @@ index 0000000..326b049 + private val borderTopRightRadius: Float, + private val borderBottomLeftRadius: Float, + private val borderBottomRightRadius: Float, -+) : DrawCommandSpan() { ++) : CanvasEffectSpan(), ReactSpan, UpdateAppearance { + + private val paint = + Paint().apply { @@ -280,7 +258,7 @@ index 0000000..326b049 + } +} diff --git a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp -index 69ea8c8..f63e2aa 100644 +index 5851ec2..cd249ce 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp @@ -27,6 +27,21 @@ void TextAttributes::apply(TextAttributes textAttributes) { @@ -305,12 +283,12 @@ index 69ea8c8..f63e2aa 100644 // Font fontFamily = !textAttributes.fontFamily.empty() ? textAttributes.fontFamily -@@ -141,7 +156,12 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { - layoutDirection, +@@ -148,7 +163,12 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { accessibilityRole, role, -- textTransform) == -+ textTransform, + textTransform, +- textEffects) == ++ textEffects, + borderRadius, + borderTopLeftRadius, + borderTopRightRadius, @@ -319,12 +297,12 @@ index 69ea8c8..f63e2aa 100644 std::tie( rhs.foregroundColor, rhs.backgroundColor, -@@ -164,7 +184,12 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { - rhs.layoutDirection, +@@ -173,7 +193,12 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { rhs.accessibilityRole, rhs.role, -- rhs.textTransform) && -+ rhs.textTransform, + rhs.textTransform, +- rhs.textEffects) && ++ rhs.textEffects, + rhs.borderRadius, + rhs.borderTopLeftRadius, + rhs.borderTopRightRadius, @@ -333,7 +311,7 @@ index 69ea8c8..f63e2aa 100644 floatEquality(maxFontSizeMultiplier, rhs.maxFontSizeMultiplier) && floatEquality(opacity, rhs.opacity) && floatEquality(fontSize, rhs.fontSize) && -@@ -199,6 +224,24 @@ SharedDebugStringConvertibleList TextAttributes::getDebugProps() const { +@@ -208,6 +233,24 @@ SharedDebugStringConvertibleList TextAttributes::getDebugProps() const { debugStringConvertibleItem( "foregroundColor", foregroundColor, textAttributes.foregroundColor), debugStringConvertibleItem("opacity", opacity, textAttributes.opacity), @@ -359,10 +337,10 @@ index 69ea8c8..f63e2aa 100644 // Font debugStringConvertibleItem( diff --git a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h -index b664524..2eaa3bc 100644 +index ffbbcf8..66447fe 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h +++ b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h -@@ -42,6 +42,11 @@ class TextAttributes : public DebugStringConvertible { +@@ -50,6 +50,11 @@ class TextAttributes : public DebugStringConvertible { SharedColor foregroundColor{}; SharedColor backgroundColor{}; Float opacity{std::numeric_limits::quiet_NaN()}; @@ -374,38 +352,38 @@ index b664524..2eaa3bc 100644 // Font std::string fontFamily{""}; -@@ -138,7 +143,12 @@ struct hash { - textAttributes.isPressable, +@@ -171,6 +176,13 @@ struct hash { textAttributes.layoutDirection, textAttributes.accessibilityRole, -- textAttributes.role); -+ textAttributes.role, + textAttributes.role); ++ facebook::react::hash_combine_optionals( ++ seed, + textAttributes.borderRadius, + textAttributes.borderTopLeftRadius, + textAttributes.borderTopRightRadius, + textAttributes.borderBottomLeftRadius, + textAttributes.borderBottomRightRadius); + return seed; } }; - } // namespace std diff --git a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h -index 331e201..8277d40 100644 +index beed967..78b1d9e 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h +++ b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h -@@ -1128,6 +1128,10 @@ constexpr static MapBuffer::Key TA_KEY_ROLE = 26; - constexpr static MapBuffer::Key TA_KEY_TEXT_TRANSFORM = 27; - constexpr static MapBuffer::Key TA_KEY_ALIGNMENT_VERTICAL = 28; +@@ -1143,6 +1143,10 @@ constexpr static MapBuffer::Key TA_KEY_ALIGNMENT_VERTICAL = 28; constexpr static MapBuffer::Key TA_KEY_MAX_FONT_SIZE_MULTIPLIER = 29; -+constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_LEFT_RADIUS = 30; -+constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_RIGHT_RADIUS = 31; -+constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_LEFT_RADIUS = 32; -+constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_RIGHT_RADIUS = 33; + constexpr static MapBuffer::Key TA_KEY_TEXT_EFFECTS = 30; + constexpr static MapBuffer::Key TA_KEY_FONT_VARIATION_SETTINGS = 31; ++constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_LEFT_RADIUS = 32; ++constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_RIGHT_RADIUS = 33; ++constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_LEFT_RADIUS = 34; ++constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_RIGHT_RADIUS = 35; - // constants for ParagraphAttributes serialization - constexpr static MapBuffer::Key PA_KEY_MAX_NUMBER_OF_LINES = 0; -@@ -1332,6 +1336,28 @@ inline MapBuffer toMapBuffer(const TextAttributes &textAttributes) - if (textAttributes.role.has_value()) { - builder.putInt(TA_KEY_ROLE, static_cast(*textAttributes.role)); + // Keys within each text effect entry MapBuffer + constexpr static MapBuffer::Key TE_KEY_NAME = 0; +@@ -1364,6 +1368,28 @@ inline MapBuffer toMapBuffer(const TextAttributes &textAttributes) + } + builder.putMapBuffer(TA_KEY_TEXT_EFFECTS, effectsBuilder.build()); } + { + const bool hasAny = textAttributes.borderRadius.has_value() || @@ -433,10 +411,10 @@ index 331e201..8277d40 100644 } diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp -index e2ab678..803cbfe 100644 +index 135463a..79fb59d 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp -@@ -222,6 +222,36 @@ static TextAttributes convertRawProp( +@@ -227,6 +227,36 @@ static TextAttributes convertRawProp( "backgroundColor", sourceTextAttributes.backgroundColor, defaultTextAttributes.backgroundColor); @@ -473,7 +451,7 @@ index e2ab678..803cbfe 100644 return textAttributes; } -@@ -334,6 +364,16 @@ void BaseTextProps::setProp( +@@ -344,6 +374,16 @@ void BaseTextProps::setProp( defaults, value, textAttributes, opacity, "opacity"); REBUILD_FIELD_SWITCH_CASE( defaults, value, textAttributes, backgroundColor, "backgroundColor"); @@ -490,7 +468,7 @@ index e2ab678..803cbfe 100644 } } -@@ -533,6 +573,44 @@ void BaseTextProps::appendTextAttributesProps( +@@ -551,6 +591,44 @@ void BaseTextProps::appendTextAttributesProps( oldProps->textAttributes.backgroundColor) { result["backgroundColor"] = *textAttributes.backgroundColor; } @@ -536,7 +514,7 @@ index e2ab678..803cbfe 100644 #endif diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.h b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.h -index 902912e..26c04e9 100644 +index 6ceec3a..ae0cfbe 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.h +++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.h @@ -19,6 +19,9 @@ NSString *const RCTAttributedStringEventEmitterKey = @"EventEmitter"; @@ -546,14 +524,14 @@ index 902912e..26c04e9 100644 +// Custom attribute for border radius on inline text backgrounds +NSString *const RCTTextBorderRadiusAttributeName = @"RCTTextBorderRadius"; + - /* - * Creates `NSTextAttributes` from given `facebook::react::TextAttributes` - */ + // Custom attribute key for ranges whose decoration line cannot be rendered + // faithfully via UIKit's `NSUnderlineStyle` pattern bits (wavy has no native + // equivalent; dotted/dashed don't match the geometry browsers use). These diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm -index f96a049..585e06e 100644 +index 95ff5a0..09badce 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm +++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm -@@ -183,8 +183,30 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex +@@ -205,8 +205,30 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex attributes[NSForegroundColorAttributeName] = effectiveForegroundColor; } @@ -587,18 +565,18 @@ index f96a049..585e06e 100644 // Kerning diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm -index ac55304..b480614 100644 +index 5f9847a..4adbab0 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm -@@ -8,6 +8,7 @@ - #import "RCTTextLayoutManager.h" +@@ -10,6 +10,7 @@ + #import #import "RCTAttributedTextUtils.h" +#import "RCTTextLayoutManagerWithBorderRadius.h" #import #import -@@ -233,7 +234,7 @@ - (NSTextStorage *)_textStorageAndLayoutManagerWithAttributesString:(NSAttribute +@@ -427,7 +428,7 @@ - (NSTextStorage *)_textStorageAndLayoutManagerWithAttributesString:(NSAttribute : NSLineBreakByClipping; textContainer.maximumNumberOfLines = paragraphAttributes.maximumNumberOfLines; diff --git a/patches/react-native/react-native+0.86.0+032+fix-recycled-view-stale-frame.patch b/patches/react-native/react-native+0.88.0+028+fix-recycled-view-stale-frame.patch similarity index 53% rename from patches/react-native/react-native+0.86.0+032+fix-recycled-view-stale-frame.patch rename to patches/react-native/react-native+0.88.0+028+fix-recycled-view-stale-frame.patch index 2d602f98d4c8..2fc14d4716f3 100644 --- a/patches/react-native/react-native+0.86.0+032+fix-recycled-view-stale-frame.patch +++ b/patches/react-native/react-native+0.88.0+028+fix-recycled-view-stale-frame.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm -index b033b7c..8d4d921 100644 +index fb542c1..11a2f22 100644 --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm -@@ -689,13 +689,16 @@ - (void)prepareForRecycle +@@ -747,13 +747,14 @@ - (void)prepareForRecycle [super prepareForRecycle]; // If view was managed by animated, its props need to align with UIView's properties. @@ -10,9 +10,7 @@ index b033b7c..8d4d921 100644 + // `_propKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN`) because libraries such as + // Reanimated mutate `layer.transform`/`layer.opacity` directly on the UI thread without + // registering those keys, so the conditional checks below would otherwise miss them and -+ // leave a recycled view with a stale transform/opacity. Restoring an identity transform -+ // is also required before resetting `center`/`bounds` below (changing frame under a -+ // non-identity transform is undefined behavior). ++ // leave a recycled view with a stale transform/opacity. const auto &props = static_cast(*_props); - if ([_propKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN containsObject:@"transform"]) { - self.layer.transform = RCTCATransform3DFromTransformMatrix(props.transform); @@ -25,21 +23,3 @@ index b033b7c..8d4d921 100644 // Clean up box shadow layers to prevent cross-component contamination if (_boxShadowLayers != nullptr) { -@@ -723,6 +726,17 @@ - (void)prepareForRecycle - _removeClippedSubviews = NO; - _reactSubviews = [NSMutableArray new]; - _layoutMetrics = {}; -+ -+ // Keep the physical geometry in sync with the cleared `_layoutMetrics`. Without -+ // this, a recycled view keeps the frame of its previous occupant. If it is later -+ // dequeued for a component whose layout frame is also zero ({0, 0, 0, 0}) - which -+ // is common for layout-less wrapper/placeholder views - `updateLayoutMetrics` -+ // compares the incoming zero frame against the (also zero) `_layoutMetrics.frame`, -+ // detects "no change", and skips updating `center`/`bounds`. The view then retains -+ // the stale (e.g. full-screen) frame from the previous occupant, turning a -+ // zero-sized JS view into an invisible, full-screen view that swallows all touches. -+ self.center = CGPointZero; -+ self.bounds = CGRectZero; - } - - - (void)setPropKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN:(NSSet *_Nullable)props diff --git a/patches/react-native/react-native+0.88.0+029+fix-runtime-scheduler-delegate-uaf-APP-25V.patch b/patches/react-native/react-native+0.88.0+029+fix-runtime-scheduler-delegate-uaf-APP-25V.patch new file mode 100644 index 000000000000..44e06eeb604c --- /dev/null +++ b/patches/react-native/react-native+0.88.0+029+fix-runtime-scheduler-delegate-uaf-APP-25V.patch @@ -0,0 +1,85 @@ +diff --git a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +index e301044..21e1e71 100644 +--- a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp ++++ b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +@@ -31,7 +31,8 @@ Scheduler::Scheduler( + const SchedulerToolbox& schedulerToolbox, + UIManagerAnimationDelegate* animationDelegate, + SchedulerDelegate* delegate) +- : runtimeExecutor_(schedulerToolbox.runtimeExecutor), ++ : delegateInvalidated_(std::make_shared>(false)), ++ runtimeExecutor_(schedulerToolbox.runtimeExecutor), + contextContainer_(schedulerToolbox.contextContainer) { + // Creating a container for future `EventDispatcher` instance. + eventDispatcher_ = std::make_shared>(); +@@ -181,6 +182,11 @@ Scheduler::~Scheduler() { + LOG(WARNING) << "Scheduler::~Scheduler() was called (address: " << this + << ")."; + ++ // Invalidate any deferred rendering-update lambdas that captured the current ++ // raw delegate_ pointer. Scheduler is being destroyed, so those lambdas must ++ // no-op instead of dereferencing a delegate that may have been torn down. ++ delegateInvalidated_->store(true, std::memory_order_release); ++ + auto weakRuntimeScheduler = + contextContainer_->find>( + RuntimeSchedulerKey); +@@ -270,6 +276,14 @@ Scheduler::findComponentDescriptorByHandle_DO_NOT_USE_THIS_IS_BROKEN( + #pragma mark - Delegate + + void Scheduler::setDelegate(SchedulerDelegate* delegate) { ++ if (delegate_ != delegate) { ++ // Queued lambdas capture this shared token by value. Invalidate the old ++ // token before installing a fresh one so work captured against a previous ++ // delegate cannot be re-armed by a later delegate assignment. ++ delegateInvalidated_->store(true, std::memory_order_release); ++ delegateInvalidated_ = std::make_shared>(false); ++ } ++ + delegate_ = delegate; + } + +@@ -304,7 +318,12 @@ void Scheduler::uiManagerDidFinishTransaction( + runtimeScheduler_->scheduleRenderingUpdate( + surfaceId, + [delegate = delegate_, ++ delegateInvalidated = delegateInvalidated_, + mountingCoordinator = std::move(mountingCoordinator)]() { ++ if (delegateInvalidated->load(std::memory_order_acquire)) { ++ return; ++ } ++ + delegate->schedulerShouldRenderTransactions(mountingCoordinator); + }); + } else { +@@ -330,9 +349,14 @@ void Scheduler::uiManagerDidDispatchCommand( + runtimeScheduler_->scheduleRenderingUpdate( + shadowNode->getSurfaceId(), + [delegate = delegate_, ++ delegateInvalidated = delegateInvalidated_, + shadowView = std::move(shadowView), + commandName, + args]() { ++ if (delegateInvalidated->load(std::memory_order_acquire)) { ++ return; ++ } ++ + delegate->schedulerDidDispatchCommand(shadowView, commandName, args); + }); + } +diff --git a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h +index 9b746ae..55fde52 100644 +--- a/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h ++++ b/node_modules/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h +@@ -129,6 +129,11 @@ class Scheduler final : public UIManagerDelegate { + friend class SurfaceHandler; + + SchedulerDelegate *delegate_; ++ // Captured by deferred RuntimeScheduler rendering-update lambdas. The token ++ // is invalidated when the delegate changes or Scheduler is destroyed so ++ // already-queued lambdas cannot dereference a stale raw delegate pointer. ++ std::shared_ptr> delegateInvalidated_; ++ + SharedComponentDescriptorRegistry componentDescriptorRegistry_; + RuntimeExecutor runtimeExecutor_; + std::shared_ptr uiManager_; diff --git a/patches/react-native/react-native+0.86.0+034+nested-text-border-width.patch b/patches/react-native/react-native+0.88.0+030+nested-text-border-width.patch similarity index 93% rename from patches/react-native/react-native+0.86.0+034+nested-text-border-width.patch rename to patches/react-native/react-native+0.88.0+030+nested-text-border-width.patch index 7c5a1d3f36ec..5e90eb1cfe49 100644 --- a/patches/react-native/react-native+0.86.0+034+nested-text-border-width.patch +++ b/patches/react-native/react-native+0.88.0+030+nested-text-border-width.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt -index 8406652..86dd1fc 100644 +index d91688e..a837305 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt -@@ -79,6 +79,54 @@ public class TextAttributeProps private constructor() { +@@ -80,6 +80,54 @@ public class TextAttributeProps private constructor() { public var borderBottomRightRadius: Float = Float.NaN private set @@ -57,22 +57,22 @@ index 8406652..86dd1fc 100644 public var opacity: Float = Float.NaN private set -@@ -391,6 +439,14 @@ public class TextAttributeProps private constructor() { - public const val TA_KEY_BORDER_TOP_RIGHT_RADIUS: Int = 31 - public const val TA_KEY_BORDER_BOTTOM_LEFT_RADIUS: Int = 32 - public const val TA_KEY_BORDER_BOTTOM_RIGHT_RADIUS: Int = 33 -+ public const val TA_KEY_BORDER_TOP_COLOR: Int = 34 -+ public const val TA_KEY_BORDER_RIGHT_COLOR: Int = 35 -+ public const val TA_KEY_BORDER_BOTTOM_COLOR: Int = 36 -+ public const val TA_KEY_BORDER_LEFT_COLOR: Int = 37 -+ public const val TA_KEY_BORDER_TOP_WIDTH: Int = 38 -+ public const val TA_KEY_BORDER_RIGHT_WIDTH: Int = 39 -+ public const val TA_KEY_BORDER_BOTTOM_WIDTH: Int = 40 -+ public const val TA_KEY_BORDER_LEFT_WIDTH: Int = 41 +@@ -418,6 +466,14 @@ public class TextAttributeProps private constructor() { + public const val TA_KEY_BORDER_TOP_RIGHT_RADIUS: Int = 33 + public const val TA_KEY_BORDER_BOTTOM_LEFT_RADIUS: Int = 34 + public const val TA_KEY_BORDER_BOTTOM_RIGHT_RADIUS: Int = 35 ++ public const val TA_KEY_BORDER_TOP_COLOR: Int = 36 ++ public const val TA_KEY_BORDER_RIGHT_COLOR: Int = 37 ++ public const val TA_KEY_BORDER_BOTTOM_COLOR: Int = 38 ++ public const val TA_KEY_BORDER_LEFT_COLOR: Int = 39 ++ public const val TA_KEY_BORDER_TOP_WIDTH: Int = 40 ++ public const val TA_KEY_BORDER_RIGHT_WIDTH: Int = 41 ++ public const val TA_KEY_BORDER_BOTTOM_WIDTH: Int = 42 ++ public const val TA_KEY_BORDER_LEFT_WIDTH: Int = 43 + private const val TE_KEY_NAME: Int = 0 + private const val TE_KEY_PROPS: Int = 1 - public const val UNSET: Int = -1 - -@@ -453,6 +509,18 @@ public class TextAttributeProps private constructor() { +@@ -501,6 +557,18 @@ public class TextAttributeProps private constructor() { result.borderBottomLeftRadius = entry.doubleValue.toFloat() TA_KEY_BORDER_BOTTOM_RIGHT_RADIUS -> result.borderBottomRightRadius = entry.doubleValue.toFloat() @@ -92,10 +92,10 @@ index 8406652..86dd1fc 100644 } diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt -index cf09164..6ea2bb7 100644 +index 26713a3..e606eef 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt -@@ -281,27 +281,44 @@ internal object TextLayoutManager { +@@ -298,27 +298,44 @@ internal object TextLayoutManager { ?.let { SetSpanOperation(start, end, it) } ?.let { ops.add(it) } } @@ -161,7 +161,7 @@ index cf09164..6ea2bb7 100644 } if (!textAttributes.opacity.isNaN()) { ops.add(SetSpanOperation(start, end, ReactOpacitySpan(textAttributes.opacity))) -@@ -467,25 +484,43 @@ internal object TextLayoutManager { +@@ -541,25 +558,43 @@ internal object TextLayoutManager { ) } @@ -225,16 +225,16 @@ index cf09164..6ea2bb7 100644 } diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt -index 326b049..80f8d38 100644 +index 8bbbf40..487b8ac 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt -@@ -14,11 +14,15 @@ import android.text.Layout +@@ -15,11 +15,15 @@ import android.text.style.UpdateAppearance import androidx.annotation.ColorInt /** -- * A [DrawCommandSpan] that draws a rounded-rectangle background behind inline text spans. When +- * A [CanvasEffectSpan] that draws a rounded-rectangle background behind inline text spans. When - * borderRadius is 0, this draws a plain rectangle identical to [ReactBackgroundColorSpan]. -+ * A [DrawCommandSpan] that draws a rounded-rectangle background and optional per-side border ++ * A [CanvasEffectSpan] that draws a rounded-rectangle background and optional per-side border + * behind inline text spans. * * For multiline spans, only the outer corners are rounded: left corners on the first line, right @@ -247,7 +247,7 @@ index 326b049..80f8d38 100644 */ internal class ReactBackgroundDrawSpan( @ColorInt private val backgroundColor: Int, -@@ -26,17 +30,34 @@ internal class ReactBackgroundDrawSpan( +@@ -27,17 +31,34 @@ internal class ReactBackgroundDrawSpan( private val borderTopRightRadius: Float, private val borderBottomLeftRadius: Float, private val borderBottomRightRadius: Float, @@ -259,7 +259,7 @@ index 326b049..80f8d38 100644 + private val borderRightWidth: Float, + private val borderBottomWidth: Float, + private val borderLeftWidth: Float, - ) : DrawCommandSpan() { + ) : CanvasEffectSpan(), ReactSpan, UpdateAppearance { - private val paint = + private val fillPaint = @@ -284,7 +284,7 @@ index 326b049..80f8d38 100644 override fun onPreDraw(start: Int, end: Int, canvas: Canvas, layout: Layout) { if (start >= end) return -@@ -52,7 +73,7 @@ internal class ReactBackgroundDrawSpan( +@@ -53,7 +74,7 @@ internal class ReactBackgroundDrawSpan( // Otherwise use the actual character position of the span start. val left = if (start <= lineStart) { @@ -293,7 +293,7 @@ index 326b049..80f8d38 100644 } else { layout.getPrimaryHorizontal(start) } -@@ -73,45 +94,119 @@ internal class ReactBackgroundDrawSpan( +@@ -74,45 +95,119 @@ internal class ReactBackgroundDrawSpan( val top = baseline + fm.ascent val bottom = baseline + fm.descent @@ -442,7 +442,7 @@ index 326b049..80f8d38 100644 } } diff --git a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp -index f63e2aa..5e0034c 100644 +index cd249ce..79d7c8d 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp @@ -42,6 +42,36 @@ void TextAttributes::apply(TextAttributes textAttributes) { @@ -482,7 +482,7 @@ index f63e2aa..5e0034c 100644 // Font fontFamily = !textAttributes.fontFamily.empty() ? textAttributes.fontFamily -@@ -161,7 +191,17 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { +@@ -168,7 +198,17 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { borderTopLeftRadius, borderTopRightRadius, borderBottomLeftRadius, @@ -501,7 +501,7 @@ index f63e2aa..5e0034c 100644 std::tie( rhs.foregroundColor, rhs.backgroundColor, -@@ -189,7 +229,17 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { +@@ -198,7 +238,17 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { rhs.borderTopLeftRadius, rhs.borderTopRightRadius, rhs.borderBottomLeftRadius, @@ -520,7 +520,7 @@ index f63e2aa..5e0034c 100644 floatEquality(maxFontSizeMultiplier, rhs.maxFontSizeMultiplier) && floatEquality(opacity, rhs.opacity) && floatEquality(fontSize, rhs.fontSize) && -@@ -242,6 +292,38 @@ SharedDebugStringConvertibleList TextAttributes::getDebugProps() const { +@@ -251,6 +301,38 @@ SharedDebugStringConvertibleList TextAttributes::getDebugProps() const { "borderBottomRightRadius", borderBottomRightRadius, textAttributes.borderBottomRightRadius), @@ -560,10 +560,10 @@ index f63e2aa..5e0034c 100644 // Font debugStringConvertibleItem( diff --git a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h -index 2eaa3bc..af278a3 100644 +index 66447fe..817eee4 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h +++ b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h -@@ -47,6 +47,16 @@ class TextAttributes : public DebugStringConvertible { +@@ -55,6 +55,16 @@ class TextAttributes : public DebugStringConvertible { std::optional borderTopRightRadius{}; std::optional borderBottomLeftRadius{}; std::optional borderBottomRightRadius{}; @@ -580,45 +580,47 @@ index 2eaa3bc..af278a3 100644 // Font std::string fontFamily{""}; -@@ -148,7 +158,17 @@ struct hash { +@@ -182,7 +192,19 @@ struct hash { textAttributes.borderTopLeftRadius, textAttributes.borderTopRightRadius, textAttributes.borderBottomLeftRadius, - textAttributes.borderBottomRightRadius); + textAttributes.borderBottomRightRadius, -+ textAttributes.borderColor, -+ textAttributes.borderTopColor, -+ textAttributes.borderRightColor, -+ textAttributes.borderBottomColor, -+ textAttributes.borderLeftColor, + textAttributes.borderWidth, + textAttributes.borderTopWidth, + textAttributes.borderRightWidth, + textAttributes.borderBottomWidth, + textAttributes.borderLeftWidth); ++ facebook::react::hash_combine( ++ seed, ++ textAttributes.borderColor, ++ textAttributes.borderTopColor, ++ textAttributes.borderRightColor, ++ textAttributes.borderBottomColor, ++ textAttributes.borderLeftColor); + return seed; } }; - } // namespace std diff --git a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h -index 8277d40..2bb4073 100644 +index 78b1d9e..b34f6a9 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h +++ b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h -@@ -1132,6 +1132,14 @@ constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_LEFT_RADIUS = 30; - constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_RIGHT_RADIUS = 31; - constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_LEFT_RADIUS = 32; - constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_RIGHT_RADIUS = 33; -+constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_COLOR = 34; -+constexpr static MapBuffer::Key TA_KEY_BORDER_RIGHT_COLOR = 35; -+constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_COLOR = 36; -+constexpr static MapBuffer::Key TA_KEY_BORDER_LEFT_COLOR = 37; -+constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_WIDTH = 38; -+constexpr static MapBuffer::Key TA_KEY_BORDER_RIGHT_WIDTH = 39; -+constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_WIDTH = 40; -+constexpr static MapBuffer::Key TA_KEY_BORDER_LEFT_WIDTH = 41; +@@ -1147,6 +1147,14 @@ constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_LEFT_RADIUS = 32; + constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_RIGHT_RADIUS = 33; + constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_LEFT_RADIUS = 34; + constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_RIGHT_RADIUS = 35; ++constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_COLOR = 36; ++constexpr static MapBuffer::Key TA_KEY_BORDER_RIGHT_COLOR = 37; ++constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_COLOR = 38; ++constexpr static MapBuffer::Key TA_KEY_BORDER_LEFT_COLOR = 39; ++constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_WIDTH = 40; ++constexpr static MapBuffer::Key TA_KEY_BORDER_RIGHT_WIDTH = 41; ++constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_WIDTH = 42; ++constexpr static MapBuffer::Key TA_KEY_BORDER_LEFT_WIDTH = 43; - // constants for ParagraphAttributes serialization - constexpr static MapBuffer::Key PA_KEY_MAX_NUMBER_OF_LINES = 0; -@@ -1358,6 +1366,49 @@ inline MapBuffer toMapBuffer(const TextAttributes &textAttributes) + // Keys within each text effect entry MapBuffer + constexpr static MapBuffer::Key TE_KEY_NAME = 0; +@@ -1390,6 +1398,49 @@ inline MapBuffer toMapBuffer(const TextAttributes &textAttributes) textAttributes.borderBottomRightRadius.value_or(fallback)); } } @@ -669,10 +671,10 @@ index 8277d40..2bb4073 100644 } diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp -index 803cbfe..73d21c9 100644 +index 79fb59d..1b846a9 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp -@@ -252,6 +252,66 @@ static TextAttributes convertRawProp( +@@ -257,6 +257,66 @@ static TextAttributes convertRawProp( "borderBottomRightRadius", sourceTextAttributes.borderBottomRightRadius, defaultTextAttributes.borderBottomRightRadius); @@ -739,7 +741,7 @@ index 803cbfe..73d21c9 100644 return textAttributes; } -@@ -374,6 +434,26 @@ void BaseTextProps::setProp( +@@ -384,6 +444,26 @@ void BaseTextProps::setProp( defaults, value, textAttributes, borderBottomLeftRadius, "borderBottomLeftRadius"); REBUILD_FIELD_SWITCH_CASE( defaults, value, textAttributes, borderBottomRightRadius, "borderBottomRightRadius"); @@ -766,7 +768,7 @@ index 803cbfe..73d21c9 100644 } } -@@ -611,6 +691,72 @@ void BaseTextProps::appendTextAttributesProps( +@@ -629,6 +709,72 @@ void BaseTextProps::appendTextAttributesProps( ? textAttributes.borderBottomRightRadius.value() : folly::dynamic(nullptr); } @@ -840,10 +842,10 @@ index 803cbfe..73d21c9 100644 #endif diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm -index 585e06e..466efb2 100644 +index 09badce..a44c245 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm +++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm -@@ -189,19 +189,52 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex +@@ -211,19 +211,52 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex textAttributes.borderTopRightRadius.has_value() || textAttributes.borderBottomLeftRadius.has_value() || textAttributes.borderBottomRightRadius.has_value(); diff --git a/patches/react-native/react-native+0.86.0+035+nested-text-padding.patch b/patches/react-native/react-native+0.88.0+031+nested-text-padding.patch similarity index 92% rename from patches/react-native/react-native+0.86.0+035+nested-text-padding.patch rename to patches/react-native/react-native+0.88.0+031+nested-text-padding.patch index f51a4c94c93f..9cb95d79923c 100644 --- a/patches/react-native/react-native+0.86.0+035+nested-text-padding.patch +++ b/patches/react-native/react-native+0.88.0+031+nested-text-padding.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt -index 86dd1fc..2be0a2f 100644 +index a837305..8d23b86 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt -@@ -127,6 +127,14 @@ public class TextAttributeProps private constructor() { +@@ -128,6 +128,14 @@ public class TextAttributeProps private constructor() { public var borderLeftWidth: Float = Float.NaN private set @@ -17,16 +17,16 @@ index 86dd1fc..2be0a2f 100644 public var opacity: Float = Float.NaN private set -@@ -447,6 +455,8 @@ public class TextAttributeProps private constructor() { - public const val TA_KEY_BORDER_RIGHT_WIDTH: Int = 39 - public const val TA_KEY_BORDER_BOTTOM_WIDTH: Int = 40 - public const val TA_KEY_BORDER_LEFT_WIDTH: Int = 41 -+ public const val TA_KEY_PADDING_LEFT: Int = 42 -+ public const val TA_KEY_PADDING_RIGHT: Int = 43 +@@ -474,6 +482,8 @@ public class TextAttributeProps private constructor() { + public const val TA_KEY_BORDER_RIGHT_WIDTH: Int = 41 + public const val TA_KEY_BORDER_BOTTOM_WIDTH: Int = 42 + public const val TA_KEY_BORDER_LEFT_WIDTH: Int = 43 ++ public const val TA_KEY_PADDING_LEFT: Int = 44 ++ public const val TA_KEY_PADDING_RIGHT: Int = 45 + private const val TE_KEY_NAME: Int = 0 + private const val TE_KEY_PROPS: Int = 1 - public const val UNSET: Int = -1 - -@@ -521,6 +531,8 @@ public class TextAttributeProps private constructor() { +@@ -569,6 +579,8 @@ public class TextAttributeProps private constructor() { result.borderBottomWidth = entry.doubleValue.toFloat() TA_KEY_BORDER_LEFT_WIDTH -> result.borderLeftWidth = entry.doubleValue.toFloat() @@ -36,7 +36,7 @@ index 86dd1fc..2be0a2f 100644 } diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt -index 6ea2bb7..b85d294 100644 +index e606eef..6babff8 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt @@ -8,7 +8,9 @@ @@ -59,7 +59,7 @@ index 6ea2bb7..b85d294 100644 import android.util.LayoutDirection import android.view.Gravity import android.view.View -@@ -47,6 +52,7 @@ import com.facebook.react.views.text.internal.span.ReactForegroundColorSpan +@@ -52,6 +57,7 @@ import com.facebook.react.views.text.internal.span.ReactForegroundColorSpan import com.facebook.react.views.text.internal.span.ReactFragmentIndexSpan import com.facebook.react.views.text.internal.span.ReactLinkSpan import com.facebook.react.views.text.internal.span.ReactOpacitySpan @@ -67,9 +67,9 @@ index 6ea2bb7..b85d294 100644 import com.facebook.react.views.text.internal.span.ReactStrikethroughSpan import com.facebook.react.views.text.internal.span.ReactTagSpan import com.facebook.react.views.text.internal.span.ReactTextPaintHolderSpan -@@ -62,6 +68,65 @@ import kotlin.math.floor - import kotlin.math.max - import kotlin.math.min +@@ -69,6 +75,65 @@ import kotlin.math.min + import org.json.JSONArray + import org.json.JSONObject +// A LeadingMarginSpan that is also a ReactSpan, so it can be added via SetSpanOperation (whose `what` +// is typed ReactSpan). Used to reserve leading room for a bordered / inline-code span at a line start. @@ -133,8 +133,8 @@ index 6ea2bb7..b85d294 100644 /** Class responsible of creating [Spanned] object for the JS representation of Text */ internal object TextLayoutManager { -@@ -239,11 +304,57 @@ internal object TextLayoutManager { - ) { +@@ -254,11 +319,57 @@ internal object TextLayoutManager { + for (i in 0 until fragments.count) { val fragment = fragments.getMapBuffer(i) - val start = sb.length @@ -190,9 +190,9 @@ index 6ea2bb7..b85d294 100644 + val start = sb.length + sb.append( - TextTransform.apply(fragment.getString(FR_KEY_STRING), textAttributes.textTransform) + TextTransform.apply(fragment.getString(FR_KEY_STRING), textAttributes.textTransform), ) -@@ -312,6 +423,8 @@ internal object TextLayoutManager { +@@ -329,6 +440,8 @@ internal object TextLayoutManager { PixelUtil.toPixelFromDIP(textAttributes.borderRightWidth.takeIf { r -> !r.isNaN() } ?: 0f), PixelUtil.toPixelFromDIP(textAttributes.borderBottomWidth.takeIf { r -> !r.isNaN() } ?: 0f), PixelUtil.toPixelFromDIP(textAttributes.borderLeftWidth.takeIf { r -> !r.isNaN() } ?: 0f), @@ -201,11 +201,10 @@ index 6ea2bb7..b85d294 100644 ) } else if (textAttributes.isBackgroundColorSet) { textAttributes.backgroundColor?.let { ReactBackgroundColorSpan(it) } -@@ -386,6 +499,19 @@ internal object TextLayoutManager { - ops.add(SetSpanOperation(start, end, ReactTagSpan(reactTag))) +@@ -425,6 +538,19 @@ internal object TextLayoutManager { } } -+ + + if (drawsCustomBackground && trailingReserveDip > 0f) { + val spacerStart = sb.length + sb.append("\u2060") @@ -218,10 +217,11 @@ index 6ea2bb7..b85d294 100644 + ) + ) + } - } - } - -@@ -515,6 +641,8 @@ internal object TextLayoutManager { ++ + // Coalesce consecutive fragments with the same text effects into single spans. + val effects = textAttributes.textEffects + if (effects != pendingEffects) { +@@ -589,6 +715,8 @@ internal object TextLayoutManager { PixelUtil.toPixelFromDIP(fragment.props.borderRightWidth.takeIf { r -> !r.isNaN() } ?: 0f), PixelUtil.toPixelFromDIP(fragment.props.borderBottomWidth.takeIf { r -> !r.isNaN() } ?: 0f), PixelUtil.toPixelFromDIP(fragment.props.borderLeftWidth.takeIf { r -> !r.isNaN() } ?: 0f), @@ -230,7 +230,7 @@ index 6ea2bb7..b85d294 100644 ) } else if (fragment.props.isBackgroundColorSet) { fragment.props.backgroundColor?.let { ReactBackgroundColorSpan(it) } -@@ -522,6 +650,20 @@ internal object TextLayoutManager { +@@ -596,6 +724,20 @@ internal object TextLayoutManager { null } spannable.setSpan(bgSpan, start, end, spanFlags) @@ -252,20 +252,20 @@ index 6ea2bb7..b85d294 100644 if (!fragment.props.opacity.isNaN()) { diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt -index 80f8d38..2a55063 100644 +index 487b8ac..90f9f75 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactBackgroundDrawSpan.kt -@@ -38,6 +38,9 @@ internal class ReactBackgroundDrawSpan( +@@ -39,6 +39,9 @@ internal class ReactBackgroundDrawSpan( private val borderRightWidth: Float, private val borderBottomWidth: Float, private val borderLeftWidth: Float, + // Inner padding between the border and the text, per side (px). + private val paddingLeft: Float = 0f, + private val paddingRight: Float = 0f, - ) : DrawCommandSpan() { + ) : CanvasEffectSpan(), ReactSpan, UpdateAppearance { private val fillPaint = -@@ -63,7 +66,7 @@ internal class ReactBackgroundDrawSpan( +@@ -64,7 +67,7 @@ internal class ReactBackgroundDrawSpan( if (start >= end) return val startLine = layout.getLineForOffset(start) @@ -274,7 +274,7 @@ index 80f8d38..2a55063 100644 for (line in startLine..endLine) { val lineStart = layout.getLineStart(line) -@@ -99,6 +102,16 @@ internal class ReactBackgroundDrawSpan( +@@ -100,6 +103,16 @@ internal class ReactBackgroundDrawSpan( val isFirstLine = line == startLine val isLastLine = line == endLine @@ -292,7 +292,7 @@ index 80f8d38..2a55063 100644 drawBorder(canvas, rectF, isFirstLine, isLastLine) } diff --git a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp -index 5e0034c..f7f210f 100644 +index 79d7c8d..0d8ca48 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp @@ -72,6 +72,12 @@ void TextAttributes::apply(TextAttributes textAttributes) { @@ -308,7 +308,7 @@ index 5e0034c..f7f210f 100644 // Font fontFamily = !textAttributes.fontFamily.empty() ? textAttributes.fontFamily -@@ -201,7 +207,9 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { +@@ -208,7 +214,9 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { borderTopWidth, borderRightWidth, borderBottomWidth, @@ -319,7 +319,7 @@ index 5e0034c..f7f210f 100644 std::tie( rhs.foregroundColor, rhs.backgroundColor, -@@ -239,7 +247,9 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { +@@ -248,7 +256,9 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { rhs.borderTopWidth, rhs.borderRightWidth, rhs.borderBottomWidth, @@ -330,7 +330,7 @@ index 5e0034c..f7f210f 100644 floatEquality(maxFontSizeMultiplier, rhs.maxFontSizeMultiplier) && floatEquality(opacity, rhs.opacity) && floatEquality(fontSize, rhs.fontSize) && -@@ -324,6 +334,10 @@ SharedDebugStringConvertibleList TextAttributes::getDebugProps() const { +@@ -333,6 +343,10 @@ SharedDebugStringConvertibleList TextAttributes::getDebugProps() const { "borderLeftWidth", borderLeftWidth, textAttributes.borderLeftWidth), @@ -342,10 +342,10 @@ index 5e0034c..f7f210f 100644 // Font debugStringConvertibleItem( diff --git a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h -index af278a3..5a42b20 100644 +index 817eee4..475c67b 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h +++ b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h -@@ -57,6 +57,10 @@ class TextAttributes : public DebugStringConvertible { +@@ -65,6 +65,10 @@ class TextAttributes : public DebugStringConvertible { std::optional borderRightWidth{}; std::optional borderBottomWidth{}; std::optional borderLeftWidth{}; @@ -356,7 +356,7 @@ index af278a3..5a42b20 100644 // Font std::string fontFamily{""}; -@@ -168,7 +172,9 @@ struct hash { +@@ -197,7 +201,9 @@ struct hash { textAttributes.borderTopWidth, textAttributes.borderRightWidth, textAttributes.borderBottomWidth, @@ -364,23 +364,23 @@ index af278a3..5a42b20 100644 + textAttributes.borderLeftWidth, + textAttributes.paddingLeft, + textAttributes.paddingRight); - } - }; - } // namespace std + facebook::react::hash_combine( + seed, + textAttributes.borderColor, diff --git a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h -index 2bb4073..6dd2aa7 100644 +index b34f6a9..54862a2 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h +++ b/node_modules/react-native/ReactCommon/react/renderer/attributedstring/conversions.h -@@ -1140,6 +1140,8 @@ constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_WIDTH = 38; - constexpr static MapBuffer::Key TA_KEY_BORDER_RIGHT_WIDTH = 39; - constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_WIDTH = 40; - constexpr static MapBuffer::Key TA_KEY_BORDER_LEFT_WIDTH = 41; -+constexpr static MapBuffer::Key TA_KEY_PADDING_LEFT = 42; -+constexpr static MapBuffer::Key TA_KEY_PADDING_RIGHT = 43; - - // constants for ParagraphAttributes serialization - constexpr static MapBuffer::Key PA_KEY_MAX_NUMBER_OF_LINES = 0; -@@ -1409,6 +1411,16 @@ inline MapBuffer toMapBuffer(const TextAttributes &textAttributes) +@@ -1155,6 +1155,8 @@ constexpr static MapBuffer::Key TA_KEY_BORDER_TOP_WIDTH = 40; + constexpr static MapBuffer::Key TA_KEY_BORDER_RIGHT_WIDTH = 41; + constexpr static MapBuffer::Key TA_KEY_BORDER_BOTTOM_WIDTH = 42; + constexpr static MapBuffer::Key TA_KEY_BORDER_LEFT_WIDTH = 43; ++constexpr static MapBuffer::Key TA_KEY_PADDING_LEFT = 44; ++constexpr static MapBuffer::Key TA_KEY_PADDING_RIGHT = 45; + + // Keys within each text effect entry MapBuffer + constexpr static MapBuffer::Key TE_KEY_NAME = 0; +@@ -1441,6 +1443,16 @@ inline MapBuffer toMapBuffer(const TextAttributes &textAttributes) textAttributes.borderLeftWidth.value_or(fallback)); } } @@ -398,10 +398,10 @@ index 2bb4073..6dd2aa7 100644 } diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp -index 73d21c9..aa3c836 100644 +index 1b846a9..b8eac43 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp -@@ -312,6 +312,32 @@ static TextAttributes convertRawProp( +@@ -317,6 +317,32 @@ static TextAttributes convertRawProp( "borderLeftWidth", sourceTextAttributes.borderLeftWidth, defaultTextAttributes.borderLeftWidth); @@ -434,7 +434,7 @@ index 73d21c9..aa3c836 100644 return textAttributes; } -@@ -454,6 +480,10 @@ void BaseTextProps::setProp( +@@ -464,6 +490,10 @@ void BaseTextProps::setProp( defaults, value, textAttributes, borderBottomWidth, "borderBottomWidth"); REBUILD_FIELD_SWITCH_CASE( defaults, value, textAttributes, borderLeftWidth, "borderLeftWidth"); @@ -445,7 +445,7 @@ index 73d21c9..aa3c836 100644 } } -@@ -757,6 +787,18 @@ void BaseTextProps::appendTextAttributesProps( +@@ -775,6 +805,18 @@ void BaseTextProps::appendTextAttributesProps( ? textAttributes.borderLeftWidth.value() : folly::dynamic(nullptr); } @@ -502,10 +502,10 @@ index 301bde7..a5677ac 100644 fragment.string = getConcreteProps().text; fragment.textAttributes = textAttributes; diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm -index 466efb2..892dcb7 100644 +index a44c245..dd70e73 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm +++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm -@@ -220,7 +220,7 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex +@@ -242,7 +242,7 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex // attrs: @[bgColor, tlR, trR, blR, brR, // topBorderColor, rightBorderColor, bottomBorderColor, leftBorderColor, @@ -514,7 +514,7 @@ index 466efb2..892dcb7 100644 attributes[RCTTextBorderRadiusAttributeName] = @[ bgColor, @(textAttributes.borderTopLeftRadius.value_or(radiusFallback)), -@@ -235,6 +235,8 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex +@@ -257,6 +257,8 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex @(textAttributes.borderRightWidth.value_or(widthFallback)), @(textAttributes.borderBottomWidth.value_or(widthFallback)), @(textAttributes.borderLeftWidth.value_or(widthFallback)), @@ -523,7 +523,7 @@ index 466efb2..892dcb7 100644 ]; } else { attributes[NSBackgroundColorAttributeName] = bgColor; -@@ -478,6 +480,71 @@ void RCTApplyBaselineOffset(NSMutableAttributedString *attributedText) +@@ -525,6 +527,71 @@ void RCTApplyBaselineOffset(NSMutableAttributedString *attributedText) [nsAttributedString appendAttributedString:nsAttributedStringFragment]; } @@ -596,10 +596,10 @@ index 466efb2..892dcb7 100644 return nsAttributedString; diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm -index b480614..bc903ed 100644 +index 4adbab0..a07a669 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm -@@ -376,6 +376,48 @@ - (TextMeasurement)_measureTextStorage:(NSTextStorage *)textStorage +@@ -571,6 +571,48 @@ - (TextMeasurement)_measureTextStorage:(NSTextStorage *)textStorage if (textDidWrap) { size.width = textContainer.size.width; diff --git a/patches/react-native/react-native+0.86.0+040+fix-android15-text-clipping.patch b/patches/react-native/react-native+0.88.0+032+fix-android15-text-clipping.patch similarity index 90% rename from patches/react-native/react-native+0.86.0+040+fix-android15-text-clipping.patch rename to patches/react-native/react-native+0.88.0+032+fix-android15-text-clipping.patch index 818a35276996..4f148950e34c 100644 --- a/patches/react-native/react-native+0.86.0+040+fix-android15-text-clipping.patch +++ b/patches/react-native/react-native+0.88.0+032+fix-android15-text-clipping.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt -index b85d294..bf9db18 100644 +index 6babff8..eccf86b 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt -@@ -41,6 +41,7 @@ +@@ -46,6 +46,7 @@ import com.facebook.react.uimanager.PixelUtil import com.facebook.react.uimanager.PixelUtil.dpToPx import com.facebook.react.uimanager.PixelUtil.pxToDp import com.facebook.react.uimanager.ReactAccessibilityDelegate @@ -10,13 +10,12 @@ index b85d294..bf9db18 100644 import com.facebook.react.views.text.internal.span.CustomLetterSpacingSpan import com.facebook.react.views.text.internal.span.CustomLineHeightSpan import com.facebook.react.views.text.internal.span.CustomStyleSpan -@@ -842,14 +843,33 @@ - includeFontPadding, +@@ -1025,13 +1026,32 @@ internal object TextLayoutManager { ) } -- -- val desiredWidth = ceil(Layout.getDesiredWidth(text, paint)).toInt() +- val desiredWidth = ceil(Layout.getDesiredWidth(text, paint)).toInt() +- val layoutWidth = when (widthYogaMeasureMode) { YogaMeasureMode.EXACTLY -> ceil(width).toInt() @@ -48,12 +47,10 @@ index b85d294..bf9db18 100644 } return buildLayout( text, -@@ -863,6 +883,47 @@ - maxNumberOfLines, - paint, +@@ -1047,6 +1067,47 @@ internal object TextLayoutManager { ) -+ } -+ + } + + private fun getDesiredWidth( + text: Spannable, + includeFontPadding: Boolean, @@ -93,10 +90,12 @@ index b85d294..bf9db18 100644 + } + + return max(advanceWidth, ceil(visualBoundsWidth).toInt()) - } - ++ } ++ private fun buildLayout( -@@ -876,6 +937,7 @@ + text: Spannable, + layoutWidth: Int, +@@ -1058,6 +1119,7 @@ internal object TextLayoutManager { ellipsizeMode: TextUtils.TruncateAt?, maxNumberOfLines: Int, paint: TextPaint, @@ -104,14 +103,14 @@ index b85d294..bf9db18 100644 ): Layout { val builder = StaticLayout.Builder.obtain(text, 0, text.length, paint, layoutWidth) -@@ -895,6 +957,10 @@ - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { +@@ -1079,6 +1141,10 @@ internal object TextLayoutManager { builder.setUseLineSpacingFromFallbacks(true) -+ } -+ -+ if (useBoundsForWidth) { -+ setUseBoundsForWidthMethod?.invoke(builder, true) } ++ if (useBoundsForWidth) { ++ setUseBoundsForWidthMethod?.invoke(builder, true) ++ } ++ return builder.build() + } + diff --git a/patches/react-native/react-native+0.86.0+043+clamp-blob-range-APP-KDN.patch b/patches/react-native/react-native+0.88.0+033+clamp-blob-range-APP-KDN.patch similarity index 91% rename from patches/react-native/react-native+0.86.0+043+clamp-blob-range-APP-KDN.patch rename to patches/react-native/react-native+0.88.0+033+clamp-blob-range-APP-KDN.patch index a4ff9a5abb29..fecdda840e68 100644 --- a/patches/react-native/react-native+0.86.0+043+clamp-blob-range-APP-KDN.patch +++ b/patches/react-native/react-native+0.88.0+033+clamp-blob-range-APP-KDN.patch @@ -1,14 +1,16 @@ diff --git a/node_modules/react-native/Libraries/Blob/RCTBlobManager.mm b/node_modules/react-native/Libraries/Blob/RCTBlobManager.mm +index 4a29b1f..037d5b1 100755 --- a/node_modules/react-native/Libraries/Blob/RCTBlobManager.mm +++ b/node_modules/react-native/Libraries/Blob/RCTBlobManager.mm -@@ -12,5 +12,6 @@ +@@ -11,6 +11,7 @@ + #import #import +#import #import #import #import -@@ -111,8 +112,33 @@ +@@ -111,8 +112,33 @@ - (NSData *)resolve:(NSString *)blobId offset:(NSInteger)offset size:(NSInteger) if (!data) { return nil; } @@ -44,7 +46,8 @@ diff --git a/node_modules/react-native/Libraries/Blob/RCTBlobManager.mm b/node_m } return data; } -@@ -198,8 +224,21 @@ +@@ -194,9 +220,22 @@ - (void)createFromParts:(NSArray *> *)parts withId: + if ([type isEqualToString:@"blob"]) { NSData *partData = [self resolve:part[@"data"]]; + if (!partData) { diff --git a/patches/react-native/react-native+0.86.0+045+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch b/patches/react-native/react-native+0.88.0+034+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch similarity index 68% rename from patches/react-native/react-native+0.86.0+045+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch rename to patches/react-native/react-native+0.88.0+034+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch index 4288663072f5..fbd164cfe3bb 100644 --- a/patches/react-native/react-native+0.86.0+045+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch +++ b/patches/react-native/react-native+0.88.0+034+soft-fail-addViewAt-non-ViewGroup-parent-APP-K0G.patch @@ -1,23 +1,24 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt +index b854262..d46de43 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt -@@ -323,12 +323,15 @@ internal constructor( - ) - return +@@ -310,12 +310,14 @@ internal constructor( } - if (parentViewState.view !is ViewGroup) { + + val parentView = parentViewState.view +- checkNotNull(parentView) { "Unable to find parentView for tag $parentTag" } + if (parentView !is ViewGroup) { - val message = -- "Unable to add a view into a view that is not a ViewGroup. ParentTag: $parentTag - Tag: $tag - Index: $index" +- "Unable to add a view into a non-ViewGroup ${parentView.javaClass.simpleName} when inserting [$tag] into parent [$parentTag]" - FLog.e(TAG, message) - throw IllegalStateException(message) + ReactSoftExceptionLogger.logSoftException( + TAG, + ReactNoCrashSoftException( -+ "Unable to add a view into a view that is not a ViewGroup. ParentTag: $parentTag - Tag: $tag - Index: $index - ParentView: ${parentViewState.view?.javaClass?.simpleName}" ++ "Unable to add a view into a view that is not a ViewGroup. ParentTag: $parentTag - Tag: $tag - Index: $index - ParentView: ${parentView?.javaClass?.simpleName}" + ), + ) + return } - val parentView = parentViewState.view as ViewGroup + val viewState = getNullableViewState(tag) - if (viewState == null) { diff --git a/patches/react-native/react-native+0.86.0+046+fix-differ-nested-flatten-moved-view.patch b/patches/react-native/react-native+0.88.0+035+fix-differ-nested-flatten-moved-view.patch similarity index 89% rename from patches/react-native/react-native+0.86.0+046+fix-differ-nested-flatten-moved-view.patch rename to patches/react-native/react-native+0.88.0+035+fix-differ-nested-flatten-moved-view.patch index 6ee3a7316e78..4b25944caf7a 100644 --- a/patches/react-native/react-native+0.86.0+046+fix-differ-nested-flatten-moved-view.patch +++ b/patches/react-native/react-native+0.88.0+035+fix-differ-nested-flatten-moved-view.patch @@ -1,7 +1,8 @@ diff --git a/node_modules/react-native/ReactCommon/react/renderer/mounting/Differentiator.cpp b/node_modules/react-native/ReactCommon/react/renderer/mounting/Differentiator.cpp +index 3e13070..992e1f8 100644 --- a/node_modules/react-native/ReactCommon/react/renderer/mounting/Differentiator.cpp +++ b/node_modules/react-native/ReactCommon/react/renderer/mounting/Differentiator.cpp -@@ -709,9 +709,9 @@ static void calculateShadowViewMutationsFlattener( +@@ -712,9 +712,9 @@ static void calculateShadowViewMutationsFlattener( auto unvisitedOtherNodesIt = unvisitedOtherNodes.find(newChild.shadowView.tag); if (unvisitedOtherNodesIt != unvisitedOtherNodes.end()) { @@ -13,7 +14,7 @@ diff --git a/node_modules/react-native/ReactCommon/react/renderer/mounting/Diffe } else { unvisitedRecursiveChildPairs.insert( {newChild.shadowView.tag, &newChild}); -@@ -821,6 +821,9 @@ static void calculateShadowViewMutationsFlattener( +@@ -824,6 +824,9 @@ static void calculateShadowViewMutationsFlattener( // Final step: go through creation/deletion candidates and delete/create // subtrees if they were never visited during the execution of the above // loop and recursions. @@ -22,8 +23,8 @@ diff --git a/node_modules/react-native/ReactCommon/react/renderer/mounting/Diffe + : *subVisitedNewMap; for (auto& deletionCreationCandidatePair : deletionCreationCandidatePairs) { auto& treeChildPair = *deletionCreationCandidatePair.second; - -@@ -829,7 +832,11 @@ static void calculateShadowViewMutationsFlattener( + +@@ -832,7 +835,11 @@ static void calculateShadowViewMutationsFlattener( // already created/deleted and we don't need to do that here. // It is always the responsibility of the matcher to update subtrees when // nodes are matched. @@ -35,4 +36,4 @@ diff --git a/node_modules/react-native/ReactCommon/react/renderer/mounting/Diffe + subVisitedMap.end()) { continue; } - + diff --git a/patches/react-native/react-native+0.88.0+036+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch b/patches/react-native/react-native+0.88.0+036+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch new file mode 100644 index 000000000000..141eba3b5cfd --- /dev/null +++ b/patches/react-native/react-native+0.88.0+036+soft-fail-removeViewAt-non-ViewGroup-parent-APP-H7A.patch @@ -0,0 +1,18 @@ +diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt +index d46de43..b8fd078 100644 +--- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt ++++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt +@@ -428,12 +428,11 @@ internal constructor( + } + + val parentView = parentViewState.view +- checkNotNull(parentView) { "Unable to find parentView for tag $parentTag" } + if (parentView !is ViewGroup) { + ReactSoftExceptionLogger.logSoftException( + TAG, + ReactNoCrashSoftException( +- "Unable to remove a view from a non-ViewGroup ${parentView.javaClass.simpleName} when removing [$tag] from parent [$parentTag]", ++ "Unable to remove a view from a non-ViewGroup ${parentView?.javaClass?.simpleName} when removing [$tag] from parent [$parentTag]", + ), + ) + return diff --git a/patches/react-native/react-native+0.86.0+048+fix-hermes-tarball-root-after-repo-move.patch b/patches/react-native/react-native+0.88.0+037+fix-hermes-tarball-root-after-repo-move.patch similarity index 89% rename from patches/react-native/react-native+0.86.0+048+fix-hermes-tarball-root-after-repo-move.patch rename to patches/react-native/react-native+0.88.0+037+fix-hermes-tarball-root-after-repo-move.patch index 2f7bdf62b298..c66ba7508e41 100644 --- a/patches/react-native/react-native+0.86.0+048+fix-hermes-tarball-root-after-repo-move.patch +++ b/patches/react-native/react-native+0.88.0+037+fix-hermes-tarball-root-after-repo-move.patch @@ -1,17 +1,17 @@ diff --git a/node_modules/react-native/ReactAndroid/hermes-engine/build.gradle.kts b/node_modules/react-native/ReactAndroid/hermes-engine/build.gradle.kts -index df72cad..44cff1b 100644 +index c20e183..76482f1 100644 --- a/node_modules/react-native/ReactAndroid/hermes-engine/build.gradle.kts +++ b/node_modules/react-native/ReactAndroid/hermes-engine/build.gradle.kts -@@ -107,7 +107,7 @@ val downloadHermes by +@@ -103,7 +103,7 @@ val downloadHermes by tasks.registering(Download::class) { src( providers.provider { - "https://github.com/facebook/hermes/tarball/${hermesVersionProvider.get()}" + "https://github.com/meta/hermes/tarball/${hermesVersionProvider.get()}" - } + }, ) onlyIfModified(true) -@@ -122,13 +122,8 @@ val unzipHermes by +@@ -118,13 +118,8 @@ val unzipHermes by tasks.registering(Copy::class) { dependsOn(downloadHermes) from(tarTree(downloadHermesDest)) { diff --git a/patches/react-test-renderer/details.md b/patches/react-test-renderer/details.md deleted file mode 100644 index 6a84a71c53ac..000000000000 --- a/patches/react-test-renderer/details.md +++ /dev/null @@ -1,8 +0,0 @@ -# `react-test-renderer` patches - -### [react-test-renderer+19.2.3+001+run-insertion-effect-cleanup-in-hidden-subtree.patch](react-test-renderer+19.2.3+001+run-insertion-effect-cleanup-in-hidden-subtree.patch) - -- Reason: Same change as `react-native+0.86.0+044+run-insertion-effect-cleanup-in-hidden-subtree.patch`. `@testing-library/react-native` renders through `react-test-renderer`, whose 19.2.3 build is compiled with `enableHiddenSubtreeInsertionEffectCleanup` set to `false` like Fabric, so without this patch jest would keep skipping the `useInsertionEffect` cleanup of a component removed inside a hidden `` while the patched runtime runs it. The patch drops the `offscreenSubtreeWasHidden` guard in front of the insertion cleanup in `commitDeletionEffectsOnFiber` of the development and production builds. -- Upstream PR/issue: fix behind the flag in https://github.com/facebook/react/pull/30954, flag removed in https://github.com/facebook/react/pull/35918. React 19.3 runs the cleanup unconditionally; drop this patch together with the react-native one. -- E/App issue: https://github.com/Expensify/App/issues/98254 -- PR introducing patch: https://github.com/Expensify/App/pull/101577 diff --git a/patches/react-test-renderer/react-test-renderer+19.2.3+001+run-insertion-effect-cleanup-in-hidden-subtree.patch b/patches/react-test-renderer/react-test-renderer+19.2.3+001+run-insertion-effect-cleanup-in-hidden-subtree.patch deleted file mode 100644 index 95465e453f67..000000000000 --- a/patches/react-test-renderer/react-test-renderer+19.2.3+001+run-insertion-effect-cleanup-in-hidden-subtree.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff --git a/node_modules/react-test-renderer/cjs/react-test-renderer.development.js b/node_modules/react-test-renderer/cjs/react-test-renderer.development.js -index 4ce1c7e..f02351e 100644 ---- a/node_modules/react-test-renderer/cjs/react-test-renderer.development.js -+++ b/node_modules/react-test-renderer/cjs/react-test-renderer.development.js -@@ -10364,12 +10364,11 @@ - case 11: - case 14: - case 15: -- offscreenSubtreeWasHidden || -- commitHookEffectListUnmount( -- Insertion, -- deletedFiber, -- nearestMountedAncestor -- ); -+ commitHookEffectListUnmount( -+ Insertion, -+ deletedFiber, -+ nearestMountedAncestor -+ ); - offscreenSubtreeWasHidden || - commitHookLayoutUnmountEffects( - deletedFiber, -diff --git a/node_modules/react-test-renderer/cjs/react-test-renderer.production.js b/node_modules/react-test-renderer/cjs/react-test-renderer.production.js -index 7a89ebc..383739d 100644 ---- a/node_modules/react-test-renderer/cjs/react-test-renderer.production.js -+++ b/node_modules/react-test-renderer/cjs/react-test-renderer.production.js -@@ -6623,8 +6623,7 @@ function commitDeletionEffectsOnFiber( - case 11: - case 14: - case 15: -- offscreenSubtreeWasHidden || -- commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); -+ commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); - offscreenSubtreeWasHidden || - commitHookEffectListUnmount(4, deletedFiber, nearestMountedAncestor); - recursivelyTraverseDeletionEffects( diff --git a/scripts/checkRepackBabelAllowlist.ts b/scripts/checkRepackBabelAllowlist.ts index 87f754384afc..e25cd4206323 100644 --- a/scripts/checkRepackBabelAllowlist.ts +++ b/scripts/checkRepackBabelAllowlist.ts @@ -52,9 +52,19 @@ const SCANNED_EXTENSIONS = new Set(['.js', '.cjs', '.mjs', '.jsx', '.ts', '.tsx' * Build-time tooling that ships to node_modules as a prod dependency but is never resolved into * the native app bundle. Some implement codegen detection themselves (regexes/strings); others are * genuinely Flow-typed but only ever run on the build machine. Verified against a real bundle: - * neither @expo/metro-file-map nor jsc-safe-url appears in it. + * neither @expo/metro-file-map nor jsc-safe-url appears in it. @expo/metro-config is Expo's Metro config and + * transformer; App bundles with Re.Pack and has no `metro.config.js`, so nothing loads it. Since SDK 58 it + * ships its own copy of the RN codegen babel plugin, which is why it contains the codegen markers. */ -const TOOLING_PACKAGE_PREFIXES = ['@expo/cli', '@expo/metro-file-map', '@react-native-community/cli', 'expo-modules-autolinking', '@react-native/codegen', 'jsc-safe-url']; +const TOOLING_PACKAGE_PREFIXES = [ + '@expo/cli', + '@expo/metro-config', + '@expo/metro-file-map', + '@react-native-community/cli', + 'expo-modules-autolinking', + '@react-native/codegen', + 'jsc-safe-url', +]; function isToolingPackage(packageName: string): boolean { return TOOLING_PACKAGE_PREFIXES.some((prefix) => packageName === prefix || packageName.startsWith(`${prefix}-`) || packageName.startsWith(`${prefix}/`)); diff --git a/src/components/AmountTextInput.tsx b/src/components/AmountTextInput.tsx index 926c78acd9ea..8776429055e9 100644 --- a/src/components/AmountTextInput.tsx +++ b/src/components/AmountTextInput.tsx @@ -12,6 +12,9 @@ import type {BaseTextInputProps} from './TextInput/BaseTextInput/types'; import TextInput from './TextInput'; +/** Key press event of the amount input. `ctrlKey` is only set on web, where the native event is a DOM KeyboardEvent */ +type AmountTextInputKeyPressEvent = NativeSyntheticEvent>>; + type AmountTextInputProps = { /** Formatted amount in local currency */ formattedAmount: string; @@ -30,7 +33,7 @@ type AmountTextInputProps = { disableKeyboard?: boolean; /** Function to call to handle key presses in the text input */ - onKeyPress?: (event: NativeSyntheticEvent) => void; + onKeyPress?: (event: AmountTextInputKeyPressEvent) => void; containerStyle?: StyleProp; @@ -95,7 +98,7 @@ function AmountTextInput({ selection={selection} onSelectionChange={onSelectionChange} accessibilityLabel={accessibilityLabel ?? translate('iou.amount')} - onKeyPress={onKeyPress as (event: TextInputKeyPressEvent) => void} + onKeyPress={onKeyPress} touchableInputWrapperStyle={touchableInputWrapperStyle} // On iPad, even if the soft keyboard is hidden, the keyboard suggestion is still shown. // Setting both autoCorrect and spellCheck to false will hide the suggestion. @@ -112,3 +115,4 @@ function AmountTextInput({ } export default AmountTextInput; +export type {AmountTextInputKeyPressEvent}; diff --git a/src/components/CopyTextToClipboard.tsx b/src/components/CopyTextToClipboard.tsx index 366c29b1c124..adf3ba78ba73 100644 --- a/src/components/CopyTextToClipboard.tsx +++ b/src/components/CopyTextToClipboard.tsx @@ -5,7 +5,7 @@ import Clipboard from '@libs/Clipboard'; import CONST from '@src/CONST'; -import type {AccessibilityRole, StyleProp, TextStyle} from 'react-native'; +import type {StyleProp, TextStyle} from 'react-native'; import React from 'react'; @@ -20,7 +20,7 @@ type CopyTextToClipboardProps = { textStyles?: StyleProp; urlToCopy?: string; - accessibilityRole?: AccessibilityRole; + accessibilityRole?: PressableWithDelayToggleProps['accessibilityRole']; } & Pick; function CopyTextToClipboard({ diff --git a/src/components/CustomStatusBarAndBackground/updateStatusBarAppearance/index.android.ts b/src/components/CustomStatusBarAndBackground/updateStatusBarAppearance/index.android.ts deleted file mode 100644 index 30a681bb7128..000000000000 --- a/src/components/CustomStatusBarAndBackground/updateStatusBarAppearance/index.android.ts +++ /dev/null @@ -1,11 +0,0 @@ -import StatusBar from '@libs/StatusBar'; - -import type UpdateStatusBarAppearanceProps from './types'; - -export default function updateStatusBarAppearance({statusBarStyle}: UpdateStatusBarAppearanceProps) { - StatusBar.setBackgroundColor('transparent'); - StatusBar.setTranslucent(true); - if (statusBarStyle) { - StatusBar.setBarStyle(statusBarStyle, true); - } -} diff --git a/src/components/CustomStatusBarAndBackground/updateStatusBarAppearance/index.ios.ts b/src/components/CustomStatusBarAndBackground/updateStatusBarAppearance/index.native.ts similarity index 100% rename from src/components/CustomStatusBarAndBackground/updateStatusBarAppearance/index.ios.ts rename to src/components/CustomStatusBarAndBackground/updateStatusBarAppearance/index.native.ts diff --git a/src/components/FlatList/hooks/useFlatListHandle.ts b/src/components/FlatList/hooks/useFlatListHandle.ts index 6bafc31df9ed..e0b14b69d93f 100644 --- a/src/components/FlatList/hooks/useFlatListHandle.ts +++ b/src/components/FlatList/hooks/useFlatListHandle.ts @@ -1,8 +1,7 @@ import type {FlatListInnerRefType} from '@components/FlatList/types'; -import type {ComponentRef, ForwardedRef} from 'react'; -// eslint-disable-next-line no-restricted-imports -import type {FlatList as RNFlatList, ScrollView} from 'react-native'; +import type {ForwardedRef} from 'react'; +import type {FlatList as RNFlatList} from 'react-native'; import {useImperativeHandle} from 'react'; @@ -31,7 +30,7 @@ function useFlatListHandle({ref, listRef, setCurrentDataId, remainingItemsToD const scrollViewRef = listRef.current?.getNativeScrollRef(); // Try to scroll on underlying scrollView if available, fallback to usual listRef if (scrollViewRef && 'scrollToEnd' in scrollViewRef) { - (scrollViewRef as ComponentRef).scrollToEnd({animated: !!params?.animated}); + scrollViewRef.scrollToEnd({animated: !!params?.animated}); return; } listRef.current?.scrollToEnd(params); diff --git a/src/components/NumberWithSymbolForm.tsx b/src/components/NumberWithSymbolForm.tsx index 3dfd88851913..67070eeb88d5 100644 --- a/src/components/NumberWithSymbolForm.tsx +++ b/src/components/NumberWithSymbolForm.tsx @@ -24,12 +24,13 @@ import shouldIgnoreSelectionWhenUpdatedManually from '@libs/shouldIgnoreSelectio import CONST from '@src/CONST'; import type {ComponentRef, ForwardedRef} from 'react'; -import type {KeyboardTypeOptions, NativeSyntheticEvent, StyleProp, TextStyle, ViewStyle} from 'react-native'; +import type {KeyboardTypeOptions, StyleProp, TextStyle, ViewStyle} from 'react-native'; import {useIsFocused} from '@react-navigation/native'; import React, {useEffect, useImperativeHandle, useRef, useState} from 'react'; import {View} from 'react-native'; +import type {AmountTextInputKeyPressEvent} from './AmountTextInput'; import type {BaseTextInputRef} from './TextInput/BaseTextInput/types'; import type {TextInputWithSymbolProps} from './TextInputWithSymbol/types'; @@ -413,7 +414,7 @@ function NumberWithSymbolForm({ /** * Input handler to check for a forward-delete key (or keyboard shortcut) press. */ - const textInputKeyPress = (event: NativeSyntheticEvent) => { + const textInputKeyPress = (event: AmountTextInputKeyPressEvent) => { const key = event.nativeEvent.key.toLowerCase(); if (!textInput.current?.value && key === 'backspace' && isNegative) { @@ -430,7 +431,7 @@ function NumberWithSymbolForm({ // Also check for the keyboard shortcut on iOS in cases where a hardware keyboard may be connected to the device. const operatingSystem = getOperatingSystem() as string | null; const allowedOS: string[] = [CONST.OS.MAC_OS, CONST.OS.IOS]; - forwardDeletePressedRef.current = key === 'delete' || (allowedOS.includes(operatingSystem ?? '') && event.nativeEvent.ctrlKey && key === 'd'); + forwardDeletePressedRef.current = key === 'delete' || (allowedOS.includes(operatingSystem ?? '') && !!event.nativeEvent.ctrlKey && key === 'd'); }; useImperativeHandle(numberFormRef, () => ({ diff --git a/src/components/Pressable/PressableWithDelayToggle.tsx b/src/components/Pressable/PressableWithDelayToggle.tsx index b0bddaea35b3..d11e31aeaae3 100644 --- a/src/components/Pressable/PressableWithDelayToggle.tsx +++ b/src/components/Pressable/PressableWithDelayToggle.tsx @@ -14,7 +14,7 @@ import getButtonState from '@libs/getButtonState'; import CONST from '@src/CONST'; import type IconAsset from '@src/types/utils/IconAsset'; -import type {StyleProp, TextStyle, ViewStyle} from 'react-native'; +import type {StyleProp, TextProps, TextStyle, ViewStyle} from 'react-native'; import React from 'react'; @@ -53,7 +53,8 @@ type PressableWithDelayToggleProps = PressableProps & { * vertical text alignment of non-Text elements */ inline?: boolean; - accessibilityRole?: string; + /** Limited to the roles Text accepts, since the inline variant renders a Text (React Native 0.88 added Android-only roles it rejects) */ + accessibilityRole?: TextProps['accessibilityRole']; ref?: PressableRef; /** Whether to use background color based on button states, e.g., hovered, active, pressed... */ diff --git a/src/components/TextInputWithSymbol/types.ts b/src/components/TextInputWithSymbol/types.ts index 2f93a64a8232..8924843332f4 100644 --- a/src/components/TextInputWithSymbol/types.ts +++ b/src/components/TextInputWithSymbol/types.ts @@ -1,9 +1,10 @@ +import type {AmountTextInputKeyPressEvent} from '@components/AmountTextInput'; import type {TextSelection} from '@components/Composer/types'; import type {BaseTextInputProps} from '@components/TextInput/BaseTextInput/types'; import type CONST from '@src/CONST'; -import type {KeyboardTypeOptions, NativeSyntheticEvent, StyleProp, TextInputSelectionChangeEvent, TextStyle, ViewStyle} from 'react-native'; +import type {KeyboardTypeOptions, StyleProp, TextInputSelectionChangeEvent, TextStyle, ViewStyle} from 'react-native'; import type {ValueOf} from 'type-fest'; /** @deprecated Use AmountFormFieldProps or KeypadAmountEditorProps instead. See contributingGuides/NUMBER_WITH_SYMBOL_FORM_MIGRATION.md. */ @@ -26,7 +27,7 @@ type BaseTextInputWithSymbolProps = { onSelectionChange?: (event: TextInputSelectionChangeEvent) => void; /** Function to call to handle key presses in the text input */ - onKeyPress?: (event: NativeSyntheticEvent) => void; + onKeyPress?: (event: AmountTextInputKeyPressEvent) => void; /** * Callback that is called when the text input is pressed down diff --git a/src/components/TimePicker/TimePicker.tsx b/src/components/TimePicker/TimePicker.tsx index 790270d5bc84..049a4b3f3804 100644 --- a/src/components/TimePicker/TimePicker.tsx +++ b/src/components/TimePicker/TimePicker.tsx @@ -1,4 +1,5 @@ import AmountTextInput from '@components/AmountTextInput'; +import type {AmountTextInputKeyPressEvent} from '@components/AmountTextInput'; import BigNumberPad from '@components/BigNumberPad'; import Button from '@components/Button'; import FormHelpMessage from '@components/FormHelpMessage'; @@ -17,7 +18,7 @@ import {canUseTouchScreen as canUseTouchScreenDeviceCapabilities} from '@libs/De import CONST from '@src/CONST'; -import type {GestureResponderEvent, NativeSyntheticEvent} from 'react-native'; +import type {GestureResponderEvent} from 'react-native'; import type {TextInput} from 'react-native-gesture-handler'; import React, {useEffect, useRef, useState} from 'react'; @@ -658,7 +659,7 @@ function TimePicker({defaultValue = '', onSubmit, onInputChange = () => {}, shou useKeyboardShortcut(CONST.KEYBOARD_SHORTCUTS.ARROW_LEFT, arrowLeftCallback, arrowConfig); useKeyboardShortcut(CONST.KEYBOARD_SHORTCUTS.ARROW_RIGHT, arrowRightCallback, arrowConfig); - const handleFocusOnBackspace = (e: NativeSyntheticEvent) => { + const handleFocusOnBackspace = (e: AmountTextInputKeyPressEvent) => { if (e.nativeEvent.key !== 'Backspace') { return; } diff --git a/src/components/ValidateCodeInput.tsx b/src/components/ValidateCodeInput.tsx index b0135c3faa7d..4b5b9659928b 100644 --- a/src/components/ValidateCodeInput.tsx +++ b/src/components/ValidateCodeInput.tsx @@ -394,7 +394,9 @@ function ValidateCodeInput({ * NOTE: when using Android Emulator, this can only be tested using * hardware keyboard inputs. */ - const onKeyPress = (event: Partial & Partial>) => { + const onKeyPress = ( + event: Omit, 'nativeEvent'> & {nativeEvent?: Pick} & Partial>, + ) => { const keyValue = event?.nativeEvent?.key; if (keyValue === 'Backspace' || keyValue === '<') { let numbers = decomposeString(value, maxLength); diff --git a/src/libs/StatusBar/index.android.ts b/src/libs/StatusBar/index.android.ts deleted file mode 100644 index 6cbf1a762a0b..000000000000 --- a/src/libs/StatusBar/index.android.ts +++ /dev/null @@ -1,14 +0,0 @@ -import StatusBar from './types'; - -const setBackgroundColor = StatusBar.setBackgroundColor; - -let statusBarColor: string | null = null; - -StatusBar.getBackgroundColor = () => statusBarColor; - -StatusBar.setBackgroundColor = (color, animated = false) => { - statusBarColor = color as string; - setBackgroundColor(color, animated); -}; - -export default StatusBar; diff --git a/src/libs/StatusBar/index.ts b/src/libs/StatusBar/index.ts index c1290bccaa77..a3b0ef1f3c8d 100644 --- a/src/libs/StatusBar/index.ts +++ b/src/libs/StatusBar/index.ts @@ -3,8 +3,7 @@ import StatusBar from './types'; // Only has custom web implementation StatusBar.getBackgroundColor = () => null; -// Overwrite setTranslucent and setBackgroundColor suppress warnings on iOS -StatusBar.setTranslucent = () => {}; +// Native apps draw edge-to-edge, so there is no status bar background to set; keep the wrapper API as a no-op StatusBar.setBackgroundColor = () => {}; export default StatusBar; diff --git a/src/libs/StatusBar/index.web.ts b/src/libs/StatusBar/index.web.ts index 1d46397eb4b7..bcae612aca6e 100644 --- a/src/libs/StatusBar/index.web.ts +++ b/src/libs/StatusBar/index.web.ts @@ -17,7 +17,7 @@ StatusBar.setBackgroundColor = (backgroundColor) => { return; } - element.content = backgroundColor as string; + element.content = backgroundColor; }; export default StatusBar; diff --git a/src/libs/StatusBar/types.ts b/src/libs/StatusBar/types.ts index 9098eed977ab..89ae2231cf22 100644 --- a/src/libs/StatusBar/types.ts +++ b/src/libs/StatusBar/types.ts @@ -1,8 +1,11 @@ // eslint-disable-next-line no-restricted-imports import {StatusBar as StatusBarRN} from 'react-native'; +// StatusBar has no `setBackgroundColor`, so it is part of this wrapper's API and every platform file +// provides its own implementation. type StatusBarExtended = typeof StatusBarRN & { getBackgroundColor(): string | null; + setBackgroundColor(color: string, animated?: boolean): void; }; const StatusBar = StatusBarRN as StatusBarExtended; diff --git a/tests/unit/InsertionEffectCleanupInHiddenActivityTest.tsx b/tests/unit/InsertionEffectCleanupInHiddenActivityTest.tsx deleted file mode 100644 index 30f3d13818db..000000000000 --- a/tests/unit/InsertionEffectCleanupInHiddenActivityTest.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import {render} from '@testing-library/react-native'; - -import type {ActivityProps} from 'react'; - -import {Activity, useEffect, useInsertionEffect} from 'react'; -import {View} from 'react-native'; - -// The renderer patches run-insertion-effect-cleanup-in-hidden-subtree (react-native 044, react-test-renderer 001) make a -// component removed inside a hidden run its useInsertionEffect cleanup, as react-dom 19.2 and React 19.3 do. -// TODO: Remove this test together with both patches once the App migrates to React 19.3, which runs the cleanup unconditionally. - -type EffectProbeProps = { - onInsertionCleanup: () => void; - onPassiveCleanup: () => void; -}; - -function EffectProbe({onInsertionCleanup, onPassiveCleanup}: EffectProbeProps) { - useInsertionEffect(() => onInsertionCleanup, [onInsertionCleanup]); - useEffect(() => onPassiveCleanup, [onPassiveCleanup]); - return ; -} - -function Screen({mode, isProbeMounted, onInsertionCleanup, onPassiveCleanup}: EffectProbeProps & {mode: ActivityProps['mode']; isProbeMounted: boolean}) { - return ( - - {isProbeMounted ? ( - - ) : null} - - ); -} - -describe('useInsertionEffect cleanup inside a hidden Activity', () => { - it('is skipped when the Activity only hides', () => { - // Given a probe mounted inside a visible Activity, so both of its effects are set up - const onInsertionCleanup = jest.fn(); - const onPassiveCleanup = jest.fn(); - const {rerender} = render( - , - ); - - // When the Activity hides while the probe stays mounted - rerender( - , - ); - - // Then only the passive cleanup runs, because the patch must not change how React treats insertion effects on a plain hide - expect(onPassiveCleanup).toHaveBeenCalledTimes(1); - expect(onInsertionCleanup).not.toHaveBeenCalled(); - }); - - it('runs when the component is removed while the Activity is hidden', () => { - // Given a probe that was mounted in a visible Activity and then hidden, which is the case the unpatched renderer leaks - const onInsertionCleanup = jest.fn(); - const onPassiveCleanup = jest.fn(); - const {rerender} = render( - , - ); - rerender( - , - ); - - // When the probe is removed while the Activity is still hidden - rerender( - , - ); - - // Then the insertion cleanup runs so nothing it registered leaks, and the passive cleanup is not repeated because the hide already ran it - expect(onInsertionCleanup).toHaveBeenCalledTimes(1); - expect(onPassiveCleanup).toHaveBeenCalledTimes(1); - }); - - it('runs when the component is removed while the Activity is visible', () => { - // Given a probe mounted inside a visible Activity, as a baseline that the patch leaves the regular removal path intact - const onInsertionCleanup = jest.fn(); - const onPassiveCleanup = jest.fn(); - const {rerender} = render( - , - ); - - // When the probe is removed without the Activity ever hiding - rerender( - , - ); - - // Then both cleanups run exactly once, as they do for any unmount outside a hidden subtree - expect(onInsertionCleanup).toHaveBeenCalledTimes(1); - expect(onPassiveCleanup).toHaveBeenCalledTimes(1); - }); -}); diff --git a/tests/unit/components/SelectionList/useSelectionListTextInput.test.ts b/tests/unit/components/SelectionList/useSelectionListTextInput.test.ts index 09cdb46496b5..7050340b1b71 100644 --- a/tests/unit/components/SelectionList/useSelectionListTextInput.test.ts +++ b/tests/unit/components/SelectionList/useSelectionListTextInput.test.ts @@ -15,7 +15,7 @@ jest.mock('@hooks/useSyncFocus/useSyncFocusImplementation', () => ({ const mockFocusedItemRefFocus = jest.mocked(focusedItemRef)?.focus; function keyPressEvent(key: string): Pick { - return {nativeEvent: {key}}; + return {nativeEvent: {key, eventCount: 0}}; } describe('useSelectionListTextInput', () => { diff --git a/tests/unit/scheduleRefocusAndroidTest.ts b/tests/unit/scheduleRefocusAndroidTest.ts index e308573709aa..a3a8125f18de 100644 --- a/tests/unit/scheduleRefocusAndroidTest.ts +++ b/tests/unit/scheduleRefocusAndroidTest.ts @@ -9,7 +9,7 @@ jest.mock('@libs/Accessibility/fireFocusEvent', () => ({ const FAKE_IDLE_ID = 4242; let capturedIdleCallback: (() => void) | null = null; let capturedIdleOptions: {timeout?: number} | undefined; -const mockCancelIdleCallback = jest.fn(); +const mockCancelIdleCallback = jest.fn(); const originalRequestIdleCallback = global.requestIdleCallback; const originalCancelIdleCallback = global.cancelIdleCallback; diff --git a/tsconfig.base.json b/tsconfig.base.json index 2ef26e24d0fa..f1b2f4c339e1 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": "expo/tsconfig.base", + "extends": "expo/tsconfig.base.json", "compilerOptions": { "isolatedModules": true, "strict": true, @@ -9,6 +9,10 @@ // line flag: the whole typecheck gate now depends on this option coming from a config file. "noEmit": true, "incremental": true, + // React Native 0.88 serves its Strict TypeScript API (`types_generated/`) by default. Opt out until the app is + // migrated to it: this condition resolves the legacy types (`types_DEPRECATED/`) and the `react-native/Libraries/*` + // deep imports. `customConditions` replaces the array inherited from `expo/tsconfig.base`, so "react-native" is restated. + "customConditions": ["react-native-legacy-deep-imports", "react-native"], "paths": { "@assets/*": ["./assets/*"], "@components/*": ["./src/components/*"],