diff --git a/exponent-view-template/ios/exponent-view-template/Supporting/EXSDKVersions.plist b/exponent-view-template/ios/exponent-view-template/Supporting/EXSDKVersions.plist
index 17051dd427d425..6ce995d49187bc 100644
--- a/exponent-view-template/ios/exponent-view-template/Supporting/EXSDKVersions.plist
+++ b/exponent-view-template/ios/exponent-view-template/Supporting/EXSDKVersions.plist
@@ -6,6 +6,7 @@
47.0.0
48.0.0
+ 49.0.0
diff --git a/exponent-view-template/ios/exponent-view-template/Supporting/sdkVersions.json b/exponent-view-template/ios/exponent-view-template/Supporting/sdkVersions.json
index b211e29389ce15..15fa941addda92 100644
--- a/exponent-view-template/ios/exponent-view-template/Supporting/sdkVersions.json
+++ b/exponent-view-template/ios/exponent-view-template/Supporting/sdkVersions.json
@@ -1 +1 @@
-{"sdkVersions":["47.0.0","48.0.0"]}
\ No newline at end of file
+{"sdkVersions":["47.0.0","48.0.0","49.0.0"]}
\ No newline at end of file
diff --git a/ios/ExpoKit.podspec b/ios/ExpoKit.podspec
index 06df693229aecb..403c5285b8e851 100644
--- a/ios/ExpoKit.podspec
+++ b/ios/ExpoKit.podspec
@@ -3,7 +3,7 @@
Pod::Spec.new do |s|
s.name = "ExpoKit"
- s.version = "48.0.0"
+ s.version = "49.0.0"
s.summary = 'ExpoKit'
s.description = 'ExpoKit allows native projects to integrate with the Expo SDK.'
s.homepage = 'http://docs.expo.io'
diff --git a/ios/Exponent.xcodeproj/project.pbxproj b/ios/Exponent.xcodeproj/project.pbxproj
index c8faa7418541fd..ffa7a3aee450e3 100644
--- a/ios/Exponent.xcodeproj/project.pbxproj
+++ b/ios/Exponent.xcodeproj/project.pbxproj
@@ -2300,6 +2300,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/StripeUICore/StripeUICore.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/ABI47_0_0React-Core/ABI47_0_0AccessibilityResources.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/ABI48_0_0React-Core/ABI48_0_0AccessibilityResources.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/ABI49_0_0React-Core/ABI49_0_0AccessibilityResources.bundle",
"${PODS_ROOT}/GooglePlaces/Frameworks/GooglePlaces.xcframework/ios-arm64/GooglePlaces.framework/Resources/GooglePlaces.bundle",
"${PODS_ROOT}/GooglePlaces/Frameworks/GooglePlaces.xcframework/ios-arm64_x86_64-simulator/GooglePlaces.framework/Resources/GooglePlaces.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn/GoogleSignIn.bundle",
@@ -2319,6 +2320,7 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/StripeUICore.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ABI47_0_0AccessibilityResources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ABI48_0_0AccessibilityResources.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ABI49_0_0AccessibilityResources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GooglePlaces.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle",
);
@@ -2337,6 +2339,7 @@
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ABI47_0_0hermes-engine/ABI47_0_0hermes.framework/ABI47_0_0hermes",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ABI48_0_0hermes-engine/Pre-built/ABI48_0_0hermes.framework/ABI48_0_0hermes",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ABI49_0_0hermes-engine/Pre-built/ABI49_0_0hermes.framework/ABI49_0_0hermes",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/FBAEMKit/FBAEMKit.framework/FBAEMKit",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework/FBSDKCoreKit",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit_Basics/FBSDKCoreKit_Basics.framework/FBSDKCoreKit_Basics",
@@ -2346,6 +2349,7 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ABI47_0_0hermes.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ABI48_0_0hermes.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ABI49_0_0hermes.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBAEMKit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKCoreKit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKCoreKit_Basics.framework",
diff --git a/ios/Exponent/Kernel/Views/EXAppViewController.m b/ios/Exponent/Kernel/Views/EXAppViewController.m
index 974e9542bf541b..7fe33fdcafc137 100644
--- a/ios/Exponent/Kernel/Views/EXAppViewController.m
+++ b/ios/Exponent/Kernel/Views/EXAppViewController.m
@@ -26,6 +26,9 @@
#import
#import
+#if defined(INCLUDES_VERSIONED_CODE) && __has_include()
+#import
+#endif
#if defined(INCLUDES_VERSIONED_CODE) && __has_include()
#import
#endif
@@ -636,6 +639,9 @@ - (void)_overrideAppearanceModuleBehaviour
appearancePreference = nil;
}
RCTOverrideAppearancePreference(appearancePreference);
+#if defined(INCLUDES_VERSIONED_CODE) && __has_include()
+ ABI49_0_0RCTOverrideAppearancePreference(appearancePreference);
+#endif
#if defined(INCLUDES_VERSIONED_CODE) && __has_include()
ABI48_0_0RCTOverrideAppearancePreference(appearancePreference);
#endif
diff --git a/ios/Exponent/Supporting/EXSDKVersions.plist b/ios/Exponent/Supporting/EXSDKVersions.plist
index 17051dd427d425..6ce995d49187bc 100644
--- a/ios/Exponent/Supporting/EXSDKVersions.plist
+++ b/ios/Exponent/Supporting/EXSDKVersions.plist
@@ -6,6 +6,7 @@
47.0.0
48.0.0
+ 49.0.0
diff --git a/ios/Exponent/Supporting/sdkVersions.json b/ios/Exponent/Supporting/sdkVersions.json
index b211e29389ce15..15fa941addda92 100644
--- a/ios/Exponent/Supporting/sdkVersions.json
+++ b/ios/Exponent/Supporting/sdkVersions.json
@@ -1 +1 @@
-{"sdkVersions":["47.0.0","48.0.0"]}
\ No newline at end of file
+{"sdkVersions":["47.0.0","48.0.0","49.0.0"]}
\ No newline at end of file
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 3b8c75ac1aaa67..49edc48fa0ba6c 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1383,6 +1383,787 @@ PODS:
- StripePaymentsUI (~> 23.8.0)
- ABI48_0_0UMAppLoader (4.1.1)
- ABI48_0_0Yoga (1.14.0)
+ - ABI49_0_0EASClient (0.6.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXApplication (5.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXAV (13.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ReactCommon/turbomodule/core
+ - ABI49_0_0EXBackgroundFetch (11.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXBarCodeScanner (12.5.0):
+ - ABI49_0_0EXImageLoader
+ - ABI49_0_0ExpoModulesCore
+ - ZXingObjC/OneD
+ - ZXingObjC/PDF417
+ - ABI49_0_0EXCalendar (11.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXCamera (13.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXConstants (14.4.2):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXContacts (12.2.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXFileSystem (15.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXFont (11.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXImageLoader (4.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0React-Core
+ - ABI49_0_0EXJSONUtils (0.7.0)
+ - ABI49_0_0EXLocation (16.0.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXManifests (0.7.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXMediaLibrary (15.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0React-Core
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0EXNotifications (0.20.1):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXPermissions (14.2.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0Expo (49.0.0-alpha.9):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoAppleAuthentication (6.1.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoBattery (7.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoBlur (12.4.1):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoBrightness (11.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoCellular (5.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoClipboard (4.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoCrypto (12.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoDevice (5.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoDocumentPicker (11.5.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoGL (13.0.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ReactCommon/turbomodule/core
+ - ABI49_0_0ExpoHaptics (12.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoImage (1.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - SDWebImage (~> 5.15.8)
+ - SDWebImageAVIFCoder (~> 0.10.0)
+ - SDWebImageSVGCoder (~> 1.7.0)
+ - SDWebImageWebPCoder (~> 0.11.0)
+ - ABI49_0_0ExpoImageManipulator (11.3.0):
+ - ABI49_0_0EXImageLoader
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoImagePicker (14.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoInsights (0.2.0):
+ - ABI49_0_0EASClient
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoKeepAwake (12.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoKit/Expo (49.0.0):
+ - ABI49_0_0EASClient
+ - ABI49_0_0EXApplication
+ - ABI49_0_0EXAV
+ - ABI49_0_0EXBackgroundFetch
+ - ABI49_0_0EXBarCodeScanner
+ - ABI49_0_0EXCalendar
+ - ABI49_0_0EXCamera
+ - ABI49_0_0EXConstants
+ - ABI49_0_0EXContacts
+ - ABI49_0_0EXFileSystem
+ - ABI49_0_0EXFont
+ - ABI49_0_0EXImageLoader
+ - ABI49_0_0EXJSONUtils
+ - ABI49_0_0EXLocation
+ - ABI49_0_0EXManifests
+ - ABI49_0_0EXMediaLibrary
+ - ABI49_0_0EXNotifications
+ - ABI49_0_0EXPermissions
+ - ABI49_0_0Expo
+ - ABI49_0_0ExpoAppleAuthentication
+ - ABI49_0_0ExpoBattery
+ - ABI49_0_0ExpoBlur
+ - ABI49_0_0ExpoBrightness
+ - ABI49_0_0ExpoCellular
+ - ABI49_0_0ExpoClipboard
+ - ABI49_0_0ExpoCrypto
+ - ABI49_0_0ExpoDevice
+ - ABI49_0_0ExpoDocumentPicker
+ - ABI49_0_0ExpoGL
+ - ABI49_0_0ExpoHaptics
+ - ABI49_0_0ExpoImage
+ - ABI49_0_0ExpoImageManipulator
+ - ABI49_0_0ExpoImagePicker
+ - ABI49_0_0ExpoKeepAwake
+ - ABI49_0_0ExpoLinearGradient
+ - ABI49_0_0ExpoLocalAuthentication
+ - ABI49_0_0ExpoLocalization
+ - ABI49_0_0ExpoMailComposer
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoModulesProvider
+ - ABI49_0_0ExpoNetwork
+ - ABI49_0_0ExpoPrint
+ - ABI49_0_0ExpoRandom
+ - ABI49_0_0ExpoScreenOrientation
+ - ABI49_0_0ExpoSecureStore
+ - ABI49_0_0ExpoSharing
+ - ABI49_0_0ExpoSMS
+ - ABI49_0_0ExpoSpeech
+ - ABI49_0_0ExpoSQLite
+ - ABI49_0_0ExpoStoreReview
+ - ABI49_0_0ExpoSystemUI
+ - ABI49_0_0ExpoTrackingTransparency
+ - ABI49_0_0ExpoVideoThumbnails
+ - ABI49_0_0ExpoWebBrowser
+ - ABI49_0_0EXScreenCapture
+ - ABI49_0_0EXSensors
+ - ABI49_0_0EXSplashScreen
+ - ABI49_0_0EXStructuredHeaders
+ - ABI49_0_0EXTaskManager
+ - ABI49_0_0EXUpdates
+ - ABI49_0_0EXUpdatesInterface
+ - ABI49_0_0RCTRequired
+ - ABI49_0_0RCTTypeSafety
+ - ABI49_0_0React-Core
+ - ABI49_0_0React-Core/DevSupport
+ - ABI49_0_0React-hermes
+ - ABI49_0_0ReactCommon
+ - ABI49_0_0UMAppLoader
+ - Analytics
+ - AppAuth
+ - Branch
+ - EXBranch
+ - FBAudienceNetwork
+ - FBSDKCoreKit
+ - Google-Maps-iOS-Utils
+ - Google-Mobile-Ads-SDK
+ - GoogleMaps
+ - GoogleSignIn
+ - JKBigInteger
+ - lottie-ios
+ - RCT-Folly
+ - ABI49_0_0ExpoKit/ExpoOptional (49.0.0):
+ - ABI49_0_0ExpoKit/Expo
+ - ABI49_0_0ExpoLinearGradient (12.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoLocalAuthentication (13.4.1):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoLocalization (14.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoMailComposer (12.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoMaps (0.1.0):
+ - ABI49_0_0ExpoModulesCore
+ - GoogleMaps (= 7.3.0)
+ - GooglePlaces (= 7.3.0)
+ - ABI49_0_0ExpoModulesCore (1.5.3):
+ - ABI49_0_0React-Core
+ - ABI49_0_0React-NativeModulesApple
+ - ABI49_0_0React-RCTAppDelegate
+ - ABI49_0_0ReactCommon/turbomodule/core
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0ExpoModulesProvider (49):
+ - ABI49_0_0EASClient
+ - ABI49_0_0EXAV
+ - ABI49_0_0EXBarCodeScanner
+ - ABI49_0_0EXCamera
+ - ABI49_0_0EXConstants
+ - ABI49_0_0ExpoAppleAuthentication
+ - ABI49_0_0ExpoBattery
+ - ABI49_0_0ExpoBlur
+ - ABI49_0_0ExpoBrightness
+ - ABI49_0_0ExpoCellular
+ - ABI49_0_0ExpoClipboard
+ - ABI49_0_0ExpoCrypto
+ - ABI49_0_0ExpoDevice
+ - ABI49_0_0ExpoDocumentPicker
+ - ABI49_0_0ExpoGL
+ - ABI49_0_0ExpoHaptics
+ - ABI49_0_0ExpoImage
+ - ABI49_0_0ExpoImageManipulator
+ - ABI49_0_0ExpoImagePicker
+ - ABI49_0_0ExpoKeepAwake
+ - ABI49_0_0ExpoLinearGradient
+ - ABI49_0_0ExpoLocalAuthentication
+ - ABI49_0_0ExpoLocalization
+ - ABI49_0_0ExpoMailComposer
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoNetwork
+ - ABI49_0_0ExpoPrint
+ - ABI49_0_0ExpoRandom
+ - ABI49_0_0ExpoScreenOrientation
+ - ABI49_0_0ExpoSecureStore
+ - ABI49_0_0ExpoSharing
+ - ABI49_0_0ExpoSMS
+ - ABI49_0_0ExpoSpeech
+ - ABI49_0_0ExpoSQLite
+ - ABI49_0_0ExpoStoreReview
+ - ABI49_0_0ExpoSystemUI
+ - ABI49_0_0ExpoTrackingTransparency
+ - ABI49_0_0ExpoVideoThumbnails
+ - ABI49_0_0ExpoWebBrowser
+ - ABI49_0_0EXUpdates
+ - ABI49_0_0ExpoNetwork (5.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoPrint (12.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoRandom (13.2.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoScreenOrientation (6.0.1):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0React-Core
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0ExpoSecureStore (12.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoSharing (11.5.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoSMS (11.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoSpeech (11.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoSQLite (11.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoStoreReview (6.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoSystemUI (2.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoTrackingTransparency (3.1.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoVideoThumbnails (7.4.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0ExpoWebBrowser (12.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXScreenCapture (5.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXSensors (12.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXSplashScreen (0.20.1):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0React-Core
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0EXStructuredHeaders (3.3.0)
+ - ABI49_0_0EXTaskManager (11.3.0):
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0UMAppLoader
+ - ABI49_0_0EXUpdates (0.18.3):
+ - ABI49_0_0EASClient
+ - ABI49_0_0EXManifests
+ - ABI49_0_0ExpoModulesCore
+ - ABI49_0_0EXStructuredHeaders
+ - ABI49_0_0EXUpdatesInterface
+ - ABI49_0_0React-Core
+ - ASN1Decoder (~> 1.8)
+ - RCT-Folly (= 2021.07.22.00)
+ - ReachabilitySwift
+ - ABI49_0_0EXUpdatesInterface (0.10.0)
+ - ABI49_0_0FBLazyVector (0.72.0)
+ - ABI49_0_0FBReactNativeSpec (0.72.0):
+ - ABI49_0_0RCTRequired (= 0.72.0)
+ - ABI49_0_0RCTTypeSafety (= 0.72.0)
+ - ABI49_0_0React-Core (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0hermes-engine (0.72.0):
+ - ABI49_0_0hermes-engine/Pre-built (= 0.72.0)
+ - ABI49_0_0hermes-engine/Pre-built (0.72.0)
+ - ABI49_0_0lottie-react-native (5.1.6):
+ - ABI49_0_0React-Core
+ - lottie-ios (~> 3.4.0)
+ - ABI49_0_0RCTRequired (0.72.0)
+ - ABI49_0_0RCTTypeSafety (0.72.0):
+ - ABI49_0_0FBLazyVector (= 0.72.0)
+ - ABI49_0_0RCTRequired (= 0.72.0)
+ - ABI49_0_0React-Core (= 0.72.0)
+ - ABI49_0_0React (0.72.0):
+ - ABI49_0_0React-Core (= 0.72.0)
+ - ABI49_0_0React-Core/DevSupport (= 0.72.0)
+ - ABI49_0_0React-Core/RCTWebSocket (= 0.72.0)
+ - ABI49_0_0React-RCTActionSheet (= 0.72.0)
+ - ABI49_0_0React-RCTAnimation (= 0.72.0)
+ - ABI49_0_0React-RCTBlob (= 0.72.0)
+ - ABI49_0_0React-RCTImage (= 0.72.0)
+ - ABI49_0_0React-RCTLinking (= 0.72.0)
+ - ABI49_0_0React-RCTNetwork (= 0.72.0)
+ - ABI49_0_0React-RCTSettings (= 0.72.0)
+ - ABI49_0_0React-RCTText (= 0.72.0)
+ - ABI49_0_0React-RCTVibration (= 0.72.0)
+ - ABI49_0_0React-callinvoker (0.72.0)
+ - ABI49_0_0React-Codegen (0.72.0):
+ - ABI49_0_0FBReactNativeSpec
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0RCTRequired
+ - ABI49_0_0RCTTypeSafety
+ - ABI49_0_0React-Core
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-NativeModulesApple
+ - ABI49_0_0React-rncore
+ - ABI49_0_0ReactCommon/turbomodule/bridging
+ - ABI49_0_0ReactCommon/turbomodule/core
+ - DoubleConversion
+ - glog
+ - RCT-Folly
+ - ABI49_0_0React-Core (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default (= 0.72.0)
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/CoreModulesHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/Default (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/DevSupport (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default (= 0.72.0)
+ - ABI49_0_0React-Core/RCTWebSocket (= 0.72.0)
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-jsinspector (= 0.72.0)
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTActionSheetHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTAnimationHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTBlobHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTImageHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTLinkingHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTNetworkHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTSettingsHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTTextHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTVibrationHeaders (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-Core/RCTWebSocket (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Core/Default (= 0.72.0)
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-perflogger
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0React-utils
+ - ABI49_0_0Yoga
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-CoreModules (0.72.0):
+ - ABI49_0_0RCTTypeSafety (= 0.72.0)
+ - ABI49_0_0React-Codegen (= 0.72.0)
+ - ABI49_0_0React-Core/CoreModulesHeaders (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-RCTBlob
+ - ABI49_0_0React-RCTImage (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - RCT-Folly (= 2021.07.22.00)
+ - SocketRocket (= 0.6.0)
+ - ABI49_0_0React-cxxreact (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-callinvoker (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-jsinspector (= 0.72.0)
+ - ABI49_0_0React-logger (= 0.72.0)
+ - ABI49_0_0React-perflogger (= 0.72.0)
+ - ABI49_0_0React-runtimeexecutor (= 0.72.0)
+ - boost (= 1.76.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-debug (0.72.0)
+ - ABI49_0_0React-hermes (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-cxxreact (= 0.72.0)
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor (= 0.72.0)
+ - ABI49_0_0React-jsinspector (= 0.72.0)
+ - ABI49_0_0React-perflogger (= 0.72.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - RCT-Folly/Futures (= 2021.07.22.00)
+ - ABI49_0_0React-jsc (0.72.0):
+ - ABI49_0_0React-jsc/Fabric (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-jsc/Fabric (0.72.0):
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-jsi (0.72.0):
+ - boost (= 1.76.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-jsiexecutor (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-cxxreact (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-perflogger (= 0.72.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-jsinspector (0.72.0)
+ - ABI49_0_0React-logger (0.72.0):
+ - glog
+ - ABI49_0_0react-native-netinfo (9.3.10):
+ - ABI49_0_0React-Core
+ - ABI49_0_0react-native-pager-view (6.2.0):
+ - ABI49_0_0React-Core
+ - ABI49_0_0react-native-safe-area-context (4.6.3):
+ - ABI49_0_0RCTRequired
+ - ABI49_0_0RCTTypeSafety
+ - ABI49_0_0React-Core
+ - ABI49_0_0ReactCommon/turbomodule/core
+ - RCT-Folly
+ - ABI49_0_0react-native-segmented-control (2.4.1):
+ - ABI49_0_0React-Core
+ - ABI49_0_0react-native-skia (0.1.195):
+ - ABI49_0_0React
+ - ABI49_0_0React-callinvoker
+ - ABI49_0_0React-Core
+ - ABI49_0_0react-native-slider (4.4.2):
+ - ABI49_0_0React-Core
+ - ABI49_0_0react-native-webview (13.2.2):
+ - ABI49_0_0React-Core
+ - ABI49_0_0React-NativeModulesApple (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-callinvoker
+ - ABI49_0_0React-Core
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-runtimeexecutor
+ - ABI49_0_0ReactCommon/turbomodule/bridging
+ - ABI49_0_0ReactCommon/turbomodule/core
+ - ABI49_0_0React-perflogger (0.72.0)
+ - ABI49_0_0React-RCTActionSheet (0.72.0):
+ - ABI49_0_0React-Core/RCTActionSheetHeaders (= 0.72.0)
+ - ABI49_0_0React-RCTAnimation (0.72.0):
+ - ABI49_0_0RCTTypeSafety (= 0.72.0)
+ - ABI49_0_0React-Codegen (= 0.72.0)
+ - ABI49_0_0React-Core/RCTAnimationHeaders (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-NativeModulesApple (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-RCTAppDelegate (0.72.0):
+ - ABI49_0_0RCTRequired
+ - ABI49_0_0RCTTypeSafety
+ - ABI49_0_0React-Core
+ - ABI49_0_0React-CoreModules
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-NativeModulesApple
+ - ABI49_0_0React-RCTImage
+ - ABI49_0_0React-RCTNetwork
+ - ABI49_0_0React-runtimescheduler
+ - ABI49_0_0ReactCommon/turbomodule/core
+ - RCT-Folly
+ - ABI49_0_0React-RCTBlob (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-Codegen (= 0.72.0)
+ - ABI49_0_0React-Core/RCTBlobHeaders (= 0.72.0)
+ - ABI49_0_0React-Core/RCTWebSocket (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-NativeModulesApple (= 0.72.0)
+ - ABI49_0_0React-RCTNetwork (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-RCTImage (0.72.0):
+ - ABI49_0_0RCTTypeSafety (= 0.72.0)
+ - ABI49_0_0React-Codegen (= 0.72.0)
+ - ABI49_0_0React-Core/RCTImageHeaders (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-NativeModulesApple (= 0.72.0)
+ - ABI49_0_0React-RCTNetwork (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-RCTLinking (0.72.0):
+ - ABI49_0_0React-Codegen (= 0.72.0)
+ - ABI49_0_0React-Core/RCTLinkingHeaders (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-NativeModulesApple (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - ABI49_0_0React-RCTNetwork (0.72.0):
+ - ABI49_0_0RCTTypeSafety (= 0.72.0)
+ - ABI49_0_0React-Codegen (= 0.72.0)
+ - ABI49_0_0React-Core/RCTNetworkHeaders (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-NativeModulesApple (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-RCTSettings (0.72.0):
+ - ABI49_0_0RCTTypeSafety (= 0.72.0)
+ - ABI49_0_0React-Codegen (= 0.72.0)
+ - ABI49_0_0React-Core/RCTSettingsHeaders (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-NativeModulesApple (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-RCTText (0.72.0):
+ - ABI49_0_0React-Core/RCTTextHeaders (= 0.72.0)
+ - ABI49_0_0React-RCTVibration (0.72.0):
+ - ABI49_0_0React-Codegen (= 0.72.0)
+ - ABI49_0_0React-Core/RCTVibrationHeaders (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-NativeModulesApple (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-rncore (0.72.0)
+ - ABI49_0_0React-runtimeexecutor (0.72.0):
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-runtimescheduler (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-callinvoker
+ - ABI49_0_0React-debug
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-runtimeexecutor
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0React-utils (0.72.0):
+ - ABI49_0_0React-debug
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0ReactCommon (0.72.0):
+ - ABI49_0_0React-logger (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-callinvoker (= 0.72.0)
+ - ABI49_0_0React-cxxreact (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-logger (= 0.72.0)
+ - ABI49_0_0React-perflogger (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/bridging (= 0.72.0)
+ - ABI49_0_0ReactCommon/turbomodule/core (= 0.72.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0ReactCommon/turbomodule/bridging (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-callinvoker (= 0.72.0)
+ - ABI49_0_0React-cxxreact (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-logger (= 0.72.0)
+ - ABI49_0_0React-perflogger (= 0.72.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0ReactCommon/turbomodule/core (0.72.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0React-callinvoker (= 0.72.0)
+ - ABI49_0_0React-cxxreact (= 0.72.0)
+ - ABI49_0_0React-jsi (= 0.72.0)
+ - ABI49_0_0React-logger (= 0.72.0)
+ - ABI49_0_0React-perflogger (= 0.72.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - ABI49_0_0RNCAsyncStorage (1.18.2):
+ - ABI49_0_0React-Core
+ - ABI49_0_0RNFlashList (1.4.3):
+ - ABI49_0_0React-Core
+ - ABI49_0_0RNGestureHandler (2.12.0):
+ - ABI49_0_0React-Core
+ - ABI49_0_0RNReanimated (3.3.0):
+ - ABI49_0_0hermes-engine
+ - ABI49_0_0RCTRequired
+ - ABI49_0_0RCTTypeSafety
+ - ABI49_0_0React-callinvoker
+ - ABI49_0_0React-Core
+ - ABI49_0_0React-Core/DevSupport
+ - ABI49_0_0React-Core/RCTWebSocket
+ - ABI49_0_0React-CoreModules
+ - ABI49_0_0React-cxxreact
+ - ABI49_0_0React-hermes
+ - ABI49_0_0React-jsi
+ - ABI49_0_0React-jsiexecutor
+ - ABI49_0_0React-jsinspector
+ - ABI49_0_0React-RCTActionSheet
+ - ABI49_0_0React-RCTAnimation
+ - ABI49_0_0React-RCTAppDelegate
+ - ABI49_0_0React-RCTBlob
+ - ABI49_0_0React-RCTImage
+ - ABI49_0_0React-RCTLinking
+ - ABI49_0_0React-RCTNetwork
+ - ABI49_0_0React-RCTSettings
+ - ABI49_0_0React-RCTText
+ - ABI49_0_0ReactCommon/turbomodule/core
+ - DoubleConversion
+ - FBLazyVector
+ - glog
+ - RCT-Folly
+ - Yoga
+ - ABI49_0_0RNScreens (3.22.0):
+ - ABI49_0_0React-Core
+ - ABI49_0_0React-RCTImage
+ - ABI49_0_0RNSVG (13.9.0):
+ - ABI49_0_0React-Core
+ - ABI49_0_0stripe-react-native (0.28.0):
+ - ABI49_0_0React-Core
+ - Stripe (~> 23.8.0)
+ - StripeApplePay (~> 23.8.0)
+ - StripeFinancialConnections (~> 23.8.0)
+ - StripePayments (~> 23.8.0)
+ - StripePaymentSheet (~> 23.8.0)
+ - StripePaymentsUI (~> 23.8.0)
+ - ABI49_0_0UMAppLoader (4.2.0)
+ - ABI49_0_0Yoga (1.14.0)
- Analytics (4.1.8)
- AppAuth (1.6.2):
- AppAuth/Core (= 1.6.2)
@@ -2534,6 +3315,124 @@ DEPENDENCIES:
- "ABI48_0_0stripe-react-native (from `./vendored/sdk48/@stripe/stripe-react-native`)"
- ABI48_0_0UMAppLoader (from `./versioned/sdk48/UMAppLoader`)
- ABI48_0_0Yoga (from `./versioned-react-native/ABI48_0_0/ReactNative/ReactCommon/yoga`)
+ - ABI49_0_0EASClient (from `./versioned/sdk49/EASClient`)
+ - ABI49_0_0EXApplication (from `./versioned/sdk49/EXApplication`)
+ - ABI49_0_0EXAV (from `./versioned/sdk49/EXAV`)
+ - ABI49_0_0EXBackgroundFetch (from `./versioned/sdk49/EXBackgroundFetch`)
+ - ABI49_0_0EXBarCodeScanner (from `./versioned/sdk49/EXBarCodeScanner`)
+ - ABI49_0_0EXCalendar (from `./versioned/sdk49/EXCalendar`)
+ - ABI49_0_0EXCamera (from `./versioned/sdk49/EXCamera`)
+ - ABI49_0_0EXConstants (from `./versioned/sdk49/EXConstants`)
+ - ABI49_0_0EXContacts (from `./versioned/sdk49/EXContacts`)
+ - ABI49_0_0EXFileSystem (from `./versioned/sdk49/EXFileSystem`)
+ - ABI49_0_0EXFont (from `./versioned/sdk49/EXFont`)
+ - ABI49_0_0EXImageLoader (from `./versioned/sdk49/EXImageLoader`)
+ - ABI49_0_0EXJSONUtils (from `./versioned/sdk49/EXJSONUtils`)
+ - ABI49_0_0EXLocation (from `./versioned/sdk49/EXLocation`)
+ - ABI49_0_0EXManifests (from `./versioned/sdk49/EXManifests`)
+ - ABI49_0_0EXMediaLibrary (from `./versioned/sdk49/EXMediaLibrary`)
+ - ABI49_0_0EXNotifications (from `./versioned/sdk49/EXNotifications`)
+ - ABI49_0_0EXPermissions (from `./versioned/sdk49/EXPermissions`)
+ - ABI49_0_0Expo (from `./versioned/sdk49/Expo`)
+ - ABI49_0_0ExpoAppleAuthentication (from `./versioned/sdk49/ExpoAppleAuthentication`)
+ - ABI49_0_0ExpoBattery (from `./versioned/sdk49/ExpoBattery`)
+ - ABI49_0_0ExpoBlur (from `./versioned/sdk49/ExpoBlur`)
+ - ABI49_0_0ExpoBrightness (from `./versioned/sdk49/ExpoBrightness`)
+ - ABI49_0_0ExpoCellular (from `./versioned/sdk49/ExpoCellular`)
+ - ABI49_0_0ExpoClipboard (from `./versioned/sdk49/ExpoClipboard`)
+ - ABI49_0_0ExpoCrypto (from `./versioned/sdk49/ExpoCrypto`)
+ - ABI49_0_0ExpoDevice (from `./versioned/sdk49/ExpoDevice`)
+ - ABI49_0_0ExpoDocumentPicker (from `./versioned/sdk49/ExpoDocumentPicker`)
+ - ABI49_0_0ExpoGL (from `./versioned/sdk49/ExpoGL`)
+ - ABI49_0_0ExpoHaptics (from `./versioned/sdk49/ExpoHaptics`)
+ - ABI49_0_0ExpoImage (from `./versioned/sdk49/ExpoImage`)
+ - ABI49_0_0ExpoImageManipulator (from `./versioned/sdk49/ExpoImageManipulator`)
+ - ABI49_0_0ExpoImagePicker (from `./versioned/sdk49/ExpoImagePicker`)
+ - ABI49_0_0ExpoInsights (from `./versioned/sdk49/ExpoInsights`)
+ - ABI49_0_0ExpoKeepAwake (from `./versioned/sdk49/ExpoKeepAwake`)
+ - ABI49_0_0ExpoKit/Expo (from `./versioned-react-native/ABI49_0_0/Expo/ExpoKit`)
+ - ABI49_0_0ExpoKit/ExpoOptional (from `./versioned-react-native/ABI49_0_0/Expo/ExpoKit`)
+ - ABI49_0_0ExpoLinearGradient (from `./versioned/sdk49/ExpoLinearGradient`)
+ - ABI49_0_0ExpoLocalAuthentication (from `./versioned/sdk49/ExpoLocalAuthentication`)
+ - ABI49_0_0ExpoLocalization (from `./versioned/sdk49/ExpoLocalization`)
+ - ABI49_0_0ExpoMailComposer (from `./versioned/sdk49/ExpoMailComposer`)
+ - ABI49_0_0ExpoMaps (from `./versioned/sdk49/ExpoMaps`)
+ - ABI49_0_0ExpoModulesCore (from `./versioned/sdk49/ExpoModulesCore`)
+ - ABI49_0_0ExpoModulesProvider (from `./versioned/sdk49/ExpoModulesProvider`)
+ - ABI49_0_0ExpoNetwork (from `./versioned/sdk49/ExpoNetwork`)
+ - ABI49_0_0ExpoPrint (from `./versioned/sdk49/ExpoPrint`)
+ - ABI49_0_0ExpoRandom (from `./versioned/sdk49/ExpoRandom`)
+ - ABI49_0_0ExpoScreenOrientation (from `./versioned/sdk49/ExpoScreenOrientation`)
+ - ABI49_0_0ExpoSecureStore (from `./versioned/sdk49/ExpoSecureStore`)
+ - ABI49_0_0ExpoSharing (from `./versioned/sdk49/ExpoSharing`)
+ - ABI49_0_0ExpoSMS (from `./versioned/sdk49/ExpoSMS`)
+ - ABI49_0_0ExpoSpeech (from `./versioned/sdk49/ExpoSpeech`)
+ - ABI49_0_0ExpoSQLite (from `./versioned/sdk49/ExpoSQLite`)
+ - ABI49_0_0ExpoStoreReview (from `./versioned/sdk49/ExpoStoreReview`)
+ - ABI49_0_0ExpoSystemUI (from `./versioned/sdk49/ExpoSystemUI`)
+ - ABI49_0_0ExpoTrackingTransparency (from `./versioned/sdk49/ExpoTrackingTransparency`)
+ - ABI49_0_0ExpoVideoThumbnails (from `./versioned/sdk49/ExpoVideoThumbnails`)
+ - ABI49_0_0ExpoWebBrowser (from `./versioned/sdk49/ExpoWebBrowser`)
+ - ABI49_0_0EXScreenCapture (from `./versioned/sdk49/EXScreenCapture`)
+ - ABI49_0_0EXSensors (from `./versioned/sdk49/EXSensors`)
+ - ABI49_0_0EXSplashScreen (from `./versioned/sdk49/EXSplashScreen`)
+ - ABI49_0_0EXStructuredHeaders (from `./versioned/sdk49/EXStructuredHeaders`)
+ - ABI49_0_0EXTaskManager (from `./versioned/sdk49/EXTaskManager`)
+ - ABI49_0_0EXUpdates (from `./versioned/sdk49/EXUpdates`)
+ - ABI49_0_0EXUpdatesInterface (from `./versioned/sdk49/EXUpdatesInterface`)
+ - ABI49_0_0FBLazyVector (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/FBLazyVector`)
+ - ABI49_0_0FBReactNativeSpec (from `./versioned-react-native/ABI49_0_0/ReactNative/React/FBReactNativeSpec`)
+ - ABI49_0_0hermes-engine (from `./versioned-react-native/ABI49_0_0/ReactNative/sdks/hermes-engine/ABI49_0_0hermes-engine.podspec`)
+ - ABI49_0_0lottie-react-native (from `./vendored/sdk49/lottie-react-native`)
+ - ABI49_0_0RCTRequired (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/RCTRequired`)
+ - ABI49_0_0RCTTypeSafety (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/TypeSafety`)
+ - ABI49_0_0React (from `./versioned-react-native/ABI49_0_0/ReactNative/`)
+ - ABI49_0_0React-callinvoker (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/callinvoker`)
+ - ABI49_0_0React-Codegen (from `versioned-react-native/ABI49_0_0/ReactNative/codegen/ios`)
+ - ABI49_0_0React-Core (from `./versioned-react-native/ABI49_0_0/ReactNative/`)
+ - ABI49_0_0React-Core/RCTWebSocket (from `./versioned-react-native/ABI49_0_0/ReactNative/`)
+ - ABI49_0_0React-CoreModules (from `./versioned-react-native/ABI49_0_0/ReactNative/React/CoreModules`)
+ - ABI49_0_0React-cxxreact (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/cxxreact`)
+ - ABI49_0_0React-debug (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/react/debug`)
+ - ABI49_0_0React-hermes (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/hermes`)
+ - ABI49_0_0React-jsc (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/jsc`)
+ - ABI49_0_0React-jsi (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/jsi`)
+ - ABI49_0_0React-jsiexecutor (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/jsiexecutor`)
+ - ABI49_0_0React-jsinspector (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/jsinspector`)
+ - ABI49_0_0React-logger (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/logger`)
+ - "ABI49_0_0react-native-netinfo (from `./vendored/sdk49/@react-native-community/netinfo`)"
+ - ABI49_0_0react-native-pager-view (from `./vendored/sdk49/react-native-pager-view`)
+ - ABI49_0_0react-native-safe-area-context (from `./vendored/sdk49/react-native-safe-area-context`)
+ - "ABI49_0_0react-native-segmented-control (from `./vendored/sdk49/@react-native-segmented-control/segmented-control`)"
+ - "ABI49_0_0react-native-skia (from `./vendored/sdk49/@shopify/react-native-skia`)"
+ - "ABI49_0_0react-native-slider (from `./vendored/sdk49/@react-native-community/slider`)"
+ - ABI49_0_0react-native-webview (from `./vendored/sdk49/react-native-webview`)
+ - ABI49_0_0React-NativeModulesApple (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/react/nativemodule/core/platform/ios`)
+ - ABI49_0_0React-perflogger (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/reactperflogger`)
+ - ABI49_0_0React-RCTActionSheet (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/ActionSheetIOS`)
+ - ABI49_0_0React-RCTAnimation (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/NativeAnimation`)
+ - ABI49_0_0React-RCTAppDelegate (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/AppDelegate`)
+ - ABI49_0_0React-RCTBlob (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Blob`)
+ - ABI49_0_0React-RCTImage (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Image`)
+ - ABI49_0_0React-RCTLinking (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/LinkingIOS`)
+ - ABI49_0_0React-RCTNetwork (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Network`)
+ - ABI49_0_0React-RCTSettings (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Settings`)
+ - ABI49_0_0React-RCTText (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Text`)
+ - ABI49_0_0React-RCTVibration (from `./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Vibration`)
+ - ABI49_0_0React-rncore (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon`)
+ - ABI49_0_0React-runtimeexecutor (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/runtimeexecutor`)
+ - ABI49_0_0React-runtimescheduler (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/react/renderer/runtimescheduler`)
+ - ABI49_0_0React-utils (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/react/utils`)
+ - ABI49_0_0ReactCommon/turbomodule/core (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon`)
+ - "ABI49_0_0RNCAsyncStorage (from `./vendored/sdk49/@react-native-async-storage/async-storage`)"
+ - "ABI49_0_0RNFlashList (from `./vendored/sdk49/@shopify/flash-list`)"
+ - ABI49_0_0RNGestureHandler (from `./vendored/sdk49/react-native-gesture-handler`)
+ - ABI49_0_0RNReanimated (from `./vendored/sdk49/react-native-reanimated`)
+ - ABI49_0_0RNScreens (from `./vendored/sdk49/react-native-screens`)
+ - ABI49_0_0RNSVG (from `./vendored/sdk49/react-native-svg`)
+ - "ABI49_0_0stripe-react-native (from `./vendored/sdk49/@stripe/stripe-react-native`)"
+ - ABI49_0_0UMAppLoader (from `./versioned/sdk49/UMAppLoader`)
+ - ABI49_0_0Yoga (from `./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/yoga`)
- boost (from `../react-native-lab/react-native/packages/react-native/third-party-podspecs/boost.podspec`)
- CocoaLumberjack (~> 3.5.3)
- DoubleConversion (from `../react-native-lab/react-native/packages/react-native/third-party-podspecs/DoubleConversion.podspec`)
@@ -3165,6 +4064,239 @@ EXTERNAL SOURCES:
:path: "./versioned/sdk48/UMAppLoader"
ABI48_0_0Yoga:
:path: "./versioned-react-native/ABI48_0_0/ReactNative/ReactCommon/yoga"
+ ABI49_0_0EASClient:
+ :path: "./versioned/sdk49/EASClient"
+ ABI49_0_0EXApplication:
+ :path: "./versioned/sdk49/EXApplication"
+ ABI49_0_0EXAV:
+ :path: "./versioned/sdk49/EXAV"
+ ABI49_0_0EXBackgroundFetch:
+ :path: "./versioned/sdk49/EXBackgroundFetch"
+ ABI49_0_0EXBarCodeScanner:
+ :path: "./versioned/sdk49/EXBarCodeScanner"
+ ABI49_0_0EXCalendar:
+ :path: "./versioned/sdk49/EXCalendar"
+ ABI49_0_0EXCamera:
+ :path: "./versioned/sdk49/EXCamera"
+ ABI49_0_0EXConstants:
+ :path: "./versioned/sdk49/EXConstants"
+ ABI49_0_0EXContacts:
+ :path: "./versioned/sdk49/EXContacts"
+ ABI49_0_0EXFileSystem:
+ :path: "./versioned/sdk49/EXFileSystem"
+ ABI49_0_0EXFont:
+ :path: "./versioned/sdk49/EXFont"
+ ABI49_0_0EXImageLoader:
+ :path: "./versioned/sdk49/EXImageLoader"
+ ABI49_0_0EXJSONUtils:
+ :path: "./versioned/sdk49/EXJSONUtils"
+ ABI49_0_0EXLocation:
+ :path: "./versioned/sdk49/EXLocation"
+ ABI49_0_0EXManifests:
+ :path: "./versioned/sdk49/EXManifests"
+ ABI49_0_0EXMediaLibrary:
+ :path: "./versioned/sdk49/EXMediaLibrary"
+ ABI49_0_0EXNotifications:
+ :path: "./versioned/sdk49/EXNotifications"
+ ABI49_0_0EXPermissions:
+ :path: "./versioned/sdk49/EXPermissions"
+ ABI49_0_0Expo:
+ :path: "./versioned/sdk49/Expo"
+ ABI49_0_0ExpoAppleAuthentication:
+ :path: "./versioned/sdk49/ExpoAppleAuthentication"
+ ABI49_0_0ExpoBattery:
+ :path: "./versioned/sdk49/ExpoBattery"
+ ABI49_0_0ExpoBlur:
+ :path: "./versioned/sdk49/ExpoBlur"
+ ABI49_0_0ExpoBrightness:
+ :path: "./versioned/sdk49/ExpoBrightness"
+ ABI49_0_0ExpoCellular:
+ :path: "./versioned/sdk49/ExpoCellular"
+ ABI49_0_0ExpoClipboard:
+ :path: "./versioned/sdk49/ExpoClipboard"
+ ABI49_0_0ExpoCrypto:
+ :path: "./versioned/sdk49/ExpoCrypto"
+ ABI49_0_0ExpoDevice:
+ :path: "./versioned/sdk49/ExpoDevice"
+ ABI49_0_0ExpoDocumentPicker:
+ :path: "./versioned/sdk49/ExpoDocumentPicker"
+ ABI49_0_0ExpoGL:
+ :path: "./versioned/sdk49/ExpoGL"
+ ABI49_0_0ExpoHaptics:
+ :path: "./versioned/sdk49/ExpoHaptics"
+ ABI49_0_0ExpoImage:
+ :path: "./versioned/sdk49/ExpoImage"
+ ABI49_0_0ExpoImageManipulator:
+ :path: "./versioned/sdk49/ExpoImageManipulator"
+ ABI49_0_0ExpoImagePicker:
+ :path: "./versioned/sdk49/ExpoImagePicker"
+ ABI49_0_0ExpoInsights:
+ :path: "./versioned/sdk49/ExpoInsights"
+ ABI49_0_0ExpoKeepAwake:
+ :path: "./versioned/sdk49/ExpoKeepAwake"
+ ABI49_0_0ExpoKit:
+ :path: "./versioned-react-native/ABI49_0_0/Expo/ExpoKit"
+ ABI49_0_0ExpoLinearGradient:
+ :path: "./versioned/sdk49/ExpoLinearGradient"
+ ABI49_0_0ExpoLocalAuthentication:
+ :path: "./versioned/sdk49/ExpoLocalAuthentication"
+ ABI49_0_0ExpoLocalization:
+ :path: "./versioned/sdk49/ExpoLocalization"
+ ABI49_0_0ExpoMailComposer:
+ :path: "./versioned/sdk49/ExpoMailComposer"
+ ABI49_0_0ExpoMaps:
+ :path: "./versioned/sdk49/ExpoMaps"
+ ABI49_0_0ExpoModulesCore:
+ :path: "./versioned/sdk49/ExpoModulesCore"
+ ABI49_0_0ExpoModulesProvider:
+ :path: "./versioned/sdk49/ExpoModulesProvider"
+ ABI49_0_0ExpoNetwork:
+ :path: "./versioned/sdk49/ExpoNetwork"
+ ABI49_0_0ExpoPrint:
+ :path: "./versioned/sdk49/ExpoPrint"
+ ABI49_0_0ExpoRandom:
+ :path: "./versioned/sdk49/ExpoRandom"
+ ABI49_0_0ExpoScreenOrientation:
+ :path: "./versioned/sdk49/ExpoScreenOrientation"
+ ABI49_0_0ExpoSecureStore:
+ :path: "./versioned/sdk49/ExpoSecureStore"
+ ABI49_0_0ExpoSharing:
+ :path: "./versioned/sdk49/ExpoSharing"
+ ABI49_0_0ExpoSMS:
+ :path: "./versioned/sdk49/ExpoSMS"
+ ABI49_0_0ExpoSpeech:
+ :path: "./versioned/sdk49/ExpoSpeech"
+ ABI49_0_0ExpoSQLite:
+ :path: "./versioned/sdk49/ExpoSQLite"
+ ABI49_0_0ExpoStoreReview:
+ :path: "./versioned/sdk49/ExpoStoreReview"
+ ABI49_0_0ExpoSystemUI:
+ :path: "./versioned/sdk49/ExpoSystemUI"
+ ABI49_0_0ExpoTrackingTransparency:
+ :path: "./versioned/sdk49/ExpoTrackingTransparency"
+ ABI49_0_0ExpoVideoThumbnails:
+ :path: "./versioned/sdk49/ExpoVideoThumbnails"
+ ABI49_0_0ExpoWebBrowser:
+ :path: "./versioned/sdk49/ExpoWebBrowser"
+ ABI49_0_0EXScreenCapture:
+ :path: "./versioned/sdk49/EXScreenCapture"
+ ABI49_0_0EXSensors:
+ :path: "./versioned/sdk49/EXSensors"
+ ABI49_0_0EXSplashScreen:
+ :path: "./versioned/sdk49/EXSplashScreen"
+ ABI49_0_0EXStructuredHeaders:
+ :path: "./versioned/sdk49/EXStructuredHeaders"
+ ABI49_0_0EXTaskManager:
+ :path: "./versioned/sdk49/EXTaskManager"
+ ABI49_0_0EXUpdates:
+ :path: "./versioned/sdk49/EXUpdates"
+ ABI49_0_0EXUpdatesInterface:
+ :path: "./versioned/sdk49/EXUpdatesInterface"
+ ABI49_0_0FBLazyVector:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/FBLazyVector"
+ ABI49_0_0FBReactNativeSpec:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/React/FBReactNativeSpec"
+ ABI49_0_0hermes-engine:
+ :podspec: "./versioned-react-native/ABI49_0_0/ReactNative/sdks/hermes-engine/ABI49_0_0hermes-engine.podspec"
+ :tag: hermes-2023-03-20-RNv0.72.0-49794cfc7c81fb8f69fd60c3bbf85a7480cc5a77
+ ABI49_0_0lottie-react-native:
+ :path: "./vendored/sdk49/lottie-react-native"
+ ABI49_0_0RCTRequired:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/RCTRequired"
+ ABI49_0_0RCTTypeSafety:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/TypeSafety"
+ ABI49_0_0React:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/"
+ ABI49_0_0React-callinvoker:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/callinvoker"
+ ABI49_0_0React-Codegen:
+ :path: versioned-react-native/ABI49_0_0/ReactNative/codegen/ios
+ ABI49_0_0React-Core:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/"
+ ABI49_0_0React-CoreModules:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/React/CoreModules"
+ ABI49_0_0React-cxxreact:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/cxxreact"
+ ABI49_0_0React-debug:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/react/debug"
+ ABI49_0_0React-hermes:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/hermes"
+ ABI49_0_0React-jsc:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/jsc"
+ ABI49_0_0React-jsi:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/jsi"
+ ABI49_0_0React-jsiexecutor:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/jsiexecutor"
+ ABI49_0_0React-jsinspector:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/jsinspector"
+ ABI49_0_0React-logger:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/logger"
+ ABI49_0_0react-native-netinfo:
+ :path: "./vendored/sdk49/@react-native-community/netinfo"
+ ABI49_0_0react-native-pager-view:
+ :path: "./vendored/sdk49/react-native-pager-view"
+ ABI49_0_0react-native-safe-area-context:
+ :path: "./vendored/sdk49/react-native-safe-area-context"
+ ABI49_0_0react-native-segmented-control:
+ :path: "./vendored/sdk49/@react-native-segmented-control/segmented-control"
+ ABI49_0_0react-native-skia:
+ :path: "./vendored/sdk49/@shopify/react-native-skia"
+ ABI49_0_0react-native-slider:
+ :path: "./vendored/sdk49/@react-native-community/slider"
+ ABI49_0_0react-native-webview:
+ :path: "./vendored/sdk49/react-native-webview"
+ ABI49_0_0React-NativeModulesApple:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/react/nativemodule/core/platform/ios"
+ ABI49_0_0React-perflogger:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/reactperflogger"
+ ABI49_0_0React-RCTActionSheet:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/ActionSheetIOS"
+ ABI49_0_0React-RCTAnimation:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/NativeAnimation"
+ ABI49_0_0React-RCTAppDelegate:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/AppDelegate"
+ ABI49_0_0React-RCTBlob:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Blob"
+ ABI49_0_0React-RCTImage:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Image"
+ ABI49_0_0React-RCTLinking:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/LinkingIOS"
+ ABI49_0_0React-RCTNetwork:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Network"
+ ABI49_0_0React-RCTSettings:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Settings"
+ ABI49_0_0React-RCTText:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Text"
+ ABI49_0_0React-RCTVibration:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/Libraries/Vibration"
+ ABI49_0_0React-rncore:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon"
+ ABI49_0_0React-runtimeexecutor:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/runtimeexecutor"
+ ABI49_0_0React-runtimescheduler:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/react/renderer/runtimescheduler"
+ ABI49_0_0React-utils:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/react/utils"
+ ABI49_0_0ReactCommon:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon"
+ ABI49_0_0RNCAsyncStorage:
+ :path: "./vendored/sdk49/@react-native-async-storage/async-storage"
+ ABI49_0_0RNFlashList:
+ :path: "./vendored/sdk49/@shopify/flash-list"
+ ABI49_0_0RNGestureHandler:
+ :path: "./vendored/sdk49/react-native-gesture-handler"
+ ABI49_0_0RNReanimated:
+ :path: "./vendored/sdk49/react-native-reanimated"
+ ABI49_0_0RNScreens:
+ :path: "./vendored/sdk49/react-native-screens"
+ ABI49_0_0RNSVG:
+ :path: "./vendored/sdk49/react-native-svg"
+ ABI49_0_0stripe-react-native:
+ :path: "./vendored/sdk49/@stripe/stripe-react-native"
+ ABI49_0_0UMAppLoader:
+ :path: "./versioned/sdk49/UMAppLoader"
+ ABI49_0_0Yoga:
+ :path: "./versioned-react-native/ABI49_0_0/ReactNative/ReactCommon/yoga"
boost:
:podspec: "../react-native-lab/react-native/packages/react-native/third-party-podspecs/boost.podspec"
DoubleConversion:
@@ -3634,6 +4766,122 @@ SPEC CHECKSUMS:
ABI48_0_0stripe-react-native: a00d60443b6abb729be0e345085d902c62b8c7c7
ABI48_0_0UMAppLoader: 142596799d5a7b05119ae9f5c4e51ccc590e49a5
ABI48_0_0Yoga: 13a232e4a5d1ecd44a45e050b5983aa20116b1fa
+ ABI49_0_0EASClient: fe7fd428ad08f6c8943aba691c0f51969473668a
+ ABI49_0_0EXApplication: 8116c121dd9d81fdefe7e3934d7916a27c1690ff
+ ABI49_0_0EXAV: dbf0a7e97b41d266cd735ba0ae951176f024131c
+ ABI49_0_0EXBackgroundFetch: 8a2886646eb5c69eb9ede716bbdfb0fa4e2fc14d
+ ABI49_0_0EXBarCodeScanner: 94ff10b8b5dde67bf409069478262f1bed4a38db
+ ABI49_0_0EXCalendar: 42c8259c6885d0e46d16fc4768aab7fa95ba2db2
+ ABI49_0_0EXCamera: 093bd99e109c3e467bee50ca0ee9dd34b7cac606
+ ABI49_0_0EXConstants: 36a261ee28f0871a7d45c564230cf3c16d60ebe5
+ ABI49_0_0EXContacts: 6a03fe647efdc5a510d51beed2fd2040b8b14418
+ ABI49_0_0EXFileSystem: 040cf2e6e8490651803b0fabc5e41180348d5071
+ ABI49_0_0EXFont: 631c61b2fb1a6ef00d52e9bb03084f2abb47b584
+ ABI49_0_0EXImageLoader: 771646d4d64e023d7d7be6bd51975b89969f9463
+ ABI49_0_0EXJSONUtils: c0c9b2dfea48bf2eb9cb6b7f9ada46b92827cee6
+ ABI49_0_0EXLocation: f06263c8c87c0c1c6ee96f514783b521eff7fd48
+ ABI49_0_0EXManifests: bc9779ebf4cd8b9330e3a9721dfb44ddf2697faf
+ ABI49_0_0EXMediaLibrary: 0e0e244712394523c90e1bda78127d8c76814434
+ ABI49_0_0EXNotifications: b8a6fdc20a5c93452177fb980d07d8c1ca73138c
+ ABI49_0_0EXPermissions: f43bc5235e58a3bc698d3fadd6aa1ecb27020b05
+ ABI49_0_0Expo: b71ccedd80113fe654059abb8a0cf99a2646c7a8
+ ABI49_0_0ExpoAppleAuthentication: af85867e111a296a561ddf9d3f659728ee8675d0
+ ABI49_0_0ExpoBattery: 9417f9897691a8af49a93047d99b27c2c6c13528
+ ABI49_0_0ExpoBlur: 9293857092c742630ef6dadbbd6378c0965cb317
+ ABI49_0_0ExpoBrightness: 677811228026d1b1501a07ff6545088653f302af
+ ABI49_0_0ExpoCellular: 0048fe93bab1fdc66bd29f449fd18100af1accf3
+ ABI49_0_0ExpoClipboard: 747f8f82ae81b1eac290d184be655f413b8ef32f
+ ABI49_0_0ExpoCrypto: d47a617ee810ceb882138695a989d7c261adb697
+ ABI49_0_0ExpoDevice: 4e1020d90c2f4d2e80a01664bc116d1cc2823916
+ ABI49_0_0ExpoDocumentPicker: 4c1da15f7f6e7a799601f1d2f5669cb614e7e9c2
+ ABI49_0_0ExpoGL: b028bbfbd54e10efc9e768891bb0d23f400f366a
+ ABI49_0_0ExpoHaptics: 83ad7550f581abf75c5df4d7ff9c6a9731eb25cf
+ ABI49_0_0ExpoImage: e38dda9f50fdf16c43508e9204cf50862cc5f071
+ ABI49_0_0ExpoImageManipulator: 62a8f6a9004f916d4973c084ef84fc306472a3e5
+ ABI49_0_0ExpoImagePicker: 8355e9cf4fdc820f8cfa26add2a423dbd49d70cc
+ ABI49_0_0ExpoInsights: d4433e3114fc7fd01edbc82aa8cb72c0e346f40d
+ ABI49_0_0ExpoKeepAwake: 5508e162548e92d0087811d63218030135ad45e0
+ ABI49_0_0ExpoKit: fa5acd90ed671ccf3fa62fc70ae8b8a8502041ce
+ ABI49_0_0ExpoLinearGradient: 98f9ba2f1b8bf7cc3974c1681114d58a2c07341f
+ ABI49_0_0ExpoLocalAuthentication: fbc31ba5781a6b74fe8cd4f4dbbac4200ff8b076
+ ABI49_0_0ExpoLocalization: ecce53a514e89c84e43ce3ed9fe38bf30258c99b
+ ABI49_0_0ExpoMailComposer: b1dd9ee7d3a2b39caf0f1b09639c1c1cf81b83f1
+ ABI49_0_0ExpoMaps: 7cc06946d213504242f1c1499d8238b16ce87bba
+ ABI49_0_0ExpoModulesCore: 4f3ca2d3439d9c6293a036f0f731d858a3c100bf
+ ABI49_0_0ExpoModulesProvider: 6d5f656e0e7f821ae6aae15fd02290c88c45feab
+ ABI49_0_0ExpoNetwork: 028f02f5d15379f89e529b37982559e445f86ab9
+ ABI49_0_0ExpoPrint: 33aeee5e8b7464c77657b2c59218c9ea9542554c
+ ABI49_0_0ExpoRandom: 83829ccecffd4afbdd4f711e053639e2109df0b6
+ ABI49_0_0ExpoScreenOrientation: 246531771c12e546098bfbac9fb44b0efc174830
+ ABI49_0_0ExpoSecureStore: 05b26374e173878efda9267822d64825c80f652e
+ ABI49_0_0ExpoSharing: e915ee89f06fe8f6985bf35a5a854c44612f34d5
+ ABI49_0_0ExpoSMS: 78e004b964755de5f25d07c5ad1aa09d968723ad
+ ABI49_0_0ExpoSpeech: cdc61936c53133d5efcdf9a577b80b76adc50d6b
+ ABI49_0_0ExpoSQLite: 53bca4622c4f6802d0aa3bdac5c4e3d7d68392d3
+ ABI49_0_0ExpoStoreReview: 253235113192a9533b220db819c8d4729b1e0bb8
+ ABI49_0_0ExpoSystemUI: 3fa0ef7f526daf0573327b71875bbe2c3f6c3964
+ ABI49_0_0ExpoTrackingTransparency: db73cb689d229a16b7890587c21c3de671598a8c
+ ABI49_0_0ExpoVideoThumbnails: 15e99e3eff07377e32571b9f3b084dd2a2b247bb
+ ABI49_0_0ExpoWebBrowser: 00d2dde6a6f8fd5f3d4a0942d9339dc2fb7a7951
+ ABI49_0_0EXScreenCapture: a7ab857612afc05ed6afc38392419b9d294657e2
+ ABI49_0_0EXSensors: 4c37482982146379d1a7f938016300bf00cf3bc7
+ ABI49_0_0EXSplashScreen: e9cbc26b21adcae70de37a4ae4d1b605a618fd8e
+ ABI49_0_0EXStructuredHeaders: 4ee9ec5877830424029b38da1b623958df0bf027
+ ABI49_0_0EXTaskManager: bfc7ebf5791266566ffe26bf1dd2cf96efbbc92c
+ ABI49_0_0EXUpdates: 4e3bd4d1f05516a5fd9b5536dff81ebe0468e9c3
+ ABI49_0_0EXUpdatesInterface: 062955a2318e142b8bcd8a1f870a951e6a9233f1
+ ABI49_0_0FBLazyVector: c6f91103acf736b8a2be8216fbdb98c23db04df2
+ ABI49_0_0FBReactNativeSpec: 3d417407dc9771eb6843f8e08e1e82b541e7c339
+ ABI49_0_0hermes-engine: 88a62d3733128b974a5fabfab09ce2b341d5f7bd
+ ABI49_0_0lottie-react-native: 77a9609fed173aeb15d251691b32f9e8413c4e2a
+ ABI49_0_0RCTRequired: 29363ea7dbfd130132ca62fb45e351130e006cfc
+ ABI49_0_0RCTTypeSafety: 3898adf76998a6ed385039579356d3c38f81bd55
+ ABI49_0_0React: babdf533f2c273bbd58d91e7e685552b5e172542
+ ABI49_0_0React-callinvoker: d75f3144439a2acc7db4261053b12c18950f7e27
+ ABI49_0_0React-Codegen: f8ed8f7517ddaf4284736d98cba574953e4385a1
+ ABI49_0_0React-Core: 83090797572aef89d005314fe97b51967dc78554
+ ABI49_0_0React-CoreModules: ca6b573746beadeb6ac670bcb506ca7195c5b7f0
+ ABI49_0_0React-cxxreact: 33151ae3f0eeb54d5180ecb007d941e14536fd89
+ ABI49_0_0React-debug: 3b31bfc61374b6279c5869f423729c787024ddd4
+ ABI49_0_0React-hermes: 3f54634ce16e3c739175da4237f2b46c42ba5d5e
+ ABI49_0_0React-jsc: 25f4286249ae07c741479d1cf11f6850bc4f174b
+ ABI49_0_0React-jsi: 2ec357ef5809d3b4d617427bbf6bed56bc6d8338
+ ABI49_0_0React-jsiexecutor: 0a47352eeffecea1848a9fae616e37592a3aec8b
+ ABI49_0_0React-jsinspector: 6e502cf4a2188f41e27fb3284557cdcd05f7eb15
+ ABI49_0_0React-logger: 4c50297fe17074bc46e413a6b6094aabbfba824f
+ ABI49_0_0react-native-netinfo: fb732b7d0858a07b01d1067decbc94cdeb24ee17
+ ABI49_0_0react-native-pager-view: 3085538cedbfd658da66107d636e09a6fa713574
+ ABI49_0_0react-native-safe-area-context: 485f2482d15324f6570466b190bf4d8034ebb314
+ ABI49_0_0react-native-segmented-control: af3039721178c2e16ba6ad97a519c3381bdd3436
+ ABI49_0_0react-native-skia: 5328891d4643494f8843a350be24b105e5c6faea
+ ABI49_0_0react-native-slider: f3d7912b17549c80ede3b9bc576446a63f4ce9bf
+ ABI49_0_0react-native-webview: b1f4262ca5ded7143d619044d8fa589c3781cbe4
+ ABI49_0_0React-NativeModulesApple: da1d30c9519eab1755b6d05fd692c5d697e197a0
+ ABI49_0_0React-perflogger: add611a90221da1ecda5d5a6a65c13500d5e9dd8
+ ABI49_0_0React-RCTActionSheet: da97a1280be3e35573a276fe1d4f188fb77c9bc8
+ ABI49_0_0React-RCTAnimation: 6586680a606cca3ea11d76459cc6f0a32e7dff2c
+ ABI49_0_0React-RCTAppDelegate: 8141bd89e119d13493519e7e24f589d626f975e0
+ ABI49_0_0React-RCTBlob: 901588020714af236fc87b500d3322a03fc90665
+ ABI49_0_0React-RCTImage: b9e304e3b23329fab2c987ef2227d00cbeb83aae
+ ABI49_0_0React-RCTLinking: 4fa2c03020fcb7ea5023a57a22f92c9505543fc8
+ ABI49_0_0React-RCTNetwork: e74e6e839ba4f456f77cd14dc6174c874c659c84
+ ABI49_0_0React-RCTSettings: 2f58c38d55f84738574eef3226389638d00a1d58
+ ABI49_0_0React-RCTText: e468b86b149a1c0ea8d1c512afe38e2b2ead1130
+ ABI49_0_0React-RCTVibration: c36f0584fc03546dc426ab12a4b2fb96e13c8375
+ ABI49_0_0React-rncore: 0561aef24c25408c38e5bb750e4111f565b973a5
+ ABI49_0_0React-runtimeexecutor: 89f3435b415773497356c753b66a6816d165badf
+ ABI49_0_0React-runtimescheduler: b4e292b1ee8349a292d53131b7bb6b689d12bb13
+ ABI49_0_0React-utils: a9dafbb49740096ece1c00d46072699d573b86de
+ ABI49_0_0ReactCommon: 8e037801e5ba73c0473dde44021e45b1c0a76133
+ ABI49_0_0RNCAsyncStorage: 4ccbaf069f0b43bb24c95ca142bbe546ad62723e
+ ABI49_0_0RNFlashList: 15691426874b01c93689c59d966367c72f694289
+ ABI49_0_0RNGestureHandler: 547299a2d5c52c0763a5392498703ea03f4dea80
+ ABI49_0_0RNReanimated: ecbeb49a42b6576780667bc65c92dcc39266d0c2
+ ABI49_0_0RNScreens: d9e21225e233ffab4a7ca714b99c47785138496b
+ ABI49_0_0RNSVG: 1a17f10c292d04ac93f87225ccea0f37d5b752b9
+ ABI49_0_0stripe-react-native: 4e90f1d4986fbf6ae32e156e943567fe98e6c1aa
+ ABI49_0_0UMAppLoader: 6135d300ad0d5808ca7dacdfce31c4b7eac3d0d3
+ ABI49_0_0Yoga: 6d6e97f57a8c97488f10f2820a9f6111d354dc9e
Analytics: 9655e0e1c71ea98107cfcb2b14891168acc6c6c9
AppAuth: 3bb1d1cd9340bd09f5ed189fb00b1cc28e1e8570
ASN1Decoder: 6110fdeacfdb41559b1481457a1645be716610aa
@@ -3778,7 +5026,7 @@ SPEC CHECKSUMS:
React-RCTSettings: 6220b53ee0446c732f0a74293339eb63d2d6da29
React-RCTText: f5b4c03708c0283699c0dc23c7fb9f97ce7ac6bd
React-RCTVibration: b1c73ae63a7de51a42820c146758c50e445bde48
- React-rncore: 23231b6c473ee3d0afe1adbaa85aa14f03e975c5
+ React-rncore: 683bb4ec90d60a150f85f681e970296b0639c136
React-runtimeexecutor: 56b9f7665138fe8cda0d6c210cf95ee3f625c237
React-runtimescheduler: 24614bcd31643eacb06c78c0b9101b453d6aac47
React-utils: c12d2e75c8bbc727939ddc4319ed95493395ed5a
diff --git a/ios/vendored/sdk49/@react-native-async-storage/async-storage/ABI49_0_0RNCAsyncStorage.podspec.json b/ios/vendored/sdk49/@react-native-async-storage/async-storage/ABI49_0_0RNCAsyncStorage.podspec.json
new file mode 100644
index 00000000000000..6abacf57c5c81a
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-async-storage/async-storage/ABI49_0_0RNCAsyncStorage.podspec.json
@@ -0,0 +1,21 @@
+{
+ "name": "ABI49_0_0RNCAsyncStorage",
+ "version": "1.18.2",
+ "summary": "Asynchronous, persistent, key-value storage system for ABI49_0_0React Native.",
+ "license": "MIT",
+ "authors": "Krzysztof Borowy ",
+ "homepage": "https://github.com/react-native-async-storage/async-storage#readme",
+ "platforms": {
+ "ios": "9.0",
+ "tvos": "9.2",
+ "osx": "10.14"
+ },
+ "source": {
+ "git": "https://github.com/react-native-async-storage/async-storage.git",
+ "tag": "v1.18.2"
+ },
+ "source_files": "ios/**/*.{h,m}",
+ "dependencies": {
+ "ABI49_0_0React-Core": []
+ }
+}
diff --git a/ios/vendored/sdk49/@react-native-async-storage/async-storage/ios/ABI49_0_0RNCAsyncStorage.h b/ios/vendored/sdk49/@react-native-async-storage/async-storage/ios/ABI49_0_0RNCAsyncStorage.h
new file mode 100644
index 00000000000000..3d48a58af10da8
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-async-storage/async-storage/ios/ABI49_0_0RNCAsyncStorage.h
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+
+#import
+#import
+
+#import "ABI49_0_0RNCAsyncStorageDelegate.h"
+
+/**
+ * A simple, asynchronous, persistent, key-value storage system designed as a
+ * backend to the AsyncStorage JS module, which is modeled after LocalStorage.
+ *
+ * Current implementation stores small values in serialized dictionary and
+ * larger values in separate files. Since we use a serial file queue
+ * `RKFileQueue`, reading/writing from multiple threads should be perceived as
+ * being atomic, unless someone bypasses the `ABI49_0_0RNCAsyncStorage` API.
+ *
+ * Keys and values must always be strings or an error is returned.
+ */
+@interface ABI49_0_0RNCAsyncStorage : NSObject
+
+@property (nonatomic, weak, nullable) id delegate;
+
+@property (nonatomic, assign) BOOL clearOnInvalidate;
+
+@property (nonatomic, readonly, getter=isValid) BOOL valid;
+
+// NOTE(nikki): Added to allow scoped per Expo app
+- (instancetype)initWithStorageDirectory:(NSString *)storageDirectory;
+
+// Clear the ABI49_0_0RNCAsyncStorage data from native code
+- (void)clearAllData;
+
+// Grab data from the cache. ResponseBlock result array will have an error at position 0, and an
+// array of arrays at position 1.
+- (void)multiGet:(NSArray *)keys callback:(ABI49_0_0RCTResponseSenderBlock)callback;
+
+// Add multiple key value pairs to the cache.
+- (void)multiSet:(NSArray *> *)kvPairs
+ callback:(ABI49_0_0RCTResponseSenderBlock)callback;
+
+// Interface for natively fetching all the keys from the storage data.
+- (void)getAllKeys:(ABI49_0_0RCTResponseSenderBlock)callback;
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-async-storage/async-storage/ios/ABI49_0_0RNCAsyncStorage.m b/ios/vendored/sdk49/@react-native-async-storage/async-storage/ios/ABI49_0_0RNCAsyncStorage.m
new file mode 100644
index 00000000000000..83d3fbd1a69ff9
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-async-storage/async-storage/ios/ABI49_0_0RNCAsyncStorage.m
@@ -0,0 +1,857 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "ABI49_0_0RNCAsyncStorage.h"
+
+#import
+#import
+
+#import
+#import
+#import
+
+// NOTE(kudo): Use Expo storage directory for backward compatibility
+//static NSString *const ABI49_0_0RCTStorageDirectory = @"ABI49_0_0RCTAsyncLocalStorage_V1";
+static NSString *const ABI49_0_0RCTStorageDirectory = @"ABI49_0_0RCTAsyncLocalStorage";
+static NSString *const ABI49_0_0RCTOldStorageDirectory = @"ABI49_0_0RNCAsyncLocalStorage_V1";
+static NSString *const ABI49_0_0RCTExpoStorageDirectory = @"ABI49_0_0RCTAsyncLocalStorage";
+static NSString *const ABI49_0_0RCTManifestFileName = @"manifest.json";
+static const NSUInteger ABI49_0_0RCTInlineValueThreshold = 1024;
+
+#pragma mark - Static helper functions
+
+static NSDictionary *ABI49_0_0RCTErrorForKey(NSString *key)
+{
+ if (![key isKindOfClass:[NSString class]]) {
+ return ABI49_0_0RCTMakeAndLogError(@"Invalid key - must be a string. Key: ", key, @{@"key": key});
+ } else if (key.length < 1) {
+ return ABI49_0_0RCTMakeAndLogError(
+ @"Invalid key - must be at least one character. Key: ", key, @{@"key": key});
+ } else {
+ return nil;
+ }
+}
+
+static BOOL ABI49_0_0RCTAsyncStorageSetExcludedFromBackup(NSString *path, NSNumber *isExcluded)
+{
+ NSFileManager *fileManager = [[NSFileManager alloc] init];
+
+ BOOL isDir;
+ BOOL exists = [fileManager fileExistsAtPath:path isDirectory:&isDir];
+ BOOL success = false;
+
+ if (isDir && exists) {
+ NSURL *pathUrl = [NSURL fileURLWithPath:path];
+ NSError *error = nil;
+ success = [pathUrl setResourceValue:isExcluded
+ forKey:NSURLIsExcludedFromBackupKey
+ error:&error];
+
+ if (!success) {
+ NSLog(@"Could not exclude AsyncStorage dir from backup %@", error);
+ }
+ }
+ return success;
+}
+
+static void ABI49_0_0RCTAppendError(NSDictionary *error, NSMutableArray **errors)
+{
+ if (error && errors) {
+ if (!*errors) {
+ *errors = [NSMutableArray new];
+ }
+ [*errors addObject:error];
+ }
+}
+
+static NSArray *ABI49_0_0RCTMakeErrors(NSArray> *results)
+{
+ NSMutableArray *errors;
+ for (id object in results) {
+ if ([object isKindOfClass:[NSError class]]) {
+ NSError *error = (NSError *)object;
+ NSDictionary *keyError = ABI49_0_0RCTMakeError(error.localizedDescription, error, nil);
+ ABI49_0_0RCTAppendError(keyError, &errors);
+ }
+ }
+ return errors;
+}
+
+static NSString *ABI49_0_0RCTReadFile(NSString *filePath, NSString *key, NSDictionary **errorOut)
+{
+ if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
+ NSError *error;
+ NSStringEncoding encoding;
+ NSString *entryString = [NSString stringWithContentsOfFile:filePath
+ usedEncoding:&encoding
+ error:&error];
+ NSDictionary *extraData = @{@"key": ABI49_0_0RCTNullIfNil(key)};
+
+ if (error) {
+ if (errorOut) {
+ *errorOut = ABI49_0_0RCTMakeError(@"Failed to read storage file.", error, extraData);
+ }
+ return nil;
+ }
+
+ if (encoding != NSUTF8StringEncoding) {
+ if (errorOut) {
+ *errorOut =
+ ABI49_0_0RCTMakeError(@"Incorrect encoding of storage file: ", @(encoding), extraData);
+ }
+ return nil;
+ }
+ return entryString;
+ }
+
+ return nil;
+}
+
+// DO NOT USE
+// This is used internally to migrate data from the old file location to the new one.
+// Please use `ABI49_0_0RCTCreateStorageDirectoryPath` instead
+static NSString *ABI49_0_0RCTCreateStorageDirectoryPath_deprecated(NSString *storageDir)
+{
+ NSString *storageDirectoryPath;
+#if TARGET_OS_TV
+ storageDirectoryPath =
+ NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
+#else
+ storageDirectoryPath =
+ NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
+#endif
+ storageDirectoryPath = [storageDirectoryPath stringByAppendingPathComponent:storageDir];
+ return storageDirectoryPath;
+}
+
+static NSString *ABI49_0_0RCTCreateStorageDirectoryPath(NSString *storageDir)
+{
+ NSString *storageDirectoryPath = @"";
+
+#if TARGET_OS_TV
+ storageDirectoryPath =
+ NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
+#else
+ storageDirectoryPath =
+ NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES)
+ .firstObject;
+ // We should use the "Application Support/[bundleID]" folder for persistent data storage that's
+ // hidden from users
+ storageDirectoryPath = [storageDirectoryPath
+ stringByAppendingPathComponent:[[NSBundle mainBundle] bundleIdentifier]];
+#endif
+
+ // Per Apple's docs, all app content in Application Support must be within a subdirectory of the
+ // app's bundle identifier
+ storageDirectoryPath = [storageDirectoryPath stringByAppendingPathComponent:storageDir];
+
+ return storageDirectoryPath;
+}
+
+static NSString *ABI49_0_0RCTCreateManifestFilePath(NSString *storageDirectory)
+{
+ return [storageDirectory stringByAppendingPathComponent:ABI49_0_0RCTManifestFileName];
+}
+
+// Only merges objects - all other types are just clobbered (including arrays)
+static BOOL ABI49_0_0RCTMergeRecursive(NSMutableDictionary *destination, NSDictionary *source)
+{
+ BOOL modified = NO;
+ for (NSString *key in source) {
+ id sourceValue = source[key];
+ id destinationValue = destination[key];
+ if ([sourceValue isKindOfClass:[NSDictionary class]]) {
+ if ([destinationValue isKindOfClass:[NSDictionary class]]) {
+ if ([destinationValue classForCoder] != [NSMutableDictionary class]) {
+ destinationValue = [destinationValue mutableCopy];
+ }
+ if (ABI49_0_0RCTMergeRecursive(destinationValue, sourceValue)) {
+ destination[key] = destinationValue;
+ modified = YES;
+ }
+ } else {
+ destination[key] = [sourceValue copy];
+ modified = YES;
+ }
+ } else if (![source isEqual:destinationValue]) {
+ destination[key] = [sourceValue copy];
+ modified = YES;
+ }
+ }
+ return modified;
+}
+
+static BOOL ABI49_0_0RCTHasCreatedStorageDirectory = NO;
+
+// NOTE(nikki93): We replace with scoped implementations of:
+// ABI49_0_0RCTGetStorageDirectory()
+// ABI49_0_0RCTGetManifestFilePath()
+// ABI49_0_0RCTGetMethodQueue()
+// ABI49_0_0RCTGetCache()
+// ABI49_0_0RCTDeleteStorageDirectory()
+
+#define ABI49_0_0RCTGetStorageDirectory() _storageDirectory
+#define ABI49_0_0RCTGetManifestFilePath() _manifestFilePath
+#define ABI49_0_0RCTGetMethodQueue() self.methodQueue
+#define ABI49_0_0RCTGetCache() self.cache
+
+static NSDictionary *ABI49_0_0RCTDeleteStorageDirectory(NSString *storageDirectory)
+{
+ NSError *error;
+ [[NSFileManager defaultManager] removeItemAtPath:storageDirectory error:&error];
+ return error ? ABI49_0_0RCTMakeError(@"Failed to delete storage directory.", error, nil) : nil;
+}
+#define ABI49_0_0RCTDeleteStorageDirectory() ABI49_0_0RCTDeleteStorageDirectory(_storageDirectory)
+
+static NSDate *ABI49_0_0RCTManifestModificationDate(NSString *manifestFilePath)
+{
+ NSDictionary *attributes =
+ [[NSFileManager defaultManager] attributesOfItemAtPath:manifestFilePath error:nil];
+ return [attributes fileModificationDate];
+}
+
+/**
+ * Creates an NSException used during Storage Directory Migration.
+ */
+static void ABI49_0_0RCTStorageDirectoryMigrationLogError(NSString *reason, NSError *error)
+{
+ ABI49_0_0RCTLogWarn(@"%@: %@", reason, error ? error.description : @"");
+}
+
+static void ABI49_0_0RCTStorageDirectoryCleanupOld(NSString *oldDirectoryPath)
+{
+ NSError *error;
+ if (![[NSFileManager defaultManager] removeItemAtPath:oldDirectoryPath error:&error]) {
+ ABI49_0_0RCTStorageDirectoryMigrationLogError(
+ @"Failed to remove old storage directory during migration", error);
+ }
+}
+
+static void _createStorageDirectory(NSString *storageDirectory, NSError **error)
+{
+ [[NSFileManager defaultManager] createDirectoryAtPath:storageDirectory
+ withIntermediateDirectories:YES
+ attributes:nil
+ error:error];
+}
+
+static void ABI49_0_0RCTStorageDirectoryMigrate(NSString *oldDirectoryPath,
+ NSString *newDirectoryPath,
+ BOOL shouldCleanupOldDirectory)
+{
+ assert(false);
+}
+
+/**
+ * Determine which of ABI49_0_0RCTOldStorageDirectory or ABI49_0_0RCTExpoStorageDirectory needs to migrated.
+ * If both exist, we remove the least recently modified and return the most recently modified.
+ * Otherwise, this will return the path to whichever directory exists.
+ * If no directory exists, then return nil.
+ */
+static NSString *ABI49_0_0RCTGetStoragePathForMigration()
+{
+ BOOL isDir;
+ NSString *oldStoragePath = ABI49_0_0RCTCreateStorageDirectoryPath_deprecated(ABI49_0_0RCTOldStorageDirectory);
+ NSString *expoStoragePath = ABI49_0_0RCTCreateStorageDirectoryPath_deprecated(ABI49_0_0RCTExpoStorageDirectory);
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+ BOOL oldStorageDirectoryExists =
+ [fileManager fileExistsAtPath:oldStoragePath isDirectory:&isDir] && isDir;
+ BOOL expoStorageDirectoryExists =
+ [fileManager fileExistsAtPath:expoStoragePath isDirectory:&isDir] && isDir;
+
+ // Check if both the old storage directory and Expo storage directory exist
+ if (oldStorageDirectoryExists && expoStorageDirectoryExists) {
+ // If the old storage has been modified more recently than Expo storage, then clear Expo
+ // storage. Otherwise, clear the old storage.
+ if ([ABI49_0_0RCTManifestModificationDate(ABI49_0_0RCTCreateManifestFilePath(oldStoragePath))
+ compare:ABI49_0_0RCTManifestModificationDate(ABI49_0_0RCTCreateManifestFilePath(expoStoragePath))] ==
+ NSOrderedDescending) {
+ ABI49_0_0RCTStorageDirectoryCleanupOld(expoStoragePath);
+ return oldStoragePath;
+ } else {
+ ABI49_0_0RCTStorageDirectoryCleanupOld(oldStoragePath);
+ return expoStoragePath;
+ }
+ } else if (oldStorageDirectoryExists) {
+ return oldStoragePath;
+ } else if (expoStorageDirectoryExists) {
+ return expoStoragePath;
+ } else {
+ return nil;
+ }
+}
+
+/**
+ * This check is added to make sure that anyone coming from pre-1.2.2 does not lose cached data.
+ * Check that data is migrated from the old location to the new location
+ * fromStorageDirectory: the directory where the older data lives
+ * toStorageDirectory: the directory where the new data should live
+ * shouldCleanupOldDirectoryAndOverwriteNewDirectory: YES if we should delete the old directory's
+ * contents and overwrite the new directory's contents during the migration to the new directory
+ */
+static void
+ABI49_0_0RCTStorageDirectoryMigrationCheck(NSString *fromStorageDirectory,
+ NSString *toStorageDirectory,
+ BOOL shouldCleanupOldDirectoryAndOverwriteNewDirectory)
+{
+ NSError *error;
+ BOOL isDir;
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+ // If the old directory exists, it means we may need to migrate old data to the new directory
+ if ([fileManager fileExistsAtPath:fromStorageDirectory isDirectory:&isDir] && isDir) {
+ // Check if the new storage directory location already exists
+ if ([fileManager fileExistsAtPath:toStorageDirectory]) {
+ // If new storage location exists, check if the new storage has been modified sooner in
+ // which case we may want to cleanup the old location
+ if ([ABI49_0_0RCTManifestModificationDate(ABI49_0_0RCTCreateManifestFilePath(toStorageDirectory))
+ compare:ABI49_0_0RCTManifestModificationDate(
+ ABI49_0_0RCTCreateManifestFilePath(fromStorageDirectory))] == 1) {
+ // If new location has been modified more recently, simply clean out old data
+ if (shouldCleanupOldDirectoryAndOverwriteNewDirectory) {
+ ABI49_0_0RCTStorageDirectoryCleanupOld(fromStorageDirectory);
+ }
+ } else if (shouldCleanupOldDirectoryAndOverwriteNewDirectory) {
+ // If old location has been modified more recently, remove new storage and migrate
+ if (![fileManager removeItemAtPath:toStorageDirectory error:&error]) {
+ ABI49_0_0RCTStorageDirectoryMigrationLogError(
+ @"Failed to remove new storage directory during migration", error);
+ } else {
+ ABI49_0_0RCTStorageDirectoryMigrate(fromStorageDirectory,
+ toStorageDirectory,
+ shouldCleanupOldDirectoryAndOverwriteNewDirectory);
+ }
+ }
+ } else {
+ // If new storage location doesn't exist, migrate data
+ ABI49_0_0RCTStorageDirectoryMigrate(fromStorageDirectory,
+ toStorageDirectory,
+ shouldCleanupOldDirectoryAndOverwriteNewDirectory);
+ }
+ }
+}
+
+#pragma mark - ABI49_0_0RNCAsyncStorage
+
+@interface ABI49_0_0RNCAsyncStorage ()
+
+@property (nonatomic, copy) NSString *storageDirectory;
+@property (nonatomic, copy) NSString *manifestFilePath;
+
+@end
+
+@implementation ABI49_0_0RNCAsyncStorage {
+ BOOL _haveSetup;
+ // The manifest is a dictionary of all keys with small values inlined. Null values indicate
+ // values that are stored in separate files (as opposed to nil values which don't exist). The
+ // manifest is read off disk at startup, and written to disk after all mutations.
+ NSMutableDictionary *_manifest;
+ NSCache *_cache;
+ dispatch_once_t _cacheOnceToken;
+}
+
+// NOTE(nikki93): Prevents the module from being auto-initialized and allows us to pass our own `storageDirectory`
++ (NSString *)moduleName { return @"ABI49_0_0RCTAsyncLocalStorage"; }
+- (instancetype)initWithStorageDirectory:(NSString *)storageDirectory
+{
+ if ((self = [super init])) {
+ _storageDirectory = storageDirectory;
+ _manifestFilePath = [ABI49_0_0RCTGetStorageDirectory() stringByAppendingPathComponent:ABI49_0_0RCTManifestFileName];
+ }
+ return self;
+}
+
+// NOTE(nikki93): Use the default `methodQueue` since instances have different storage directories
+@synthesize methodQueue = _methodQueue;
+
+- (NSCache *)cache
+{
+ dispatch_once(&_cacheOnceToken, ^{
+ _cache = [NSCache new];
+ _cache.totalCostLimit = 2 * 1024 * 1024; // 2MB
+
+ // Clear cache in the event of a memory warning
+ [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:nil usingBlock:^(__unused NSNotification *note) {
+ [_cache removeAllObjects];
+ }];
+ });
+ return _cache;
+}
+
++ (BOOL)requiresMainQueueSetup
+{
+ return NO;
+}
+
+- (instancetype)init
+{
+ assert(false);
+ if (!(self = [super init])) {
+ return nil;
+ }
+
+ // Get the path to any old storage directory that needs to be migrated. If multiple exist,
+ // the oldest are removed and the most recently modified is returned.
+ NSString *oldStoragePath = ABI49_0_0RCTGetStoragePathForMigration();
+ if (oldStoragePath != nil) {
+ // Migrate our deprecated path "Documents/.../ABI49_0_0RNCAsyncLocalStorage_V1" or
+ // "Documents/.../ABI49_0_0RCTAsyncLocalStorage" to "Documents/.../ABI49_0_0RCTAsyncLocalStorage_V1"
+ ABI49_0_0RCTStorageDirectoryMigrationCheck(
+ oldStoragePath, ABI49_0_0RCTCreateStorageDirectoryPath_deprecated(ABI49_0_0RCTStorageDirectory), YES);
+ }
+
+ // Migrate what's in "Documents/.../ABI49_0_0RCTAsyncLocalStorage_V1" to
+ // "Application Support/[bundleID]/ABI49_0_0RCTAsyncLocalStorage_V1"
+ ABI49_0_0RCTStorageDirectoryMigrationCheck(ABI49_0_0RCTCreateStorageDirectoryPath_deprecated(ABI49_0_0RCTStorageDirectory),
+ ABI49_0_0RCTCreateStorageDirectoryPath(ABI49_0_0RCTStorageDirectory),
+ NO);
+
+ return self;
+}
+
+- (void)clearAllData
+{
+ dispatch_async(ABI49_0_0RCTGetMethodQueue(), ^{
+ [self->_manifest removeAllObjects];
+ [ABI49_0_0RCTGetCache() removeAllObjects];
+ ABI49_0_0RCTDeleteStorageDirectory();
+ });
+}
+
+- (void)invalidate
+{
+ if (_clearOnInvalidate) {
+ [ABI49_0_0RCTGetCache() removeAllObjects];
+ ABI49_0_0RCTDeleteStorageDirectory();
+ }
+ _clearOnInvalidate = NO;
+ [_manifest removeAllObjects];
+ _haveSetup = NO;
+}
+
+- (BOOL)isValid
+{
+ return _haveSetup;
+}
+
+- (void)dealloc
+{
+ [self invalidate];
+}
+
+- (NSString *)_filePathForKey:(NSString *)key
+{
+ NSString *safeFileName = ABI49_0_0RCTMD5Hash(key);
+ return [ABI49_0_0RCTGetStorageDirectory() stringByAppendingPathComponent:safeFileName];
+}
+
+- (NSDictionary *)_ensureSetup
+{
+ ABI49_0_0RCTAssertThread(ABI49_0_0RCTGetMethodQueue(), @"Must be executed on storage thread");
+
+#if TARGET_OS_TV
+ ABI49_0_0RCTLogWarn(
+ @"Persistent storage is not supported on tvOS, your data may be removed at any point.");
+#endif
+
+ NSError *error = nil;
+ // NOTE(nikki93): `withIntermediateDirectories:YES` makes this idempotent
+ [[NSFileManager defaultManager] createDirectoryAtPath:ABI49_0_0RCTGetStorageDirectory()
+ withIntermediateDirectories:YES
+ attributes:nil
+ error:&error];
+ if (error) {
+ return ABI49_0_0RCTMakeError(@"Failed to create storage directory.", error, nil);
+ }
+
+ if (!_haveSetup) {
+ // iCloud backup exclusion
+ NSNumber *isExcludedFromBackup =
+ [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ABI49_0_0RCTAsyncStorageExcludeFromBackup"];
+ if (isExcludedFromBackup == nil) {
+ // by default, we want to exclude AsyncStorage data from backup
+ isExcludedFromBackup = @YES;
+ }
+ // NOTE(kudo): We don't enable iCloud backup for Expo Go
+ // ABI49_0_0RCTAsyncStorageSetExcludedFromBackup(ABI49_0_0RCTCreateStorageDirectoryPath(ABI49_0_0RCTStorageDirectory),
+ // isExcludedFromBackup);
+
+ NSDictionary *errorOut = nil;
+ // NOTE(kudo): Keep data in Documents rather than Application Support for backward compatibility
+ // NSString *serialized = ABI49_0_0RCTReadFile(ABI49_0_0RCTCreateStorageDirectoryPath(ABI49_0_0RCTGetManifestFilePath())
+ NSString *serialized = ABI49_0_0RCTReadFile(ABI49_0_0RCTGetManifestFilePath(),
+ ABI49_0_0RCTManifestFileName,
+ &errorOut);
+ if (!serialized) {
+ if (errorOut) {
+ // We cannot simply create a new manifest in case the file does exist but we have no
+ // access to it. This can happen when data protection is enabled for the app and we
+ // are trying to read the manifest while the device is locked. (The app can be
+ // started by the system even if the device is locked due to e.g. a geofence event.)
+ ABI49_0_0RCTLogError(
+ @"Could not open the existing manifest, perhaps data protection is "
+ @"enabled?\n\n%@",
+ errorOut);
+ return errorOut;
+ } else {
+ // We can get nil without errors only when the file does not exist.
+ ABI49_0_0RCTLogTrace(@"Manifest does not exist - creating a new one.\n\n%@", errorOut);
+ _manifest = [NSMutableDictionary new];
+ }
+ } else {
+ _manifest = ABI49_0_0RCTJSONParseMutable(serialized, &error);
+ if (!_manifest) {
+ ABI49_0_0RCTLogError(@"Failed to parse manifest - creating a new one.\n\n%@", error);
+ _manifest = [NSMutableDictionary new];
+ }
+ }
+ _haveSetup = YES;
+ }
+
+ return nil;
+}
+
+- (NSDictionary *)_writeManifest:(NSMutableArray **)errors
+{
+ NSError *error;
+ NSString *serialized = ABI49_0_0RCTJSONStringify(_manifest, &error);
+ // NOTE(kudo): Keep data in Documents rather than Application Support for backward compatibility
+ // [serialized writeToFile:ABI49_0_0RCTCreateStorageDirectoryPath(ABI49_0_0RCTGetManifestFilePath())
+ [serialized writeToFile:ABI49_0_0RCTGetManifestFilePath()
+ atomically:YES
+ encoding:NSUTF8StringEncoding
+ error:&error];
+ NSDictionary *errorOut;
+ if (error) {
+ errorOut = ABI49_0_0RCTMakeError(@"Failed to write manifest file.", error, nil);
+ ABI49_0_0RCTAppendError(errorOut, errors);
+ }
+ return errorOut;
+}
+
+- (NSDictionary *)_appendItemForKey:(NSString *)key
+ toArray:(NSMutableArray *> *)result
+{
+ NSDictionary *errorOut = ABI49_0_0RCTErrorForKey(key);
+ if (errorOut) {
+ return errorOut;
+ }
+ NSString *value = [self _getValueForKey:key errorOut:&errorOut];
+ [result addObject:@[key, ABI49_0_0RCTNullIfNil(value)]]; // Insert null if missing or failure.
+ return errorOut;
+}
+
+- (NSString *)_getValueForKey:(NSString *)key errorOut:(NSDictionary **)errorOut
+{
+ NSString *value =
+ _manifest[key]; // nil means missing, null means there may be a data file, else: NSString
+ if (value == (id)kCFNull) {
+ value = [ABI49_0_0RCTGetCache() objectForKey:key];
+ if (!value) {
+ NSString *filePath = [self _filePathForKey:key];
+ value = ABI49_0_0RCTReadFile(filePath, key, errorOut);
+ if (value) {
+ [ABI49_0_0RCTGetCache() setObject:value forKey:key cost:value.length];
+ } else {
+ // file does not exist after all, so remove from manifest (no need to save
+ // manifest immediately though, as cost of checking again next time is negligible)
+ [_manifest removeObjectForKey:key];
+ }
+ }
+ }
+ return value;
+}
+
+- (NSDictionary *)_writeEntry:(NSArray *)entry changedManifest:(BOOL *)changedManifest
+{
+ if (entry.count != 2) {
+ return ABI49_0_0RCTMakeAndLogError(
+ @"Entries must be arrays of the form [key: string, value: string], got: ", entry, nil);
+ }
+ NSString *key = entry[0];
+ NSDictionary *errorOut = ABI49_0_0RCTErrorForKey(key);
+ if (errorOut) {
+ return errorOut;
+ }
+ NSString *value = entry[1];
+ NSString *filePath = [self _filePathForKey:key];
+ NSError *error;
+ if (value.length <= ABI49_0_0RCTInlineValueThreshold) {
+ if (_manifest[key] == (id)kCFNull) {
+ // If the value already existed but wasn't inlined, remove the old file.
+ [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
+ [ABI49_0_0RCTGetCache() removeObjectForKey:key];
+ }
+ *changedManifest = YES;
+ _manifest[key] = value;
+ return nil;
+ }
+ [value writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
+ [ABI49_0_0RCTGetCache() setObject:value forKey:key cost:value.length];
+ if (error) {
+ errorOut = ABI49_0_0RCTMakeError(@"Failed to write value.", error, @{@"key": key});
+ } else if (_manifest[key] != (id)kCFNull) {
+ *changedManifest = YES;
+ _manifest[key] = (id)kCFNull;
+ }
+ return errorOut;
+}
+
+- (void)_multiGet:(NSArray *)keys
+ callback:(ABI49_0_0RCTResponseSenderBlock)callback
+ getter:(NSString * (^)(NSUInteger i, NSString *key, NSDictionary **errorOut))getValue
+{
+ NSMutableArray *errors;
+ NSMutableArray *> *result = [NSMutableArray arrayWithCapacity:keys.count];
+ for (NSUInteger i = 0; i < keys.count; ++i) {
+ NSString *key = keys[i];
+ id keyError;
+ id value = getValue(i, key, &keyError);
+ [result addObject:@[key, ABI49_0_0RCTNullIfNil(value)]];
+ ABI49_0_0RCTAppendError(keyError, &errors);
+ }
+ callback(@[ABI49_0_0RCTNullIfNil(errors), result]);
+}
+
+- (BOOL)_passthroughDelegate
+{
+ return
+ [self.delegate respondsToSelector:@selector(isPassthrough)] && self.delegate.isPassthrough;
+}
+
+#pragma mark - Exported JS Functions
+
+// clang-format off
+ABI49_0_0RCT_EXPORT_METHOD(multiGet:(NSArray *)keys
+ callback:(ABI49_0_0RCTResponseSenderBlock)callback)
+// clang-format on
+{
+ if (self.delegate != nil) {
+ [self.delegate
+ valuesForKeys:keys
+ completion:^(NSArray> *valuesOrErrors) {
+ [self _multiGet:keys
+ callback:callback
+ getter:^NSString *(NSUInteger i, NSString *key, NSDictionary **errorOut) {
+ id valueOrError = valuesOrErrors[i];
+ if ([valueOrError isKindOfClass:[NSError class]]) {
+ NSError *error = (NSError *)valueOrError;
+ NSDictionary *extraData = @{@"key": ABI49_0_0RCTNullIfNil(key)};
+ *errorOut =
+ ABI49_0_0RCTMakeError(error.localizedDescription, error, extraData);
+ return nil;
+ } else {
+ return [valueOrError isKindOfClass:[NSString class]]
+ ? (NSString *)valueOrError
+ : nil;
+ }
+ }];
+ }];
+
+ if (![self _passthroughDelegate]) {
+ return;
+ }
+ }
+
+ NSDictionary *errorOut = [self _ensureSetup];
+ if (errorOut) {
+ callback(@[@[errorOut], (id)kCFNull]);
+ return;
+ }
+ [self _multiGet:keys
+ callback:callback
+ getter:^(NSUInteger i, NSString *key, NSDictionary **errorOut) {
+ return [self _getValueForKey:key errorOut:errorOut];
+ }];
+}
+
+// clang-format off
+ABI49_0_0RCT_EXPORT_METHOD(multiSet:(NSArray *> *)kvPairs
+ callback:(ABI49_0_0RCTResponseSenderBlock)callback)
+// clang-format on
+{
+ if (self.delegate != nil) {
+ NSMutableArray *keys = [NSMutableArray arrayWithCapacity:kvPairs.count];
+ NSMutableArray *values = [NSMutableArray arrayWithCapacity:kvPairs.count];
+ for (NSArray *entry in kvPairs) {
+ [keys addObject:entry[0]];
+ [values addObject:entry[1]];
+ }
+ [self.delegate setValues:values
+ forKeys:keys
+ completion:^(NSArray> *results) {
+ NSArray *errors = ABI49_0_0RCTMakeErrors(results);
+ callback(@[ABI49_0_0RCTNullIfNil(errors)]);
+ }];
+
+ if (![self _passthroughDelegate]) {
+ return;
+ }
+ }
+
+ NSDictionary *errorOut = [self _ensureSetup];
+ if (errorOut) {
+ callback(@[@[errorOut]]);
+ return;
+ }
+ BOOL changedManifest = NO;
+ NSMutableArray *errors;
+ for (NSArray *entry in kvPairs) {
+ NSDictionary *keyError = [self _writeEntry:entry changedManifest:&changedManifest];
+ ABI49_0_0RCTAppendError(keyError, &errors);
+ }
+ if (changedManifest) {
+ [self _writeManifest:&errors];
+ }
+ callback(@[ABI49_0_0RCTNullIfNil(errors)]);
+}
+
+// clang-format off
+ABI49_0_0RCT_EXPORT_METHOD(multiMerge:(NSArray *> *)kvPairs
+ callback:(ABI49_0_0RCTResponseSenderBlock)callback)
+// clang-format on
+{
+ if (self.delegate != nil) {
+ NSMutableArray *keys = [NSMutableArray arrayWithCapacity:kvPairs.count];
+ NSMutableArray *values = [NSMutableArray arrayWithCapacity:kvPairs.count];
+ for (NSArray *entry in kvPairs) {
+ [keys addObject:entry[0]];
+ [values addObject:entry[1]];
+ }
+ [self.delegate mergeValues:values
+ forKeys:keys
+ completion:^(NSArray> *results) {
+ NSArray *errors = ABI49_0_0RCTMakeErrors(results);
+ callback(@[ABI49_0_0RCTNullIfNil(errors)]);
+ }];
+
+ if (![self _passthroughDelegate]) {
+ return;
+ }
+ }
+
+ NSDictionary *errorOut = [self _ensureSetup];
+ if (errorOut) {
+ callback(@[@[errorOut]]);
+ return;
+ }
+ BOOL changedManifest = NO;
+ NSMutableArray *errors;
+ for (__strong NSArray *entry in kvPairs) {
+ NSDictionary *keyError;
+ NSString *value = [self _getValueForKey:entry[0] errorOut:&keyError];
+ if (!keyError) {
+ if (value) {
+ NSError *jsonError;
+ NSMutableDictionary *mergedVal = ABI49_0_0RCTJSONParseMutable(value, &jsonError);
+ if (ABI49_0_0RCTMergeRecursive(mergedVal, ABI49_0_0RCTJSONParse(entry[1], &jsonError))) {
+ entry = @[entry[0], ABI49_0_0RCTNullIfNil(ABI49_0_0RCTJSONStringify(mergedVal, NULL))];
+ }
+ if (jsonError) {
+ keyError = ABI49_0_0RCTJSErrorFromNSError(jsonError);
+ }
+ }
+ if (!keyError) {
+ keyError = [self _writeEntry:entry changedManifest:&changedManifest];
+ }
+ }
+ ABI49_0_0RCTAppendError(keyError, &errors);
+ }
+ if (changedManifest) {
+ [self _writeManifest:&errors];
+ }
+ callback(@[ABI49_0_0RCTNullIfNil(errors)]);
+}
+
+// clang-format off
+ABI49_0_0RCT_EXPORT_METHOD(multiRemove:(NSArray *)keys
+ callback:(ABI49_0_0RCTResponseSenderBlock)callback)
+// clang-format on
+{
+ if (self.delegate != nil) {
+ [self.delegate removeValuesForKeys:keys
+ completion:^(NSArray> *results) {
+ NSArray *errors = ABI49_0_0RCTMakeErrors(results);
+ callback(@[ABI49_0_0RCTNullIfNil(errors)]);
+ }];
+
+ if (![self _passthroughDelegate]) {
+ return;
+ }
+ }
+
+ NSDictionary *errorOut = [self _ensureSetup];
+ if (errorOut) {
+ callback(@[@[errorOut]]);
+ return;
+ }
+ NSMutableArray *errors;
+ BOOL changedManifest = NO;
+ for (NSString *key in keys) {
+ NSDictionary *keyError = ABI49_0_0RCTErrorForKey(key);
+ if (!keyError) {
+ if (_manifest[key] == (id)kCFNull) {
+ NSString *filePath = [self _filePathForKey:key];
+ [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
+ [ABI49_0_0RCTGetCache() removeObjectForKey:key];
+ }
+ if (_manifest[key]) {
+ changedManifest = YES;
+ [_manifest removeObjectForKey:key];
+ }
+ }
+ ABI49_0_0RCTAppendError(keyError, &errors);
+ }
+ if (changedManifest) {
+ [self _writeManifest:&errors];
+ }
+ callback(@[ABI49_0_0RCTNullIfNil(errors)]);
+}
+
+// clang-format off
+ABI49_0_0RCT_EXPORT_METHOD(clear:(ABI49_0_0RCTResponseSenderBlock)callback)
+// clang-format on
+{
+ if (self.delegate != nil) {
+ [self.delegate removeAllValues:^(NSError *error) {
+ NSDictionary *result = nil;
+ if (error != nil) {
+ result = ABI49_0_0RCTMakeError(error.localizedDescription, error, nil);
+ }
+ callback(@[ABI49_0_0RCTNullIfNil(result)]);
+ }];
+ return;
+ }
+
+ [_manifest removeAllObjects];
+ [ABI49_0_0RCTGetCache() removeAllObjects];
+ NSDictionary *error = ABI49_0_0RCTDeleteStorageDirectory();
+ callback(@[ABI49_0_0RCTNullIfNil(error)]);
+}
+
+// clang-format off
+ABI49_0_0RCT_EXPORT_METHOD(getAllKeys:(ABI49_0_0RCTResponseSenderBlock)callback)
+// clang-format on
+{
+ if (self.delegate != nil) {
+ [self.delegate allKeys:^(NSArray> *keys) {
+ callback(@[(id)kCFNull, keys]);
+ }];
+
+ if (![self _passthroughDelegate]) {
+ return;
+ }
+ }
+
+ NSDictionary *errorOut = [self _ensureSetup];
+ if (errorOut) {
+ callback(@[errorOut, (id)kCFNull]);
+ } else {
+ callback(@[(id)kCFNull, _manifest.allKeys]);
+ }
+}
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-async-storage/async-storage/ios/ABI49_0_0RNCAsyncStorageDelegate.h b/ios/vendored/sdk49/@react-native-async-storage/async-storage/ios/ABI49_0_0RNCAsyncStorageDelegate.h
new file mode 100644
index 00000000000000..fb81ec78b90bc6
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-async-storage/async-storage/ios/ABI49_0_0RNCAsyncStorageDelegate.h
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void (^ABI49_0_0RNCAsyncStorageCompletion)(NSError *_Nullable error);
+typedef void (^ABI49_0_0RNCAsyncStorageResultCallback)(NSArray> *valuesOrErrors);
+
+@protocol ABI49_0_0RNCAsyncStorageDelegate
+
+/*!
+ * Returns all keys currently stored. If none, an empty array is returned.
+ * @param block Block to call with result.
+ */
+- (void)allKeys:(ABI49_0_0RNCAsyncStorageResultCallback)block;
+
+/*!
+ * Merges values with the corresponding values stored at specified keys.
+ * @param values Values to merge.
+ * @param keys Keys to the values that should be merged with.
+ * @param block Block to call with merged result.
+ */
+- (void)mergeValues:(NSArray *)values
+ forKeys:(NSArray *)keys
+ completion:(ABI49_0_0RNCAsyncStorageResultCallback)block;
+
+/*!
+ * Removes all values from the store.
+ * @param block Block to call with result.
+ */
+- (void)removeAllValues:(ABI49_0_0RNCAsyncStorageCompletion)block;
+
+/*!
+ * Removes all values associated with specified keys.
+ * @param keys Keys of values to remove.
+ * @param block Block to call with result.
+ */
+- (void)removeValuesForKeys:(NSArray *)keys
+ completion:(ABI49_0_0RNCAsyncStorageResultCallback)block;
+
+/*!
+ * Sets specified key-value pairs.
+ * @param values Values to set.
+ * @param keys Keys of specified values to set.
+ * @param block Block to call with result.
+ */
+- (void)setValues:(NSArray *)values
+ forKeys:(NSArray *)keys
+ completion:(ABI49_0_0RNCAsyncStorageResultCallback)block;
+
+/*!
+ * Returns values associated with specified keys.
+ * @param keys Keys of values to return.
+ * @param block Block to call with result.
+ */
+- (void)valuesForKeys:(NSArray *)keys completion:(ABI49_0_0RNCAsyncStorageResultCallback)block;
+
+@optional
+
+/*!
+ * Returns whether the delegate should be treated as a passthrough.
+ */
+@property (nonatomic, readonly, getter=isPassthrough) BOOL passthrough;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/vendored/sdk49/@react-native-community/netinfo/ABI49_0_0react-native-netinfo.podspec.json b/ios/vendored/sdk49/@react-native-community/netinfo/ABI49_0_0react-native-netinfo.podspec.json
new file mode 100644
index 00000000000000..358addb67cf1d2
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/netinfo/ABI49_0_0react-native-netinfo.podspec.json
@@ -0,0 +1,21 @@
+{
+ "name": "ABI49_0_0react-native-netinfo",
+ "version": "9.3.10",
+ "summary": "ABI49_0_0React Native Network Info API for iOS & Android",
+ "license": "MIT",
+ "authors": "Matt Oakes ",
+ "homepage": "https://github.com/react-native-netinfo/react-native-netinfo#readme",
+ "platforms": {
+ "ios": "9.0",
+ "tvos": "9.2",
+ "osx": "10.14"
+ },
+ "source": {
+ "git": "https://github.com/react-native-community/react-native-netinfo.git",
+ "tag": "v9.3.10"
+ },
+ "source_files": "ios/**/*.{h,m}",
+ "dependencies": {
+ "ABI49_0_0React-Core": []
+ }
+}
diff --git a/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionState.h b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionState.h
new file mode 100644
index 00000000000000..0d8149bf320e34
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionState.h
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+// Based on the ConnectionType enum described in the W3C Network Information API spec
+// (https://wicg.github.io/netinfo/).
+static NSString *const ABI49_0_0RNCConnectionTypeUnknown = @"unknown";
+static NSString *const ABI49_0_0RNCConnectionTypeNone = @"none";
+static NSString *const ABI49_0_0RNCConnectionTypeWifi = @"wifi";
+static NSString *const ABI49_0_0RNCConnectionTypeCellular = @"cellular";
+static NSString *const ABI49_0_0RNCConnectionTypeEthernet = @"ethernet";
+
+// Based on the EffectiveConnectionType enum described in the W3C Network Information API spec
+// (https://wicg.github.io/netinfo/).
+static NSString *const ABI49_0_0RNCCellularGeneration2g = @"2g";
+static NSString *const ABI49_0_0RNCCellularGeneration3g = @"3g";
+static NSString *const ABI49_0_0RNCCellularGeneration4g = @"4g";
+static NSString *const ABI49_0_0RNCCellularGeneration5g = @"5g";
+
+@interface ABI49_0_0RNCConnectionState : NSObject
+
+- (instancetype)init;
+- (instancetype)initWithReachabilityFlags:(SCNetworkReachabilityFlags)flags;
+- (BOOL)isEqualToConnectionState:(ABI49_0_0RNCConnectionState *)otherState;
+
+@property (nonatomic, strong, readonly) NSString *type;
+@property (nullable, nonatomic, strong, readonly) NSString *cellularGeneration;
+@property (nonatomic, readonly) BOOL connected;
+@property (nonatomic, readonly) BOOL expensive;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionState.m b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionState.m
new file mode 100644
index 00000000000000..97db050b6fc490
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionState.m
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "ABI49_0_0RNCConnectionState.h"
+#if !TARGET_OS_TV && !TARGET_OS_MACCATALYST
+#import
+#endif
+
+#if TARGET_OS_TV || TARGET_OS_OSX || TARGET_OS_MACCATALYST
+#include
+#endif
+
+@implementation ABI49_0_0RNCConnectionState
+
+// Creates a new "blank" state
+- (instancetype)init
+{
+ self = [super init];
+ if (self) {
+ _type = ABI49_0_0RNCConnectionTypeUnknown;
+ _cellularGeneration = nil;
+ _expensive = false;
+ }
+ return self;
+}
+
+// Creates the state from the given reachability references
+- (instancetype)initWithReachabilityFlags:(SCNetworkReachabilityFlags)flags
+{
+ self = [self init];
+ if (self) {
+ _type = ABI49_0_0RNCConnectionTypeUnknown;
+ _cellularGeneration = nil;
+ _expensive = false;
+
+ if ((flags & kSCNetworkReachabilityFlagsReachable) == 0 ||
+ (flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0) {
+ _type = ABI49_0_0RNCConnectionTypeNone;
+ }
+#if !TARGET_OS_TV && !TARGET_OS_OSX && !TARGET_OS_MACCATALYST
+ else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) {
+ _type = ABI49_0_0RNCConnectionTypeCellular;
+ _expensive = true;
+
+ CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
+ if (netinfo) {
+ if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS] ||
+ [netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] ||
+ [netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
+ _cellularGeneration = ABI49_0_0RNCCellularGeneration2g;
+ } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA] ||
+ [netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] ||
+ [netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA] ||
+ [netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] ||
+ [netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] ||
+ [netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB] ||
+ [netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
+ _cellularGeneration = ABI49_0_0RNCCellularGeneration3g;
+ } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
+ _cellularGeneration = ABI49_0_0RNCCellularGeneration4g;
+ } else if (@available(iOS 14.1, *)) {
+ if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyNRNSA] ||
+ [netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyNR]) {
+ _cellularGeneration = ABI49_0_0RNCCellularGeneration5g;
+ }
+ }
+ }
+ }
+#endif
+ else {
+ _type = ABI49_0_0RNCConnectionTypeWifi;
+#if TARGET_OS_TV || TARGET_OS_OSX || TARGET_OS_MACCATALYST
+ struct ifaddrs *interfaces = NULL;
+ struct ifaddrs *temp_addr = NULL;
+ int success = 0;
+ // retrieve the current interfaces - returns 0 on success
+ success = getifaddrs(&interfaces);
+ if (success == 0) {
+ // Loop through linked list of interfaces
+ temp_addr = interfaces;
+ while (temp_addr != NULL) {
+ if (temp_addr->ifa_addr->sa_family == AF_INET) {
+ // Check if interface is en0 which is the ethernet connection on the Apple TV
+ NSString* ifname = [NSString stringWithUTF8String:temp_addr->ifa_name];
+ if ([ifname isEqualToString:@"en0"]) {
+ _type = ABI49_0_0RNCConnectionTypeEthernet;
+ }
+ }
+ temp_addr = temp_addr->ifa_next;
+ }
+ }
+ // Free memory
+ freeifaddrs(interfaces);
+#endif
+ }
+ }
+ return self;
+}
+
+// Checks if two states are equal
+- (BOOL)isEqualToConnectionState:(ABI49_0_0RNCConnectionState *)otherState
+{
+ return [self.type isEqualToString:otherState.type]
+ && [self.cellularGeneration isEqualToString:otherState.cellularGeneration]
+ && self.expensive == otherState.expensive;
+}
+
+- (BOOL)connected
+{
+ return ![self.type isEqualToString:ABI49_0_0RNCConnectionTypeNone] && ![self.type isEqualToString:ABI49_0_0RNCConnectionTypeUnknown];
+}
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionStateWatcher.h b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionStateWatcher.h
new file mode 100644
index 00000000000000..b19464734f9ec5
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionStateWatcher.h
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+#import "ABI49_0_0RNCConnectionState.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class ABI49_0_0RNCConnectionStateWatcher;
+
+
+@protocol ABI49_0_0RNCConnectionStateWatcherDelegate
+
+- (void)connectionStateWatcher:(ABI49_0_0RNCConnectionStateWatcher *)connectionStateWatcher didUpdateState:(ABI49_0_0RNCConnectionState *)state;
+
+@end
+
+@interface ABI49_0_0RNCConnectionStateWatcher : NSObject
+
+- (instancetype)initWithDelegate:(id)delegate;
+- (ABI49_0_0RNCConnectionState *)currentState;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionStateWatcher.m b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionStateWatcher.m
new file mode 100644
index 00000000000000..e7fe85013215f3
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCConnectionStateWatcher.m
@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "ABI49_0_0RNCConnectionStateWatcher.h"
+#import
+#import
+
+@interface ABI49_0_0RNCConnectionStateWatcher ()
+
+@property (nonatomic) SCNetworkReachabilityRef reachabilityRef;
+@property (nullable, weak, nonatomic) id delegate;
+@property (nonatomic) SCNetworkReachabilityFlags lastFlags;
+@property (nonnull, strong, nonatomic) ABI49_0_0RNCConnectionState *state;
+
+@end
+
+@implementation ABI49_0_0RNCConnectionStateWatcher
+
+#pragma mark - Lifecycle
+
+- (instancetype)initWithDelegate:(id)delegate
+{
+ self = [self init];
+ if (self) {
+ _delegate = delegate;
+ _state = [[ABI49_0_0RNCConnectionState alloc] init];
+ _reachabilityRef = [self createReachabilityRef];
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ self.delegate = nil;
+
+ if (self.reachabilityRef != nil) {
+ SCNetworkReachabilityUnscheduleFromRunLoop(self.reachabilityRef, CFRunLoopGetMain(), kCFRunLoopCommonModes);
+ CFRelease(self.reachabilityRef);
+ self.reachabilityRef = nil;
+ }
+}
+
+#pragma mark - Public methods
+
+- (ABI49_0_0RNCConnectionState *)currentState
+{
+ return self.state;
+}
+
+#pragma mark - Callback
+
+typedef void (^ABI49_0_0RNCConnectionStateUpdater)(SCNetworkReachabilityFlags);
+
+static void ABI49_0_0RNCReachabilityCallback(__unused SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info)
+{
+ ABI49_0_0RNCConnectionStateUpdater block = (__bridge id)info;
+ if (block != nil) {
+ block(flags);
+ }
+}
+
+static void ABI49_0_0RNCReachabilityContextRelease(const void *info)
+{
+ Block_release(info);
+}
+
+static const void *ABI49_0_0RNCReachabilityContextRetain(const void *info)
+{
+ return Block_copy(info);
+}
+
+- (void)update:(SCNetworkReachabilityFlags)flags
+{
+ self.lastFlags = flags;
+ self.state = [[ABI49_0_0RNCConnectionState alloc] initWithReachabilityFlags:flags];
+}
+
+#pragma mark - Setters
+
+- (void)setState:(ABI49_0_0RNCConnectionState *)state
+{
+ if (![state isEqualToConnectionState:_state]) {
+ _state = state;
+
+ [self updateDelegate];
+ }
+}
+
+#pragma mark - Utilities
+
+- (void)updateDelegate
+{
+ [self.delegate connectionStateWatcher:self didUpdateState:self.state];
+}
+
+- (SCNetworkReachabilityRef)createReachabilityRef
+{
+ struct sockaddr_in zeroAddress;
+ bzero(&zeroAddress, sizeof(zeroAddress));
+ zeroAddress.sin_len = sizeof(zeroAddress);
+ zeroAddress.sin_family = AF_INET;
+
+ SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress);
+
+ __weak typeof(self) weakSelf = self;
+ ABI49_0_0RNCConnectionStateUpdater callback = ^(SCNetworkReachabilityFlags flags) {
+ __strong __typeof(weakSelf) strongSelf = weakSelf;
+ if (strongSelf != nil) {
+ [strongSelf update:flags];
+ }
+ };
+
+ SCNetworkReachabilityContext context = {
+ 0,
+ (__bridge void *)callback,
+ ABI49_0_0RNCReachabilityContextRetain,
+ ABI49_0_0RNCReachabilityContextRelease,
+ NULL
+ };
+ SCNetworkReachabilitySetCallback(reachability, ABI49_0_0RNCReachabilityCallback, &context);
+ SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
+
+ // Set the state the first time
+ SCNetworkReachabilityFlags flags;
+ SCNetworkReachabilityGetFlags(reachability, &flags);
+ [self update:flags];
+
+ return reachability;
+}
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCNetInfo.h b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCNetInfo.h
new file mode 100644
index 00000000000000..c09559ca84938d
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCNetInfo.h
@@ -0,0 +1,12 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+
+@interface ABI49_0_0RNCNetInfo : ABI49_0_0RCTEventEmitter
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCNetInfo.m b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCNetInfo.m
new file mode 100644
index 00000000000000..aa2aa1bed7e8aa
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/netinfo/ios/ABI49_0_0RNCNetInfo.m
@@ -0,0 +1,268 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "ABI49_0_0RNCNetInfo.h"
+#import "ABI49_0_0RNCConnectionStateWatcher.h"
+
+#include
+#include
+
+#if !TARGET_OS_TV && !TARGET_OS_MACCATALYST
+#import
+#import
+#endif
+@import SystemConfiguration.CaptiveNetwork;
+
+#import
+#import
+#import
+
+@interface ABI49_0_0RNCNetInfo ()
+
+@property (nonatomic, strong) ABI49_0_0RNCConnectionStateWatcher *connectionStateWatcher;
+@property (nonatomic) BOOL isObserving;
+@property (nonatomic) NSDictionary *config;
+
+@end
+
+@implementation ABI49_0_0RNCNetInfo
+
+#pragma mark - Module setup
+
+ABI49_0_0RCT_EXPORT_MODULE()
+
+// We need ABI49_0_0RNCReachabilityCallback's and module methods to be called on the same thread so that we can have
+// guarantees about when we mess with the reachability callbacks.
+- (dispatch_queue_t)methodQueue
+{
+ return dispatch_get_main_queue();
+}
+
++ (BOOL)requiresMainQueueSetup
+{
+ return YES;
+}
+
+#pragma mark - Lifecycle
+
+- (NSArray *)supportedEvents
+{
+ return @[@"netInfo.networkStatusDidChange"];
+}
+
+- (void)startObserving
+{
+ self.isObserving = YES;
+}
+
+- (void)stopObserving
+{
+ self.isObserving = NO;
+}
+
+- (instancetype)init
+{
+ self = [super init];
+ if (self) {
+ _connectionStateWatcher = [[ABI49_0_0RNCConnectionStateWatcher alloc] initWithDelegate:self];
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ self.connectionStateWatcher = nil;
+}
+
+#pragma mark - ABI49_0_0RNCConnectionStateWatcherDelegate
+
+- (void)connectionStateWatcher:(ABI49_0_0RNCConnectionStateWatcher *)connectionStateWatcher didUpdateState:(ABI49_0_0RNCConnectionState *)state
+{
+ if (self.isObserving) {
+ NSDictionary *dictionary = [self currentDictionaryFromUpdateState:state withInterface:NULL];
+ [self sendEventWithName:@"netInfo.networkStatusDidChange" body:dictionary];
+ }
+}
+
+#pragma mark - Public API
+
+ABI49_0_0RCT_EXPORT_METHOD(getCurrentState:(nullable NSString *)requestedInterface resolve:(ABI49_0_0RCTPromiseResolveBlock)resolve
+ reject:(__unused ABI49_0_0RCTPromiseRejectBlock)reject)
+{
+ ABI49_0_0RNCConnectionState *state = [self.connectionStateWatcher currentState];
+ resolve([self currentDictionaryFromUpdateState:state withInterface:requestedInterface]);
+}
+
+ABI49_0_0RCT_EXPORT_METHOD(configure:(NSDictionary *)config)
+{
+ self.config = config;
+}
+
+#pragma mark - Utilities
+
+// Converts the state into a dictionary to send over the bridge
+- (NSDictionary *)currentDictionaryFromUpdateState:(ABI49_0_0RNCConnectionState *)state withInterface:(nullable NSString *)requestedInterface
+{
+ NSString *selectedInterface = requestedInterface ?: state.type;
+ NSMutableDictionary *details = [self detailsFromInterface:selectedInterface withState:state];
+ bool connected = [state.type isEqualToString:selectedInterface] && state.connected;
+ if (connected) {
+ details[@"isConnectionExpensive"] = @(state.expensive);
+ }
+
+ return @{
+ @"type": selectedInterface,
+ @"isConnected": @(connected),
+ @"details": details ?: NSNull.null
+ };
+}
+
+- (NSMutableDictionary *)detailsFromInterface:(nonnull NSString *)requestedInterface withState:(ABI49_0_0RNCConnectionState *)state
+{
+ NSMutableDictionary *details = [NSMutableDictionary new];
+ if ([requestedInterface isEqualToString: ABI49_0_0RNCConnectionTypeCellular]) {
+ details[@"cellularGeneration"] = state.cellularGeneration ?: NSNull.null;
+ details[@"carrier"] = [self carrier] ?: NSNull.null;
+ } else if ([requestedInterface isEqualToString: ABI49_0_0RNCConnectionTypeWifi] || [requestedInterface isEqualToString: ABI49_0_0RNCConnectionTypeEthernet]) {
+ details[@"ipAddress"] = [self ipAddress] ?: NSNull.null;
+ details[@"subnet"] = [self subnet] ?: NSNull.null;
+ #if !TARGET_OS_TV && !TARGET_OS_OSX && !TARGET_OS_MACCATALYST
+ /*
+ Without one of the conditions needed to use CNCopyCurrentNetworkInfo, it will leak memory.
+ Clients should only set the shouldFetchWiFiSSID to true after ensuring requirements are met to get (B)SSID.
+ */
+ if (self.config && self.config[@"shouldFetchWiFiSSID"]) {
+ details[@"ssid"] = [self ssid] ?: NSNull.null;
+ details[@"bssid"] = [self bssid] ?: NSNull.null;
+ }
+ #endif
+ }
+ return details;
+}
+
+- (NSString *)carrier
+{
+#if (TARGET_OS_TV || TARGET_OS_OSX || TARGET_OS_MACCATALYST)
+ return nil;
+#else
+ CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
+ CTCarrier *carrier = [netinfo subscriberCellularProvider];
+ return carrier.carrierName;
+#endif
+}
+
+- (NSString *)ipAddress
+{
+ NSString *address = @"0.0.0.0";
+ struct ifaddrs *interfaces = NULL;
+ struct ifaddrs *temp_addr = NULL;
+ int success = 0;
+ // retrieve the current interfaces - returns 0 on success
+ success = getifaddrs(&interfaces);
+ if (success == 0) {
+ // Loop through linked list of interfaces
+ temp_addr = interfaces;
+ while (temp_addr != NULL) {
+ if (temp_addr->ifa_addr->sa_family == AF_INET) {
+ NSString* ifname = [NSString stringWithUTF8String:temp_addr->ifa_name];
+ if (
+ // Check if interface is en0 which is the wifi connection on the iPhone
+ // and the ethernet connection on the Apple TV
+ [ifname isEqualToString:@"en0"] ||
+ // Check if interface is en1 which is the wifi connection on the Apple TV
+ [ifname isEqualToString:@"en1"]
+ ) {
+ // Get NSString from C String
+ char str[INET_ADDRSTRLEN];
+ inet_ntop(AF_INET, &((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr, str, INET_ADDRSTRLEN);
+ address = [NSString stringWithUTF8String:str];
+ }
+ }
+
+ temp_addr = temp_addr->ifa_next;
+ }
+ }
+ // Free memory
+ freeifaddrs(interfaces);
+ return address;
+}
+
+- (NSString *)subnet
+{
+ NSString *subnet = @"0.0.0.0";
+ struct ifaddrs *interfaces = NULL;
+ struct ifaddrs *temp_addr = NULL;
+ int success = 0;
+ // retrieve the current interfaces - returns 0 on success
+ success = getifaddrs(&interfaces);
+ if (success == 0) {
+ // Loop through linked list of interfaces
+ temp_addr = interfaces;
+ while (temp_addr != NULL) {
+ if (temp_addr->ifa_addr->sa_family == AF_INET) {
+ NSString* ifname = [NSString stringWithUTF8String:temp_addr->ifa_name];
+ if (
+ // Check if interface is en0 which is the wifi connection on the iPhone
+ // and the ethernet connection on the Apple TV
+ [ifname isEqualToString:@"en0"] ||
+ // Check if interface is en1 which is the wifi connection on the Apple TV
+ [ifname isEqualToString:@"en1"]
+ ) {
+ // Get NSString from C String
+ char str[INET_ADDRSTRLEN];
+ inet_ntop(AF_INET, &((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr, str, INET_ADDRSTRLEN);
+ subnet = [NSString stringWithUTF8String:str];
+ }
+ }
+
+ temp_addr = temp_addr->ifa_next;
+ }
+ }
+ // Free memory
+ freeifaddrs(interfaces);
+ return subnet;
+}
+
+#if !TARGET_OS_TV && !TARGET_OS_OSX && !TARGET_OS_MACCATALYST
+- (NSString *)ssid
+{
+ NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces());
+ NSDictionary *SSIDInfo;
+ NSString *SSID = NULL;
+ for (NSString *interfaceName in interfaceNames) {
+ // CNCopyCurrentNetworkInfo is deprecated for iOS 13+, need to override & use fetchCurrentWithCompletionHandler
+ SSIDInfo = CFBridgingRelease(CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName));
+ if (SSIDInfo.count > 0) {
+ SSID = SSIDInfo[@"SSID"];
+ if ([SSID isEqualToString:@"Wi-Fi"] || [SSID isEqualToString:@"WLAN"]){
+ SSID = NULL;
+ }
+ break;
+ }
+ }
+ return SSID;
+}
+
+- (NSString *)bssid
+{
+ NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces());
+ NSDictionary *networkDetails;
+ NSString *BSSID = NULL;
+ for (NSString *interfaceName in interfaceNames) {
+ // CNCopyCurrentNetworkInfo is deprecated for iOS 13+, need to override & use fetchCurrentWithCompletionHandler
+ networkDetails = CFBridgingRelease(CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName));
+ if (networkDetails.count > 0)
+ {
+ BSSID = networkDetails[(NSString *) kCNNetworkInfoKeyBSSID];
+ break;
+ }
+ }
+ return BSSID;
+}
+#endif
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-community/slider/ABI49_0_0react-native-slider.podspec.json b/ios/vendored/sdk49/@react-native-community/slider/ABI49_0_0react-native-slider.podspec.json
new file mode 100644
index 00000000000000..75a1ddac75ac32
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/slider/ABI49_0_0react-native-slider.podspec.json
@@ -0,0 +1,19 @@
+{
+ "name": "ABI49_0_0react-native-slider",
+ "version": "4.4.2",
+ "summary": "ABI49_0_0React Native component used to select a single value from a range of values.",
+ "license": "MIT",
+ "authors": "react-native-community",
+ "homepage": "https://github.com/callstack/react-native-slider#readme",
+ "platforms": {
+ "ios": "9.0"
+ },
+ "source": {
+ "git": "https://github.com/callstack/react-native-slider.git",
+ "tag": "v4.4.2"
+ },
+ "source_files": "ios/**/*.{h,m,mm}",
+ "dependencies": {
+ "ABI49_0_0React-Core": []
+ }
+}
diff --git a/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSlider.h b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSlider.h
new file mode 100644
index 00000000000000..4a11174af43d47
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSlider.h
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+
+#import
+
+@interface ABI49_0_0RNCSlider : UISlider
+
+@property (nonatomic, copy) ABI49_0_0RCTBubblingEventBlock onRNCSliderValueChange;
+@property (nonatomic, copy) ABI49_0_0RCTBubblingEventBlock onRNCSliderSlidingStart;
+@property (nonatomic, copy) ABI49_0_0RCTBubblingEventBlock onRNCSliderSlidingComplete;
+
+@property (nonatomic, assign) float step;
+@property (nonatomic, assign) float lastValue;
+@property (nonatomic, assign) bool isSliding;
+
+@property (nonatomic, assign) float lowerLimit;
+@property (nonatomic, assign) float upperLimit;
+
+@property (nonatomic, strong) UIImage *trackImage;
+@property (nonatomic, strong) UIImage *minimumTrackImage;
+@property (nonatomic, strong) UIImage *maximumTrackImage;
+@property (nonatomic, strong) UIImage *thumbImage;
+@property (nonatomic, assign) bool tapToSeek;
+@property (nonatomic, strong) NSString *accessibilityUnits;
+@property (nonatomic, strong) NSArray *accessibilityIncrements;
+
+- (float) discreteValue:(float)value;
+- (void) setDisabled:(bool)disabled;
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSlider.m b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSlider.m
new file mode 100644
index 00000000000000..950bfb712763e3
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSlider.m
@@ -0,0 +1,166 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "ABI49_0_0RNCSlider.h"
+
+@implementation ABI49_0_0RNCSlider
+{
+ float _unclippedValue;
+ bool _minimumTrackImageSet;
+ bool _maximumTrackImageSet;
+}
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+ return [super initWithFrame:frame];
+}
+
+- (void)setValue:(float)value
+{
+ value = [self discreteValue:value];
+ _unclippedValue = value;
+ super.value = value;
+ [self setupAccessibility:value];
+}
+
+- (void)setValue:(float)value animated:(BOOL)animated
+{
+ value = [self discreteValue:value];
+ _unclippedValue = value;
+ [super setValue:value animated:animated];
+ [self setupAccessibility:value];
+}
+
+- (void)setupAccessibility:(float)value
+{
+ if (self.accessibilityUnits && self.accessibilityIncrements && [self.accessibilityIncrements count] - 1 == (int)self.maximumValue) {
+ int index = (int)value;
+ NSString *sliderValue = (NSString *)[self.accessibilityIncrements objectAtIndex:index];
+ NSUInteger stringLength = [self.accessibilityUnits length];
+
+ NSString *spokenUnits = [NSString stringWithString:self.accessibilityUnits];
+ if (sliderValue && [sliderValue intValue] == 1) {
+ spokenUnits = [spokenUnits substringToIndex:stringLength-1];
+ }
+
+ self.accessibilityValue = [NSString stringWithFormat:@"%@ %@", sliderValue, spokenUnits];
+ }
+}
+
+- (void)setMinimumValue:(float)minimumValue
+{
+ super.minimumValue = minimumValue;
+ super.value = _unclippedValue;
+}
+
+- (void)setMaximumValue:(float)maximumValue
+{
+ super.maximumValue = maximumValue;
+ super.value = _unclippedValue;
+}
+
+- (void)setTrackImage:(UIImage *)trackImage
+{
+ if (trackImage != _trackImage) {
+ _trackImage = trackImage;
+ CGFloat width = trackImage.size.width / 2;
+ if (!_minimumTrackImageSet) {
+ UIImage *minimumTrackImage = [trackImage resizableImageWithCapInsets:(UIEdgeInsets){
+ 0, width, 0, width
+ } resizingMode:UIImageResizingModeStretch];
+ [self setMinimumTrackImage:minimumTrackImage forState:UIControlStateNormal];
+ }
+ if (!_maximumTrackImageSet) {
+ UIImage *maximumTrackImage = [trackImage resizableImageWithCapInsets:(UIEdgeInsets){
+ 0, width, 0, width
+ } resizingMode:UIImageResizingModeStretch];
+ [self setMaximumTrackImage:maximumTrackImage forState:UIControlStateNormal];
+ }
+ }
+}
+
+- (void)setMinimumTrackImage:(UIImage *)minimumTrackImage
+{
+ _trackImage = nil;
+ _minimumTrackImageSet = true;
+ minimumTrackImage = [minimumTrackImage resizableImageWithCapInsets:(UIEdgeInsets){
+ 0, minimumTrackImage.size.width, 0, 0
+ } resizingMode:UIImageResizingModeStretch];
+ [self setMinimumTrackImage:minimumTrackImage forState:UIControlStateNormal];
+}
+
+- (UIImage *)minimumTrackImage
+{
+ return [self thumbImageForState:UIControlStateNormal];
+}
+
+- (void)setMaximumTrackImage:(UIImage *)maximumTrackImage
+{
+ _trackImage = nil;
+ _maximumTrackImageSet = true;
+ maximumTrackImage = [maximumTrackImage resizableImageWithCapInsets:(UIEdgeInsets){
+ 0, 0, 0, maximumTrackImage.size.width
+ } resizingMode:UIImageResizingModeStretch];
+ [self setMaximumTrackImage:maximumTrackImage forState:UIControlStateNormal];
+}
+
+- (UIImage *)maximumTrackImage
+{
+ return [self thumbImageForState:UIControlStateNormal];
+}
+
+- (void)setThumbImage:(UIImage *)thumbImage
+{
+ [self setThumbImage:thumbImage forState:UIControlStateNormal];
+}
+
+- (UIImage *)thumbImage
+{
+ return [self thumbImageForState:UIControlStateNormal];
+}
+
+- (void)setInverted:(BOOL)inverted
+{
+ if (inverted) {
+ self.transform = CGAffineTransformMakeScale(-1, 1);
+ } else {
+ self.transform = CGAffineTransformMakeScale(1, 1);
+ }
+}
+
+- (void)setDisabled:(BOOL)disabled
+{
+ self.enabled = !disabled;
+ [self layoutSubviews];
+}
+
+- (float)discreteValue:(float)value
+{
+ if (self.step > 0 && value >= self.maximumValue) {
+ return self.maximumValue;
+ }
+
+ if (self.step > 0 && self.step <= (self.maximumValue - self.minimumValue)) {
+ double (^_round)(double) = ^(double x) {
+ if (!UIAccessibilityIsVoiceOverRunning()) {
+ return round(x);
+ } else if (self.lastValue > value) {
+ return floor(x);
+ } else {
+ return ceil(x);
+ }
+ };
+
+ return MAX(self.minimumValue,
+ MIN(self.maximumValue, self.minimumValue + _round((value - self.minimumValue) / self.step) * self.step)
+ );
+ }
+
+ return value;
+}
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderComponentView.h b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderComponentView.h
new file mode 100644
index 00000000000000..ff7c8a38930752
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderComponentView.h
@@ -0,0 +1,39 @@
+#ifdef ABI49_0_0RCT_NEW_ARCH_ENABLED
+
+#import
+#import
+#import "ABI49_0_0RNCSlider.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void (^ABI49_0_0RNCLoadImageCompletionBlock)(NSError * _Nullable error, UIImage * _Nullable image);
+typedef void (^ABI49_0_0RNCLoadImageFailureBlock)();
+
+@interface ABI49_0_0RNCSliderComponentView : ABI49_0_0RCTViewComponentView
+
+@property (nonatomic, copy) ABI49_0_0RCTBubblingEventBlock onRNCSliderValueChange;
+@property (nonatomic, copy) ABI49_0_0RCTBubblingEventBlock onRNCSliderSlidingStart;
+@property (nonatomic, copy) ABI49_0_0RCTBubblingEventBlock onRNCSliderSlidingComplete;
+
+@property (nonatomic, assign) float step;
+@property (nonatomic, assign) float lastValue;
+@property (nonatomic, assign) bool isSliding;
+
+@property (nonatomic, assign) float lowerLimit;
+@property (nonatomic, assign) float upperLimit;
+
+@property (nonatomic, strong) UIImage *trackImage;
+@property (nonatomic, strong) UIImage *minimumTrackImage;
+@property (nonatomic, strong) UIImage *maximumTrackImage;
+@property (nonatomic, strong) UIImage *thumbImage;
+@property (nonatomic, assign) bool tapToSeek;
+@property (nonatomic, strong) NSString *accessibilityUnits;
+@property (nonatomic, strong) NSArray *accessibilityIncrements;
+
+- (float) discreteValue:(float)value;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
diff --git a/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderComponentView.mm b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderComponentView.mm
new file mode 100644
index 00000000000000..8c84f0f9e4f5a3
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderComponentView.mm
@@ -0,0 +1,285 @@
+#ifdef ABI49_0_0RCT_NEW_ARCH_ENABLED
+
+#import "ABI49_0_0RNCSliderComponentView.h"
+
+#import
+
+#import
+#import
+#import
+#import
+#import
+#import "ABI49_0_0RCTImagePrimitivesConversions.h"
+#import
+#import "ABI49_0_0RCTFabricComponentsPlugins.h"
+#import "ABI49_0_0RNCSlider.h"
+
+using namespace ABI49_0_0facebook::ABI49_0_0React;
+
+@interface ABI49_0_0RNCSliderComponentView ()
+
+@end
+
+
+@implementation ABI49_0_0RNCSliderComponentView
+{
+ ABI49_0_0RNCSlider *slider;
+ UIImage *_image;
+ BOOL _isSliding;
+}
+
++ (ComponentDescriptorProvider)componentDescriptorProvider
+{
+ return concreteComponentDescriptorProvider();
+}
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+ if (self = [super initWithFrame:frame]) {
+ static const auto defaultProps = std::make_shared();
+ _props = defaultProps;
+ slider = [[ABI49_0_0RNCSlider alloc] initWithFrame:self.bounds];
+ [slider addTarget:self action:@selector(sliderValueChanged:)
+ forControlEvents:UIControlEventValueChanged];
+ [slider addTarget:self action:@selector(sliderTouchStart:)
+ forControlEvents:UIControlEventTouchDown];
+ [slider addTarget:self action:@selector(sliderTouchEnd:)
+ forControlEvents:(UIControlEventTouchUpInside |
+ UIControlEventTouchUpOutside |
+ UIControlEventTouchCancel)];
+
+ UITapGestureRecognizer *tapGesturer;
+ tapGesturer = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(tapHandler:)];
+ [tapGesturer setNumberOfTapsRequired: 1];
+ [slider addGestureRecognizer:tapGesturer];
+
+ slider.value = (float)defaultProps->value;
+ self.contentView = slider;
+ }
+ return self;
+}
+
+- (void)tapHandler:(UITapGestureRecognizer *)gesture {
+ if ([gesture.view class] != [ABI49_0_0RNCSlider class]) {
+ return;
+ }
+ ABI49_0_0RNCSlider *slider = (ABI49_0_0RNCSlider *)gesture.view;
+ slider.isSliding = _isSliding;
+
+ // Ignore this tap if in the middle of a slide.
+ if (_isSliding) {
+ return;
+ }
+
+ if (!slider.tapToSeek) {
+ return;
+ }
+
+ CGPoint touchPoint = [gesture locationInView:slider];
+ float rangeWidth = slider.maximumValue - slider.minimumValue;
+ float sliderPercent = touchPoint.x / slider.bounds.size.width;
+ slider.lastValue = slider.value;
+ float value = slider.minimumValue + (rangeWidth * sliderPercent);
+
+ [slider setValue:[slider discreteValue:value] animated: YES];
+
+ std::dynamic_pointer_cast(_eventEmitter)
+ ->onRNCSliderSlidingStart(ABI49_0_0RNCSliderEventEmitter::OnRNCSliderSlidingStart{.value = static_cast(slider.lastValue)});
+
+ // Trigger onValueChange to address https://github.com/react-native-community/react-native-slider/issues/212
+ std::dynamic_pointer_cast(_eventEmitter)
+ ->onRNCSliderValueChange(ABI49_0_0RNCSliderEventEmitter::OnRNCSliderValueChange{.value = static_cast(slider.value)});
+
+ std::dynamic_pointer_cast(_eventEmitter)
+ ->onRNCSliderSlidingComplete(ABI49_0_0RNCSliderEventEmitter::OnRNCSliderSlidingComplete{.value = static_cast(slider.value)});
+}
+
+- (void)sliderValueChanged:(ABI49_0_0RNCSlider *)sender
+{
+ [self ABI49_0_0RNCSendSliderEvent:sender withContinuous:YES isSlidingStart:NO];
+}
+
+- (void)sliderTouchStart:(ABI49_0_0RNCSlider *)sender
+{
+ [self ABI49_0_0RNCSendSliderEvent:sender withContinuous:NO isSlidingStart:YES];
+ _isSliding = YES;
+ sender.isSliding = YES;
+}
+
+- (void)sliderTouchEnd:(ABI49_0_0RNCSlider *)sender
+{
+ [self ABI49_0_0RNCSendSliderEvent:sender withContinuous:NO isSlidingStart:NO];
+ sender.isSliding = NO;
+ _isSliding = NO;
+}
+
+- (void)ABI49_0_0RNCSendSliderEvent:(ABI49_0_0RNCSlider *)sender withContinuous:(BOOL)continuous isSlidingStart:(BOOL)isSlidingStart
+{
+ float value = [sender discreteValue:sender.value];
+
+ if (value < sender.lowerLimit) {
+ value = sender.lowerLimit;
+ [sender setValue:value animated:NO];
+ } else if (value > sender.upperLimit) {
+ value = sender.upperLimit;
+ [sender setValue:value animated:NO];
+ }
+
+ if(!sender.isSliding) {
+ [sender setValue:value animated:NO];
+ }
+
+ if (continuous) {
+ if (sender.lastValue != value) {
+ std::dynamic_pointer_cast(_eventEmitter)
+ ->onRNCSliderValueChange(ABI49_0_0RNCSliderEventEmitter::OnRNCSliderValueChange{.value = static_cast(value)});
+ }
+ } else {
+ if (!isSlidingStart) {
+ std::dynamic_pointer_cast(_eventEmitter)
+ ->onRNCSliderSlidingComplete(ABI49_0_0RNCSliderEventEmitter::OnRNCSliderSlidingComplete{.value = static_cast(value)});
+ }
+ if (isSlidingStart) {
+ std::dynamic_pointer_cast(_eventEmitter)
+ ->onRNCSliderSlidingStart(ABI49_0_0RNCSliderEventEmitter::OnRNCSliderSlidingStart{.value = static_cast(value)});
+ }
+ }
+
+ sender.lastValue = value;
+}
+
+- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
+{
+ const auto &oldScreenProps = *std::static_pointer_cast(_props);
+ const auto &newScreenProps = *std::static_pointer_cast(props);
+
+ if (oldScreenProps.value != newScreenProps.value) {
+ if (!slider.isSliding) {
+ slider.value = newScreenProps.value;
+ }
+ }
+ if (oldScreenProps.disabled != newScreenProps.disabled) {
+ [slider setDisabled: newScreenProps.disabled];
+ }
+ if (oldScreenProps.step != newScreenProps.step) {
+ slider.step = newScreenProps.step;
+ }
+ if (oldScreenProps.inverted != newScreenProps.inverted) {
+ [self setInverted:newScreenProps.inverted];
+ }
+ if (oldScreenProps.maximumValue != newScreenProps.maximumValue) {
+ [slider setMaximumValue:newScreenProps.maximumValue];
+ }
+ if (oldScreenProps.lowerLimit != newScreenProps.lowerLimit) {
+ slider.lowerLimit = newScreenProps.lowerLimit;
+ }
+ if (oldScreenProps.upperLimit != newScreenProps.upperLimit) {
+ slider.upperLimit = newScreenProps.upperLimit;
+ }
+ if (oldScreenProps.tapToSeek != newScreenProps.tapToSeek) {
+ slider.tapToSeek = newScreenProps.tapToSeek;
+ }
+ if (oldScreenProps.minimumValue != newScreenProps.minimumValue) {
+ [slider setMinimumValue:newScreenProps.minimumValue];
+ }
+ if (oldScreenProps.thumbTintColor != newScreenProps.thumbTintColor) {
+ slider.thumbTintColor = ABI49_0_0RCTUIColorFromSharedColor(newScreenProps.thumbTintColor);
+ }
+ if (oldScreenProps.minimumTrackTintColor != newScreenProps.minimumTrackTintColor) {
+ slider.minimumTrackTintColor = ABI49_0_0RCTUIColorFromSharedColor(newScreenProps.minimumTrackTintColor);
+ }
+ if (oldScreenProps.maximumTrackTintColor != newScreenProps.maximumTrackTintColor) {
+ slider.maximumTrackTintColor = ABI49_0_0RCTUIColorFromSharedColor(newScreenProps.maximumTrackTintColor);
+ }
+ if (oldScreenProps.accessibilityUnits != newScreenProps.accessibilityUnits) {
+ NSString *convertedAccessibilityUnits = [NSString stringWithCString:newScreenProps.accessibilityUnits.c_str()
+ encoding:[NSString defaultCStringEncoding]];
+ slider.accessibilityUnits = convertedAccessibilityUnits;
+ }
+ if (oldScreenProps.accessibilityIncrements != newScreenProps.accessibilityIncrements) {
+ id accessibilityIncrements = [NSArray new];
+ for (auto str : newScreenProps.accessibilityIncrements) {
+ [accessibilityIncrements addObject:[NSString stringWithUTF8String:str.c_str()]];
+ }
+ [slider setAccessibilityIncrements:accessibilityIncrements];
+ }
+ if (oldScreenProps.thumbImage != newScreenProps.thumbImage) {
+ [self loadImageFromImageSource:newScreenProps.thumbImage completionBlock:^(NSError *error, UIImage *image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [self->slider setThumbImage:image];
+ });
+ }
+ failureBlock:^{
+ [self->slider setThumbImage:nil];
+ }];
+ }
+ if (oldScreenProps.trackImage != newScreenProps.trackImage) {
+ [self loadImageFromImageSource:newScreenProps.trackImage completionBlock:^(NSError *error, UIImage *image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [self->slider setTrackImage:image];
+ });
+ }
+ failureBlock:^{
+ [self->slider setTrackImage:nil];
+ }];
+ }
+ if (oldScreenProps.minimumTrackImage != newScreenProps.minimumTrackImage) {
+ [self loadImageFromImageSource:newScreenProps.minimumTrackImage completionBlock:^(NSError *error, UIImage *image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [self->slider setMinimumTrackImage:image];
+ });
+ }
+ failureBlock:^{
+ [self->slider setMinimumTrackImage:nil];
+ }];
+ }
+ if (oldScreenProps.maximumTrackImage != newScreenProps.maximumTrackImage) {
+ [self loadImageFromImageSource:newScreenProps.maximumTrackImage completionBlock:^(NSError *error, UIImage *image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [self->slider setMaximumTrackImage:image];
+ });
+ }
+ failureBlock:^{
+ [self->slider setMaximumTrackImage:nil];
+ }];
+ }
+ [super updateProps:props oldProps:oldProps];
+}
+
+
+// TODO temporarily using bridge, workaround for https://github.com/reactwg/react-native-new-architecture/discussions/31#discussioncomment-2717047, rewrite when Meta comes with a solution.
+- (void)loadImageFromImageSource:(ImageSource)source completionBlock:(ABI49_0_0RNCLoadImageCompletionBlock)completionBlock failureBlock:(ABI49_0_0RNCLoadImageFailureBlock)failureBlock
+{
+ NSString *uri = [[NSString alloc] initWithUTF8String:source.uri.c_str()];
+ if ((BOOL)uri.length) {
+ [[[ABI49_0_0RCTBridge currentBridge] moduleForName:@"ImageLoader"]
+ loadImageWithURLRequest:NSURLRequestFromImageSource(source)
+ size:CGSizeMake(source.size.width, source.size.height)
+ scale:source.scale
+ clipped:NO
+ resizeMode:ABI49_0_0RCTResizeModeCover
+ progressBlock:nil
+ partialLoadBlock:nil
+ completionBlock:completionBlock];
+ } else {
+ failureBlock();
+ }
+}
+
+- (void)setInverted:(BOOL)inverted
+{
+ if (inverted) {
+ self.transform = CGAffineTransformMakeScale(-1, 1);
+ } else {
+ self.transform = CGAffineTransformMakeScale(1, 1);
+ }
+}
+
+@end
+
+Class ABI49_0_0RNCSliderCls(void)
+{
+ return ABI49_0_0RNCSliderComponentView.class;
+}
+
+#endif
diff --git a/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderManager.h b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderManager.h
new file mode 100644
index 00000000000000..246d67917b56e3
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderManager.h
@@ -0,0 +1,12 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+
+@interface ABI49_0_0RNCSliderManager : ABI49_0_0RCTViewManager
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderManager.m b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderManager.m
new file mode 100644
index 00000000000000..c1eadbc779aa13
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-community/slider/ios/ABI49_0_0RNCSliderManager.m
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "ABI49_0_0RNCSliderManager.h"
+
+#import
+#import
+#import "ABI49_0_0RNCSlider.h"
+#import
+
+@implementation ABI49_0_0RNCSliderManager
+{
+ BOOL _isSliding;
+}
+
+ABI49_0_0RCT_EXPORT_MODULE()
+
+- (UIView *)view
+{
+ ABI49_0_0RNCSlider *slider = [ABI49_0_0RNCSlider new];
+ [slider addTarget:self action:@selector(sliderValueChanged:)
+ forControlEvents:UIControlEventValueChanged];
+ [slider addTarget:self action:@selector(sliderTouchStart:)
+ forControlEvents:UIControlEventTouchDown];
+ [slider addTarget:self action:@selector(sliderTouchEnd:)
+ forControlEvents:(UIControlEventTouchUpInside |
+ UIControlEventTouchUpOutside |
+ UIControlEventTouchCancel)];
+
+ UITapGestureRecognizer *tapGesturer;
+ tapGesturer = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(tapHandler:)];
+ [tapGesturer setNumberOfTapsRequired: 1];
+ [slider addGestureRecognizer:tapGesturer];
+
+ return slider;
+}
+
+- (void)tapHandler:(UITapGestureRecognizer *)gesture {
+ if ([gesture.view class] != [ABI49_0_0RNCSlider class]) {
+ return;
+ }
+ ABI49_0_0RNCSlider *slider = (ABI49_0_0RNCSlider *)gesture.view;
+ slider.isSliding = _isSliding;
+
+ // Ignore this tap if in the middle of a slide.
+ if (_isSliding) {
+ return;
+ }
+
+ if (!slider.tapToSeek) {
+ return;
+ }
+
+ CGPoint touchPoint = [gesture locationInView:slider];
+ float rangeWidth = slider.maximumValue - slider.minimumValue;
+ float sliderPercent = touchPoint.x / slider.bounds.size.width;
+ slider.lastValue = slider.value;
+ float value = slider.minimumValue + (rangeWidth * sliderPercent);
+
+ [slider setValue:[slider discreteValue:value] animated: YES];
+
+ if (slider.onRNCSliderSlidingStart) {
+ slider.onRNCSliderSlidingStart(@{
+ @"value": @(slider.lastValue),
+ });
+ }
+
+ // Trigger onValueChange to address https://github.com/react-native-community/react-native-slider/issues/212
+ if (slider.onRNCSliderValueChange) {
+ slider.onRNCSliderValueChange(@{
+ @"value": @(slider.value),
+ });
+ }
+
+ if (slider.onRNCSliderSlidingComplete) {
+ slider.onRNCSliderSlidingComplete(@{
+ @"value": @(slider.value),
+ });
+ }
+}
+
+static void ABI49_0_0RNCSendSliderEvent(ABI49_0_0RNCSlider *sender, BOOL continuous, BOOL isSlidingStart)
+{
+ float value = [sender discreteValue:sender.value];
+
+ if (value < sender.lowerLimit) {
+ value = sender.lowerLimit;
+ [sender setValue:value animated:NO];
+ } else if (value > sender.upperLimit) {
+ value = sender.upperLimit;
+ [sender setValue:value animated:NO];
+ }
+
+ if(!sender.isSliding) {
+ [sender setValue:value animated:NO];
+ }
+
+ if (continuous) {
+ if (sender.onRNCSliderValueChange && sender.lastValue != value) {
+ sender.onRNCSliderValueChange(@{
+ @"value": @(value),
+ });
+ }
+ } else {
+ if (sender.onRNCSliderSlidingComplete && !isSlidingStart) {
+ sender.onRNCSliderSlidingComplete(@{
+ @"value": @(value),
+ });
+ }
+ if (sender.onRNCSliderSlidingStart && isSlidingStart) {
+ sender.onRNCSliderSlidingStart(@{
+ @"value": @(value),
+ });
+ }
+ }
+
+ sender.lastValue = value;
+}
+
+- (void)sliderValueChanged:(ABI49_0_0RNCSlider *)sender
+{
+ ABI49_0_0RNCSendSliderEvent(sender, YES, NO);
+}
+
+- (void)sliderTouchStart:(ABI49_0_0RNCSlider *)sender
+{
+ ABI49_0_0RNCSendSliderEvent(sender, NO, YES);
+ _isSliding = YES;
+ sender.isSliding = YES;
+}
+
+- (void)sliderTouchEnd:(ABI49_0_0RNCSlider *)sender
+{
+ ABI49_0_0RNCSendSliderEvent(sender, NO, NO);
+ _isSliding = NO;
+ sender.isSliding = NO;
+}
+
+ABI49_0_0RCT_CUSTOM_VIEW_PROPERTY(value, float, ABI49_0_0RNCSlider)
+{
+ if (!view.isSliding) {
+ view.value = [ABI49_0_0RCTConvert float:json];
+ }
+}
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(step, float);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(trackImage, UIImage);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(minimumTrackImage, UIImage);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(maximumTrackImage, UIImage);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(minimumValue, float);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(maximumValue, float);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(lowerLimit, float);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(upperLimit, float);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(minimumTrackTintColor, UIColor);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(maximumTrackTintColor, UIColor);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(onRNCSliderValueChange, ABI49_0_0RCTBubblingEventBlock);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(onRNCSliderSlidingStart, ABI49_0_0RCTBubblingEventBlock);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(onRNCSliderSlidingComplete, ABI49_0_0RCTBubblingEventBlock);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(thumbTintColor, UIColor);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(thumbImage, UIImage);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(inverted, BOOL);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(tapToSeek, BOOL);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(accessibilityUnits, NSString);
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(accessibilityIncrements, NSArray);
+
+ABI49_0_0RCT_CUSTOM_VIEW_PROPERTY(disabled, BOOL, ABI49_0_0RNCSlider)
+{
+ if (json) {
+ [view setDisabled: [ABI49_0_0RCTConvert BOOL:json]];
+ } else {
+ [view setDisabled: defaultView.enabled];
+ }
+}
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ABI49_0_0react-native-segmented-control.podspec.json b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ABI49_0_0react-native-segmented-control.podspec.json
new file mode 100644
index 00000000000000..07bb99b7d40f30
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ABI49_0_0react-native-segmented-control.podspec.json
@@ -0,0 +1,19 @@
+{
+ "name": "ABI49_0_0react-native-segmented-control",
+ "version": "2.4.1",
+ "summary": "ABI49_0_0React Native SegmentedControlIOS library",
+ "license": "MIT",
+ "authors": "M.Haris Baig",
+ "homepage": "https://github.com/react-native-segmented-control/segmented-control#readme",
+ "platforms": {
+ "ios": "9.0"
+ },
+ "source": {
+ "git": "https://github.com/react-native-segmented-control/segmented-control.git",
+ "tag": "2.4.1"
+ },
+ "source_files": "ios/**/*.{h,m}",
+ "dependencies": {
+ "ABI49_0_0React-Core": []
+ }
+}
diff --git a/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControl.h b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControl.h
new file mode 100644
index 00000000000000..1596e3cfe6384a
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControl.h
@@ -0,0 +1,15 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+#import
+
+@interface ABI49_0_0RNCSegmentedControl : UISegmentedControl
+@property(nonatomic, assign) NSInteger selectedIndex;
+@property(nonatomic, copy) ABI49_0_0RCTBubblingEventBlock onChange;
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControl.m b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControl.m
new file mode 100644
index 00000000000000..b3a2716f37c3b7
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControl.m
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "ABI49_0_0RNCSegmentedControl.h"
+
+#import
+#import
+#import
+
+@implementation ABI49_0_0RNCSegmentedControl
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ if ((self = [super initWithFrame:frame])) {
+ _selectedIndex = self.selectedSegmentIndex;
+ [self addTarget:self
+ action:@selector(didChange)
+ forControlEvents:UIControlEventValueChanged];
+ }
+ return self;
+}
+
+- (void)setValues:(NSArray *)values {
+ [self removeAllSegments];
+ for (id segment in values) {
+ if ([segment isKindOfClass:[NSMutableDictionary class]]){
+ UIImage *image = [[ABI49_0_0RCTConvert UIImage:segment] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+ [self insertSegmentWithImage:image
+ atIndex:self.numberOfSegments
+ animated:NO];
+ } else {
+ [self insertSegmentWithTitle:(NSString *)segment
+ atIndex:self.numberOfSegments
+ animated:NO];
+ }
+ }
+ super.selectedSegmentIndex = _selectedIndex;
+}
+
+- (void)setSelectedIndex:(NSInteger)selectedIndex {
+ _selectedIndex = selectedIndex;
+ super.selectedSegmentIndex = selectedIndex;
+}
+
+- (void)setBackgroundColor:(UIColor *)backgroundColor {
+#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
+ if (@available(iOS 13.0, *)) {
+ [super setBackgroundColor:backgroundColor];
+ }
+#endif
+}
+
+- (void)setTintColor:(UIColor *)tintColor {
+ [super setTintColor:tintColor];
+#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
+ if (@available(iOS 13.0, *)) {
+ [self setSelectedSegmentTintColor:tintColor];
+ NSDictionary *attributes = [NSDictionary
+ dictionaryWithObjectsAndKeys:tintColor, NSForegroundColorAttributeName,
+ nil];
+ NSDictionary *activeAttributes = [NSDictionary
+ dictionaryWithObjectsAndKeys:UIColor.labelColor,
+ NSForegroundColorAttributeName, nil];
+ [self setTitleTextAttributes:attributes forState:UIControlStateNormal];
+ [self setTitleTextAttributes:activeAttributes
+ forState:UIControlStateSelected];
+ }
+#endif
+}
+
+- (void)didChange {
+ _selectedIndex = self.selectedSegmentIndex;
+ if (_onChange) {
+ NSString *segmentTitle = [self titleForSegmentAtIndex:_selectedIndex];
+ _onChange(@{
+ @"value" : (segmentTitle) ? segmentTitle : [self imageForSegmentAtIndex:_selectedIndex],
+ @"selectedSegmentIndex" : @(_selectedIndex)
+ });
+ }
+}
+
+- (void)setAppearance:(NSString *)appearanceString {
+#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
+ if (@available(iOS 13.0, *)) {
+ if ([appearanceString isEqual:@"dark"]) {
+ [self setOverrideUserInterfaceStyle:UIUserInterfaceStyleDark];
+ } else if ([appearanceString isEqual:@"light"]) {
+ [self setOverrideUserInterfaceStyle:UIUserInterfaceStyleLight];
+ }
+ }
+#endif
+}
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControlManager.h b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControlManager.h
new file mode 100644
index 00000000000000..52e52a648c2fea
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControlManager.h
@@ -0,0 +1,12 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+
+@interface ABI49_0_0RNCSegmentedControlManager : ABI49_0_0RCTViewManager
+
+@end
diff --git a/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControlManager.m b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControlManager.m
new file mode 100644
index 00000000000000..79489f3ad25cd0
--- /dev/null
+++ b/ios/vendored/sdk49/@react-native-segmented-control/segmented-control/ios/ABI49_0_0RNCSegmentedControlManager.m
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "ABI49_0_0RNCSegmentedControlManager.h"
+
+#import "ABI49_0_0RNCSegmentedControl.h"
+#import
+#import
+
+@implementation ABI49_0_0RNCSegmentedControlManager
+
+ABI49_0_0RCT_EXPORT_MODULE()
+
+- (UIView *)view {
+ return [ABI49_0_0RNCSegmentedControl new];
+}
+
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(values, NSArray)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(selectedIndex, NSInteger)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(backgroundColor, UIColor)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(momentary, BOOL)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(enabled, BOOL)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(onChange, ABI49_0_0RCTBubblingEventBlock)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(appearance, NSString)
+
+ABI49_0_0RCT_CUSTOM_VIEW_PROPERTY(fontStyle, NSObject, ABI49_0_0RNCSegmentedControl) {
+#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
+ if (@available(iOS 13.0, *)) {
+ if (json) {
+ UIColor *color = json[@"color"] ? [ABI49_0_0RCTConvert UIColor:json[@"color"]]
+ : UIColor.labelColor;
+ NSInteger fontSize =
+ json[@"fontSize"] ? [ABI49_0_0RCTConvert NSInteger:json[@"fontSize"]] : 13.0;
+ UIFont *font = [UIFont systemFontOfSize:fontSize];
+ if (json[@"fontFamily"]) {
+ UIFont *tempFont = [UIFont fontWithName:json[@"fontFamily"]
+ size:fontSize];
+ if (tempFont != nil) {
+ font = tempFont;
+ }
+ }
+
+ NSDictionary *attributes = [NSDictionary
+ dictionaryWithObjectsAndKeys:font, NSFontAttributeName, color,
+ NSForegroundColorAttributeName, nil];
+ [view setTitleTextAttributes:attributes forState:UIControlStateNormal];
+ }
+ }
+#endif
+}
+
+ABI49_0_0RCT_CUSTOM_VIEW_PROPERTY(activeFontStyle, NSObject, ABI49_0_0RNCSegmentedControl) {
+#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
+ if (@available(iOS 13.0, *)) {
+ if (json) {
+ UIColor *color = json[@"color"] ? [ABI49_0_0RCTConvert UIColor:json[@"color"]]
+ : UIColor.labelColor;
+ NSInteger fontSize =
+ json[@"fontSize"] ? [ABI49_0_0RCTConvert NSInteger:json[@"fontSize"]] : 13.0;
+ UIFont *font = [UIFont boldSystemFontOfSize:fontSize];
+ if (json[@"fontFamily"]) {
+ font = [UIFont fontWithName:json[@"fontFamily"] size:fontSize];
+ }
+ NSDictionary *attributes = [NSDictionary
+ dictionaryWithObjectsAndKeys:font, NSFontAttributeName, color,
+ NSForegroundColorAttributeName, nil];
+ [view setTitleTextAttributes:attributes forState:UIControlStateSelected];
+ }
+ }
+#endif
+}
+
+@end
diff --git a/ios/vendored/sdk49/@shopify/flash-list/ABI49_0_0RNFlashList.podspec.json b/ios/vendored/sdk49/@shopify/flash-list/ABI49_0_0RNFlashList.podspec.json
new file mode 100644
index 00000000000000..2bc55bfbaec073
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/flash-list/ABI49_0_0RNFlashList.podspec.json
@@ -0,0 +1,31 @@
+{
+ "name": "ABI49_0_0RNFlashList",
+ "version": "1.4.3",
+ "summary": "FlashList is a more performant FlatList replacement",
+ "homepage": "https://shopify.github.io/flash-list/",
+ "license": "MIT",
+ "authors": "shopify",
+ "platforms": {
+ "ios": "11.0",
+ "tvos": "12.0"
+ },
+ "source": {
+ "git": "https://github.com/shopify/flash-list.git",
+ "tag": "v1.4.3"
+ },
+ "source_files": "ios/Sources/**/*",
+ "requires_arc": true,
+ "swift_versions": "5.0",
+ "dependencies": {
+ "ABI49_0_0React-Core": []
+ },
+ "testspecs": [
+ {
+ "name": "Tests",
+ "test_type": "unit",
+ "source_files": "ios/Tests/**/*",
+ "frameworks": "XCTest"
+ }
+ ],
+ "swift_version": "5.0"
+}
diff --git a/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/AutoLayoutView.swift b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/AutoLayoutView.swift
new file mode 100644
index 00000000000000..790fddb6fbe7b7
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/AutoLayoutView.swift
@@ -0,0 +1,276 @@
+import Foundation
+import UIKit
+
+
+/// Container for all RecyclerListView children. This will automatically remove all gaps and overlaps for GridLayouts with flexible spans.
+/// Note: This cannot work for masonry layouts i.e, pinterest like layout
+@objc class AutoLayoutView: UIView {
+ @objc(onBlankAreaEvent)
+ var onBlankAreaEvent: ABI49_0_0RCTDirectEventBlock?
+
+ @objc func setHorizontal(_ horizontal: Bool) {
+ self.horizontal = horizontal
+ }
+
+ @objc func setScrollOffset(_ scrollOffset: Int) {
+ self.scrollOffset = CGFloat(scrollOffset)
+ }
+
+ @objc func setWindowSize(_ windowSize: Int) {
+ self.windowSize = CGFloat(windowSize)
+ }
+
+ @objc func setRenderAheadOffset(_ renderAheadOffset: Int) {
+ self.renderAheadOffset = CGFloat(renderAheadOffset)
+ }
+
+ @objc func setEnableInstrumentation(_ enableInstrumentation: Bool) {
+ self.enableInstrumentation = enableInstrumentation
+ }
+
+ @objc func setDisableAutoLayout(_ disableAutoLayout: Bool) {
+ self.disableAutoLayout = disableAutoLayout
+ }
+
+ private var horizontal = false
+ private var scrollOffset: CGFloat = 0
+ private var windowSize: CGFloat = 0
+ private var renderAheadOffset: CGFloat = 0
+ private var enableInstrumentation = false
+ private var disableAutoLayout = false
+
+ /// Tracks where the last pixel is drawn in the overall
+ private var lastMaxBoundOverall: CGFloat = 0
+ /// Tracks where the last pixel is drawn in the visible window
+ private var lastMaxBound: CGFloat = 0
+ /// Tracks where first pixel is drawn in the visible window
+ private var lastMinBound: CGFloat = 0
+
+ override func layoutSubviews() {
+ fixLayout()
+ super.layoutSubviews()
+
+ guard enableInstrumentation, let scrollView = getScrollView() else { return }
+
+ let scrollContainerSize = horizontal ? scrollView.frame.width : scrollView.frame.height
+ let currentScrollOffset = horizontal ? scrollView.contentOffset.x : scrollView.contentOffset.y
+ let startOffset = horizontal ? frame.minX : frame.minY
+ let endOffset = horizontal ? frame.maxX : frame.maxY
+ let distanceFromWindowStart = max(startOffset - currentScrollOffset, 0)
+ let distanceFromWindowEnd = max(currentScrollOffset + scrollContainerSize - endOffset, 0)
+
+ let (blankOffsetStart, blankOffsetEnd) = computeBlankFromGivenOffset(
+ currentScrollOffset - startOffset,
+ filledBoundMin: lastMinBound,
+ filledBoundMax: lastMaxBound,
+ renderAheadOffset: renderAheadOffset,
+ windowSize: windowSize,
+ distanceFromWindowStart: distanceFromWindowStart,
+ distanceFromWindowEnd: distanceFromWindowEnd
+ )
+
+ onBlankAreaEvent?(
+ [
+ "offsetStart": blankOffsetStart,
+ "offsetEnd": blankOffsetEnd,
+ ]
+ )
+ }
+
+ func getScrollView() -> UIScrollView? {
+ return sequence(first: self, next: { $0.superview }).first(where: { $0 is UIScrollView }) as? UIScrollView
+ }
+
+ /// Sorts views by index and then invokes clearGaps which does the correction.
+ /// Performance: Sort is needed. Given relatively low number of views in RecyclerListView render tree this should be a non issue.
+ private func fixLayout() {
+ guard
+ subviews.count > 1,
+ // Fixing layout during animation can interfere with it.
+ layer.animationKeys()?.isEmpty ?? true,
+ !disableAutoLayout
+ else { return }
+ let cellContainers = subviews
+ .compactMap { subview -> CellContainer? in
+ if let cellContainer = subview as? CellContainer {
+ return cellContainer
+ } else {
+ assertionFailure("CellRendererComponent outer view should always be CellContainer. Learn more here: https://shopify.github.io/flash-list/docs/usage#cellrenderercomponent.")
+ return nil
+ }
+ }
+ .sorted(by: { $0.index < $1.index })
+ clearGaps(for: cellContainers)
+ fixFooter()
+ }
+
+ /// Checks for overlaps or gaps between adjacent items and then applies a correction.
+ /// Performance: RecyclerListView renders very small number of views and this is not going to trigger multiple layouts on the iOS side.
+ private func clearGaps(for cellContainers: [CellContainer]) {
+ var maxBound: CGFloat = 0
+ var minBound: CGFloat = CGFloat(Int.max)
+ var maxBoundNextCell: CGFloat = 0
+ let correctedScrollOffset = scrollOffset - (horizontal ? frame.minX : frame.minY)
+ lastMaxBoundOverall = 0
+ cellContainers.indices.dropLast().forEach { index in
+ let cellContainer = cellContainers[index]
+ let cellTop = cellContainer.frame.minY
+ let cellBottom = cellContainer.frame.maxY
+ let cellLeft = cellContainer.frame.minX
+ let cellRight = cellContainer.frame.maxX
+
+ let nextCell = cellContainers[index + 1]
+ let nextCellTop = nextCell.frame.minY
+ let nextCellLeft = nextCell.frame.minX
+
+ // Only apply correction if the next cell is consecutive.
+ let isNextCellConsecutive = nextCell.index == cellContainer.index + 1
+
+ guard
+ isWithinBounds(
+ cellContainer,
+ scrollOffset: correctedScrollOffset,
+ renderAheadOffset: renderAheadOffset,
+ windowSize: windowSize,
+ isHorizontal: horizontal
+ )
+ else {
+ updateLastMaxBoundOverall(currentCell: cellContainer, nextCell: nextCell)
+ return
+ }
+ let isNextCellVisible = isWithinBounds(
+ nextCell,
+ scrollOffset: correctedScrollOffset,
+ renderAheadOffset: renderAheadOffset,
+ windowSize: windowSize,
+ isHorizontal: horizontal
+ )
+
+ if horizontal {
+ maxBound = max(maxBound, cellRight)
+ minBound = min(minBound, cellLeft)
+ maxBoundNextCell = maxBound
+ if isNextCellConsecutive {
+ if cellTop < nextCellTop {
+ if cellBottom != nextCellTop {
+ nextCell.frame.origin.y = cellBottom
+ }
+ if cellLeft != nextCellLeft {
+ nextCell.frame.origin.x = cellLeft
+ }
+ } else {
+ nextCell.frame.origin.x = maxBound
+ }
+ }
+ if isNextCellVisible {
+ maxBoundNextCell = max(maxBound, nextCell.frame.maxX)
+ }
+ } else {
+ maxBound = max(maxBound, cellBottom)
+ minBound = min(minBound, cellTop)
+ maxBoundNextCell = maxBound
+ if isNextCellConsecutive {
+ if cellLeft < nextCellLeft {
+ if cellRight != nextCellLeft {
+ nextCell.frame.origin.x = cellRight
+ }
+ if cellTop != nextCellTop {
+ nextCell.frame.origin.y = cellTop
+ }
+ } else {
+ nextCell.frame.origin.y = maxBound
+ }
+ }
+ if isNextCellVisible {
+ maxBoundNextCell = max(maxBound, nextCell.frame.maxY)
+ }
+ }
+ updateLastMaxBoundOverall(currentCell: cellContainer, nextCell: nextCell)
+ }
+
+ lastMaxBound = maxBoundNextCell
+ lastMinBound = minBound
+ }
+
+ private func updateLastMaxBoundOverall(currentCell: CellContainer, nextCell: CellContainer) {
+ lastMaxBoundOverall = max(lastMaxBoundOverall, horizontal ? currentCell.frame.maxX : currentCell.frame.maxY, horizontal ? nextCell.frame.maxX : nextCell.frame.maxY)
+ }
+
+ func computeBlankFromGivenOffset(
+ _ actualScrollOffset: CGFloat,
+ filledBoundMin: CGFloat,
+ filledBoundMax: CGFloat,
+ renderAheadOffset: CGFloat,
+ windowSize: CGFloat,
+ distanceFromWindowStart: CGFloat,
+ distanceFromWindowEnd: CGFloat
+ ) -> (
+ offsetStart: CGFloat,
+ offsetEnd: CGFloat
+ ) {
+ let blankOffsetStart = filledBoundMin - actualScrollOffset - distanceFromWindowStart
+
+ let blankOffsetEnd = actualScrollOffset + windowSize - renderAheadOffset - filledBoundMax - distanceFromWindowEnd
+
+ return (blankOffsetStart, blankOffsetEnd)
+ }
+
+ /// It's important to avoid correcting views outside the render window. An item that isn't being recycled might still remain in the view tree. If views outside get considered then gaps between unused items will cause algorithm to fail.
+ func isWithinBounds(
+ _ cellContainer: CellContainer,
+ scrollOffset: CGFloat,
+ renderAheadOffset: CGFloat,
+ windowSize: CGFloat,
+ isHorizontal: Bool
+ ) -> Bool {
+ let boundsStart = scrollOffset - renderAheadOffset
+ let boundsEnd = scrollOffset + windowSize
+ let cellFrame = cellContainer.frame
+
+ if isHorizontal {
+ return (cellFrame.minX >= boundsStart || cellFrame.maxX >= boundsStart) && (cellFrame.minX <= boundsEnd || cellFrame.maxX <= boundsEnd)
+ } else {
+ return (cellFrame.minY >= boundsStart || cellFrame.maxY >= boundsStart) && (cellFrame.minY <= boundsEnd || cellFrame.maxY <= boundsEnd)
+ }
+ }
+
+ /// Fixes footer position along with rest of the items
+ private func fixFooter() {
+ guard !disableAutoLayout, let parentScrollView = getScrollView() else {
+ return
+ }
+
+ let isAutoLayoutEndVisible = horizontal ? frame.maxX <= parentScrollView.frame.width : frame.maxY <= parentScrollView.frame.height
+ guard isAutoLayoutEndVisible, let footer = footer() else {
+ return
+ }
+
+ let diff = footerDiff()
+ guard diff != 0 else { return }
+
+ if horizontal {
+ footer.frame.origin.x += diff
+ frame.size.width += diff
+ superview?.frame.size.width += diff
+ } else {
+ footer.frame.origin.y += diff
+ frame.size.height += diff
+ superview?.frame.size.height += diff
+ }
+ }
+
+ private func footerDiff() -> CGFloat {
+ if subviews.count == 0 {
+ lastMaxBoundOverall = 0
+ } else if subviews.count == 1 {
+ let firstChild = subviews[0]
+ lastMaxBoundOverall = horizontal ? firstChild.frame.maxX : firstChild.frame.maxY
+ }
+ let autoLayoutEnd = horizontal ? frame.width : frame.height
+ return lastMaxBoundOverall - autoLayoutEnd
+ }
+
+ private func footer() -> UIView? {
+ return superview?.subviews.first(where:{($0 as? CellContainer)?.index == -1})
+ }
+}
diff --git a/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.m b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.m
new file mode 100644
index 00000000000000..393b17e14c95e2
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.m
@@ -0,0 +1,14 @@
+#import
+#import
+
+@interface ABI49_0_0RCT_EXTERN_REMAP_MODULE(AutoLayoutViewManager, ABI49_0_0AutoLayoutViewManager, ABI49_0_0RCTViewManager)
+
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(horizontal, BOOL)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(scrollOffset, NSInteger)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(windowSize, NSInteger)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(renderAheadOffset, NSInteger)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(enableInstrumentation, BOOL)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(disableAutoLayout, BOOL)
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(onBlankAreaEvent, ABI49_0_0RCTDirectEventBlock)
+
+@end
diff --git a/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.swift b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.swift
new file mode 100644
index 00000000000000..fc6b78f2896526
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.swift
@@ -0,0 +1,12 @@
+import Foundation
+
+@objc(ABI49_0_0AutoLayoutViewManager)
+class AutoLayoutViewManager: ABI49_0_0RCTViewManager {
+ override func view() -> UIView! {
+ return AutoLayoutView()
+ }
+
+ override static func requiresMainQueueSetup() -> Bool {
+ return true
+ }
+}
diff --git a/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/CellContainer.swift b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/CellContainer.swift
new file mode 100644
index 00000000000000..7f09ce767f7be3
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/CellContainer.swift
@@ -0,0 +1,9 @@
+import Foundation
+
+@objc class CellContainer: UIView {
+ var index: Int = -1
+
+ @objc func setIndex(_ index: Int) {
+ self.index = index
+ }
+}
diff --git a/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/CellContainerManager.m b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/CellContainerManager.m
new file mode 100644
index 00000000000000..e40bcf0ee5b7a8
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/CellContainerManager.m
@@ -0,0 +1,8 @@
+#import
+#import
+
+@interface ABI49_0_0RCT_EXTERN_REMAP_MODULE(CellContainerManager, ABI49_0_0CellContainerManager, ABI49_0_0RCTViewManager)
+
+ABI49_0_0RCT_EXPORT_VIEW_PROPERTY(index, NSInteger)
+
+@end
diff --git a/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/CellContainerManager.swift b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/CellContainerManager.swift
new file mode 100644
index 00000000000000..7185db4d0bbea4
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/CellContainerManager.swift
@@ -0,0 +1,12 @@
+import Foundation
+
+@objc(ABI49_0_0CellContainerManager)
+class CellContainerManager: ABI49_0_0RCTViewManager {
+ override func view() -> UIView! {
+ return CellContainer()
+ }
+
+ override static func requiresMainQueueSetup() -> Bool {
+ return true
+ }
+}
diff --git a/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/FlatListPro-Bridging-Header.h b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/FlatListPro-Bridging-Header.h
new file mode 100644
index 00000000000000..8c899a35215650
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/flash-list/ios/Sources/FlatListPro-Bridging-Header.h
@@ -0,0 +1,8 @@
+#ifndef FlatListPro_Bridging_Header_h
+#define FlatListPro_Bridging_Header_h
+
+#import
+#import
+#import
+
+#endif /* FlatListPro_Bridging_Header_h */
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/ABI49_0_0react-native-skia.podspec.json b/ios/vendored/sdk49/@shopify/react-native-skia/ABI49_0_0react-native-skia.podspec.json
new file mode 100644
index 00000000000000..a1a94258214771
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/ABI49_0_0react-native-skia.podspec.json
@@ -0,0 +1,39 @@
+{
+ "name": "ABI49_0_0react-native-skia",
+ "version": "0.1.195",
+ "summary": "High-performance ABI49_0_0React Native Graphics using Skia",
+ "description": "@shopify/react-native-skia",
+ "homepage": "https://github.com/shopify/react-native-skia",
+ "license": "MIT",
+ "authors": {
+ "Your Name": "yourname@email.com"
+ },
+ "platforms": {
+ "ios": "9.0"
+ },
+ "source": {
+ "git": "https://github.com/shopify/react-native-skia/react-native-skia.git",
+ "tag": "0.1.195"
+ },
+ "requires_arc": true,
+ "pod_target_xcconfig": {
+ "GCC_PREPROCESSOR_DEFINITIONS": "$(inherited) SK_METAL=1 SK_GANESH=1",
+ "CLANG_CXX_LANGUAGE_STANDARD": "c++17",
+ "DEFINES_MODULE": "YES",
+ "HEADER_SEARCH_PATHS": "\"$(PODS_TARGET_SRCROOT)/cpp/\"/** \"$(PODS_ROOT)/Headers/Private/ABI49_0_0React-bridging/react/bridging\" \"$(PODS_CONFIGURATION_BUILD_DIR)/ABI49_0_0React-bridging/react_bridging.framework/Headers\""
+ },
+ "frameworks": [
+ "GLKit",
+ "MetalKit"
+ ],
+ "ios": {},
+ "source_files": [
+ "ios/**/*.{h,c,cc,cpp,m,mm,swift}",
+ "cpp/**/*.{h,cpp}"
+ ],
+ "dependencies": {
+ "ABI49_0_0React": [],
+ "ABI49_0_0React-callinvoker": [],
+ "ABI49_0_0React-Core": []
+ }
+}
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkApi.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkApi.h
new file mode 100644
index 00000000000000..6a6edf68396158
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkApi.h
@@ -0,0 +1,105 @@
+#pragma once
+
+#include
+
+#include "ABI49_0_0RNSkPlatformContext.h"
+
+#include "JsiSkHostObjects.h"
+
+#include "JsiSkColor.h"
+#include "JsiSkColorFilter.h"
+#include "JsiSkColorFilterFactory.h"
+#include "JsiSkContourMeasureIter.h"
+#include "JsiSkDataFactory.h"
+#include "JsiSkFont.h"
+#include "JsiSkImage.h"
+#include "JsiSkImageFactory.h"
+#include "JsiSkImageFilter.h"
+#include "JsiSkImageFilterFactory.h"
+#include "JsiSkMaskFilter.h"
+#include "JsiSkMaskFilterFactory.h"
+#include "JsiSkMatrix.h"
+#include "JsiSkPaint.h"
+#include "JsiSkPath.h"
+#include "JsiSkPathEffect.h"
+#include "JsiSkPathEffectFactory.h"
+#include "JsiSkPathFactory.h"
+#include "JsiSkPictureFactory.h"
+#include "JsiSkPictureRecorder.h"
+#include "JsiSkPoint.h"
+#include "JsiSkRRect.h"
+#include "JsiSkRSXform.h"
+#include "JsiSkRect.h"
+#include "JsiSkRuntimeEffect.h"
+#include "JsiSkRuntimeEffectFactory.h"
+#include "JsiSkRuntimeShaderBuilder.h"
+#include "JsiSkSVG.h"
+#include "JsiSkSVGFactory.h"
+#include "JsiSkShader.h"
+#include "JsiSkShaderFactory.h"
+#include "JsiSkSurfaceFactory.h"
+#include "JsiSkTextBlobFactory.h"
+#include "JsiSkTypeface.h"
+#include "JsiSkTypefaceFactory.h"
+#include "JsiSkVertices.h"
+
+namespace ABI49_0_0RNSkia {
+
+namespace jsi = ABI49_0_0facebook::jsi;
+
+class JsiSkApi : public JsiSkHostObject {
+public:
+ /**
+ * Constructs the Skia Api object that can be installed into a runtime
+ * and provide functions for accessing and creating the Skia wrapper objects
+ * @param context Platform context
+ */
+ JsiSkApi(jsi::Runtime &runtime, std::shared_ptr context)
+ : JsiSkHostObject(context) {
+
+ installFunction("Font", JsiSkFont::createCtor(context));
+ installFunction("Paint", JsiSkPaint::createCtor(context));
+ installFunction("RSXform", JsiSkRSXform::createCtor(context));
+ installFunction("Matrix", JsiSkMatrix::createCtor(context));
+ installFunction("XYWHRect", JsiSkRect::createCtor(context));
+ installFunction("RRectXY", JsiSkRRect::createCtor(context));
+ installFunction("Point", JsiSkPoint::createCtor(context));
+ installFunction("RuntimeShaderBuilder",
+ JsiSkRuntimeShaderBuilder::createCtor(context));
+ installFunction("ContourMeasureIter",
+ JsiSkContourMeasureIter::createCtor(context));
+ installFunction("MakeVertices", JsiSkVertices::createCtor(context));
+ installFunction("PictureRecorder",
+ JsiSkPictureRecorder::createCtor(context));
+ installFunction("Color", JsiSkColor::createCtor());
+
+ installReadonlyProperty("SVG", std::make_shared(context));
+ installReadonlyProperty("Image",
+ std::make_shared(context));
+ installReadonlyProperty("Typeface",
+ std::make_shared(context));
+ installReadonlyProperty("Data",
+ std::make_shared(context));
+ installReadonlyProperty("ImageFilter",
+ std::make_shared(context));
+ installReadonlyProperty("PathEffect",
+ std::make_shared(context));
+ installReadonlyProperty("Path",
+ std::make_shared(context));
+ installReadonlyProperty("ColorFilter",
+ std::make_shared(context));
+ installReadonlyProperty("MaskFilter",
+ std::make_shared(context));
+ installReadonlyProperty(
+ "RuntimeEffect", std::make_shared(context));
+ installReadonlyProperty("Shader",
+ std::make_shared(context));
+ installReadonlyProperty("TextBlob",
+ std::make_shared(context));
+ installReadonlyProperty("Surface",
+ std::make_shared(context));
+ installReadonlyProperty("Picture",
+ std::make_shared(context));
+ }
+};
+} // namespace ABI49_0_0RNSkia
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkCanvas.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkCanvas.h
new file mode 100644
index 00000000000000..573b62552f3d36
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkCanvas.h
@@ -0,0 +1,548 @@
+#pragma once
+
+#include
+#include
+#include
+
+#include "JsiSkFont.h"
+#include "JsiSkHostObjects.h"
+#include "JsiSkImage.h"
+#include "JsiSkMatrix.h"
+#include "JsiSkPaint.h"
+#include "JsiSkPath.h"
+#include "JsiSkPicture.h"
+#include "JsiSkPoint.h"
+#include "JsiSkRRect.h"
+#include "JsiSkSVG.h"
+#include "JsiSkTextBlob.h"
+#include "JsiSkVertices.h"
+
+#include
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdocumentation"
+
+#include "SkCanvas.h"
+#include "SkFont.h"
+#include "SkPaint.h"
+#include "SkPath.h"
+#include "SkPicture.h"
+#include "SkRegion.h"
+#include "SkSurface.h"
+#include "SkTypeface.h"
+
+#pragma clang diagnostic pop
+
+namespace ABI49_0_0RNSkia {
+namespace jsi = ABI49_0_0facebook::jsi;
+
+class JsiSkCanvas : public JsiSkHostObject {
+public:
+ JSI_HOST_FUNCTION(drawPaint) {
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[0]);
+ _canvas->drawPaint(*paint);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawLine) {
+ SkScalar x1 = arguments[0].asNumber();
+ SkScalar y1 = arguments[1].asNumber();
+ SkScalar x2 = arguments[2].asNumber();
+ SkScalar y2 = arguments[3].asNumber();
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[4]);
+ _canvas->drawLine(x1, y1, x2, y2, *paint);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawRect) {
+ auto rect = JsiSkRect::fromValue(runtime, arguments[0]);
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[1]);
+ _canvas->drawRect(*rect, *paint);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawImage) {
+ auto image = JsiSkImage::fromValue(runtime, arguments[0]);
+ auto x = arguments[1].asNumber();
+ auto y = arguments[2].asNumber();
+ std::shared_ptr paint;
+ if (count == 4) {
+ paint = JsiSkPaint::fromValue(runtime, arguments[3]);
+ }
+ _canvas->drawImage(image, x, y, SkSamplingOptions(), paint.get());
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawImageRect) {
+ auto image = JsiSkImage::fromValue(runtime, arguments[0]);
+ auto src = JsiSkRect::fromValue(runtime, arguments[1]);
+ auto dest = JsiSkRect::fromValue(runtime, arguments[2]);
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[3]);
+ auto fastSample = count < 5 ? false : arguments[4].getBool();
+ _canvas->drawImageRect(image, *src, *dest, SkSamplingOptions(), paint.get(),
+ fastSample ? SkCanvas::kFast_SrcRectConstraint
+ : SkCanvas::kStrict_SrcRectConstraint);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawImageCubic) {
+ auto image = JsiSkImage::fromValue(runtime, arguments[0]);
+ auto x = arguments[1].asNumber();
+ auto y = arguments[2].asNumber();
+ float B = arguments[3].asNumber();
+ float C = arguments[4].asNumber();
+ std::shared_ptr paint;
+ if (count == 6) {
+ if (!arguments[5].isNull()) {
+ paint = JsiSkPaint::fromValue(runtime, arguments[5]);
+ }
+ }
+ _canvas->drawImage(image, x, y, SkSamplingOptions({B, C}), paint.get());
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawImageOptions) {
+ auto image = JsiSkImage::fromValue(runtime, arguments[0]);
+ auto x = arguments[1].asNumber();
+ auto y = arguments[2].asNumber();
+ auto fm = (SkFilterMode)arguments[3].asNumber();
+ auto mm = (SkMipmapMode)arguments[4].asNumber();
+ std::shared_ptr paint;
+ if (count == 6) {
+ if (!arguments[5].isNull()) {
+ paint = JsiSkPaint::fromValue(runtime, arguments[5]);
+ }
+ }
+ _canvas->drawImage(image, x, y, SkSamplingOptions(fm, mm), paint.get());
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawImageNine) {
+ auto image = JsiSkImage::fromValue(runtime, arguments[0]);
+ auto center = JsiSkRect::fromValue(runtime, arguments[1]);
+ auto dest = JsiSkRect::fromValue(runtime, arguments[2]);
+ auto fm = (SkFilterMode)arguments[3].asNumber();
+ std::shared_ptr paint;
+ if (count == 5) {
+ if (!arguments[4].isNull()) {
+ paint = JsiSkPaint::fromValue(runtime, arguments[4]);
+ }
+ }
+ _canvas->drawImageNine(image.get(), center->round(), *dest, fm,
+ paint.get());
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawImageRectCubic) {
+ auto image = JsiSkImage::fromValue(runtime, arguments[0]);
+ auto src = JsiSkRect::fromValue(runtime, arguments[1]);
+ auto dest = JsiSkRect::fromValue(runtime, arguments[2]);
+ float B = arguments[3].asNumber();
+ float C = arguments[4].asNumber();
+ std::shared_ptr paint;
+ if (count == 6) {
+ if (!arguments[5].isNull()) {
+ paint = JsiSkPaint::fromValue(runtime, arguments[5]);
+ }
+ }
+ auto constraint =
+ SkCanvas::kStrict_SrcRectConstraint; // TODO: get from caller
+ _canvas->drawImageRect(image.get(), *src, *dest, SkSamplingOptions({B, C}),
+ paint.get(), constraint);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawImageRectOptions) {
+ auto image = JsiSkImage::fromValue(runtime, arguments[0]);
+ auto src = JsiSkRect::fromValue(runtime, arguments[1]);
+ auto dest = JsiSkRect::fromValue(runtime, arguments[2]);
+ auto filter = (SkFilterMode)arguments[3].asNumber();
+ auto mipmap = (SkMipmapMode)arguments[4].asNumber();
+ std::shared_ptr paint;
+ if (count == 6) {
+ if (!arguments[5].isNull()) {
+ paint = JsiSkPaint::fromValue(runtime, arguments[5]);
+ }
+ }
+ auto constraint = SkCanvas::kStrict_SrcRectConstraint;
+ _canvas->drawImageRect(image.get(), *src, *dest, {filter, mipmap},
+ paint.get(), constraint);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawCircle) {
+ SkScalar cx = arguments[0].asNumber();
+ SkScalar cy = arguments[1].asNumber();
+ SkScalar radius = arguments[2].asNumber();
+
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[3]);
+ _canvas->drawCircle(cx, cy, radius, *paint);
+
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawArc) {
+ auto oval = JsiSkRect::fromValue(runtime, arguments[0]);
+
+ SkScalar startAngle = arguments[1].asNumber();
+ SkScalar sweepAngle = arguments[2].asNumber();
+ bool useCenter = arguments[3].getBool();
+
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[4]);
+ _canvas->drawArc(*oval, startAngle, sweepAngle, useCenter, *paint);
+
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawRRect) {
+ auto rect = JsiSkRRect::fromValue(runtime, arguments[0]);
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[1]);
+
+ _canvas->drawRRect(*rect, *paint);
+
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawDRRect) {
+ auto outer = JsiSkRRect::fromValue(runtime, arguments[0]);
+ auto inner = JsiSkRRect::fromValue(runtime, arguments[1]);
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[2]);
+
+ _canvas->drawDRRect(*outer, *inner, *paint);
+
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawOval) {
+ auto rect = JsiSkRect::fromValue(runtime, arguments[0]);
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[1]);
+
+ _canvas->drawOval(*rect, *paint);
+
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(restoreToCount) {
+ auto c = arguments[0].asNumber();
+ _canvas->restoreToCount(c);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(getSaveCount) {
+ return static_cast(_canvas->getSaveCount());
+ }
+
+ JSI_HOST_FUNCTION(drawPoints) {
+ auto pointMode = arguments[0].asNumber();
+ std::vector points;
+
+ auto jsiPoints = arguments[1].asObject(runtime).asArray(runtime);
+ auto pointsSize = jsiPoints.size(runtime);
+ points.reserve(pointsSize);
+
+ for (int i = 0; i < pointsSize; i++) {
+ std::shared_ptr point = JsiSkPoint::fromValue(
+ runtime, jsiPoints.getValueAtIndex(runtime, i).asObject(runtime));
+ points.push_back(*point.get());
+ }
+
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[2]);
+
+ _canvas->drawPoints((SkCanvas::PointMode)pointMode, pointsSize,
+ points.data(), *paint);
+
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawVertices) {
+ auto vertices = JsiSkVertices::fromValue(runtime, arguments[0]);
+ auto blendMode = (SkBlendMode)arguments[1].getNumber();
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[2]);
+ _canvas->drawVertices(vertices, blendMode, *paint);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawPatch) {
+ std::vector cubics;
+ std::vector colors;
+ std::vector texs;
+
+ auto jsiCubics = arguments[0].asObject(runtime).asArray(runtime);
+ auto cubicsSize = jsiCubics.size(runtime);
+ cubics.reserve(cubicsSize);
+ for (int i = 0; i < cubicsSize; i++) {
+ std::shared_ptr point = JsiSkPoint::fromValue(
+ runtime, jsiCubics.getValueAtIndex(runtime, i).asObject(runtime));
+ cubics.push_back(*point.get());
+ }
+
+ if (count >= 2 && !arguments[1].isNull() && !arguments[1].isUndefined()) {
+ auto jsiColors = arguments[1].asObject(runtime).asArray(runtime);
+ auto colorsSize = jsiColors.size(runtime);
+ colors.reserve(colorsSize);
+ for (int i = 0; i < colorsSize; i++) {
+ SkColor color = JsiSkColor::fromValue(
+ runtime, jsiColors.getValueAtIndex(runtime, i));
+ colors.push_back(color);
+ }
+ }
+
+ if (count >= 3 && !arguments[2].isNull() && !arguments[2].isUndefined()) {
+ auto jsiTexs = arguments[2].asObject(runtime).asArray(runtime);
+ auto texsSize = jsiTexs.size(runtime);
+ texs.reserve(texsSize);
+ for (int i = 0; i < texsSize; i++) {
+ auto point = JsiSkPoint::fromValue(
+ runtime, jsiTexs.getValueAtIndex(runtime, i).asObject(runtime));
+ texs.push_back(*point.get());
+ }
+ }
+
+ auto paint =
+ count >= 4 ? JsiSkPaint::fromValue(runtime, arguments[4]) : nullptr;
+ auto blendMode = static_cast(arguments[3].asNumber());
+ _canvas->drawPatch(cubics.data(), colors.data(), texs.data(), blendMode,
+ *paint);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawPath) {
+ auto path = JsiSkPath::fromValue(runtime, arguments[0]);
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[1]);
+
+ _canvas->drawPath(*path, *paint);
+
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawText) {
+ auto textVal = arguments[0].asString(runtime).utf8(runtime);
+ auto text = textVal.c_str();
+ SkScalar x = arguments[1].asNumber();
+ SkScalar y = arguments[2].asNumber();
+
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[3]);
+ auto font = JsiSkFont::fromValue(runtime, arguments[4]);
+
+ _canvas->drawSimpleText(text, strlen(text), SkTextEncoding::kUTF8, x, y,
+ *font, *paint);
+
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawTextBlob) {
+ auto blob = JsiSkTextBlob::fromValue(runtime, arguments[0]);
+ SkScalar x = arguments[1].asNumber();
+ SkScalar y = arguments[2].asNumber();
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[3]);
+ _canvas->drawTextBlob(blob, x, y, *paint);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawGlyphs) {
+ auto jsiGlyphs = arguments[0].asObject(runtime).asArray(runtime);
+ auto jsiPositions = arguments[1].asObject(runtime).asArray(runtime);
+ auto x = arguments[2].asNumber();
+ auto y = arguments[3].asNumber();
+ auto font = JsiSkFont::fromValue(runtime, arguments[4]);
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[5]);
+ SkPoint origin = SkPoint::Make(x, y);
+
+ std::vector positions;
+ int pointsSize = static_cast(jsiPositions.size(runtime));
+ positions.reserve(pointsSize);
+ for (int i = 0; i < pointsSize; i++) {
+ std::shared_ptr point = JsiSkPoint::fromValue(
+ runtime, jsiPositions.getValueAtIndex(runtime, i).asObject(runtime));
+ positions.push_back(*point.get());
+ }
+
+ std::vector glyphs;
+ int glyphsSize = static_cast(jsiGlyphs.size(runtime));
+ glyphs.reserve(glyphsSize);
+ for (int i = 0; i < glyphsSize; i++) {
+ glyphs.push_back(jsiGlyphs.getValueAtIndex(runtime, i).asNumber());
+ }
+
+ _canvas->drawGlyphs(glyphsSize, glyphs.data(), positions.data(), origin,
+ *font, *paint);
+
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawSvg) {
+ auto svgdom = JsiSkSVG::fromValue(runtime, arguments[0]);
+ if (count == 3) {
+ // read size
+ auto w = arguments[1].asNumber();
+ auto h = arguments[2].asNumber();
+ svgdom->setContainerSize(SkSize::Make(w, h));
+ } else {
+ auto canvasSize = _canvas->getBaseLayerSize();
+ svgdom->setContainerSize(SkSize::Make(canvasSize));
+ }
+ svgdom->render(_canvas);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(clipPath) {
+ auto path = JsiSkPath::fromValue(runtime, arguments[0]);
+ auto op = (SkClipOp)arguments[1].asNumber();
+ auto doAntiAlias = arguments[2].getBool();
+ _canvas->clipPath(*path, op, doAntiAlias);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(clipRect) {
+ auto rect = JsiSkRect::fromValue(runtime, arguments[0]);
+ auto op = (SkClipOp)arguments[1].asNumber();
+ auto doAntiAlias = arguments[2].getBool();
+ _canvas->clipRect(*rect, op, doAntiAlias);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(clipRRect) {
+ auto rrect = JsiSkRRect::fromValue(runtime, arguments[0]);
+ auto op = (SkClipOp)arguments[1].asNumber();
+ auto doAntiAlias = arguments[2].getBool();
+ _canvas->clipRRect(*rrect, op, doAntiAlias);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(save) { return jsi::Value(_canvas->save()); }
+
+ JSI_HOST_FUNCTION(saveLayer) {
+ SkPaint *paint = (count >= 1 && !arguments[0].isUndefined())
+ ? JsiSkPaint::fromValue(runtime, arguments[0]).get()
+ : nullptr;
+ SkRect *bounds =
+ count >= 2 && !arguments[1].isNull() && !arguments[1].isUndefined()
+ ? JsiSkRect::fromValue(runtime, arguments[1]).get()
+ : nullptr;
+ SkImageFilter *backdrop =
+ count >= 3 && !arguments[2].isNull() && !arguments[2].isUndefined()
+ ? JsiSkImageFilter::fromValue(runtime, arguments[2]).get()
+ : nullptr;
+ SkCanvas::SaveLayerFlags flags = count >= 4 ? arguments[3].asNumber() : 0;
+ return jsi::Value(_canvas->saveLayer(
+ SkCanvas::SaveLayerRec(bounds, paint, backdrop, flags)));
+ }
+
+ JSI_HOST_FUNCTION(restore) {
+ _canvas->restore();
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(rotate) {
+ SkScalar degrees = arguments[0].asNumber();
+ SkScalar rx = arguments[1].asNumber();
+ SkScalar ry = arguments[2].asNumber();
+ _canvas->rotate(degrees, rx, ry);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(translate) {
+ SkScalar dx = arguments[0].asNumber();
+ SkScalar dy = arguments[1].asNumber();
+ _canvas->translate(dx, dy);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(scale) {
+ SkScalar sx = arguments[0].asNumber();
+ SkScalar sy = arguments[1].asNumber();
+ _canvas->scale(sx, sy);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(skew) {
+ SkScalar sx = arguments[0].asNumber();
+ SkScalar sy = arguments[1].asNumber();
+ _canvas->skew(sx, sy);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawColor) {
+ SkColor cl = JsiSkColor::fromValue(runtime, arguments[0]);
+ if (count == 1) {
+ _canvas->drawColor(cl);
+ } else {
+ auto mode = static_cast(arguments[1].asNumber());
+ _canvas->drawColor(cl, mode);
+ }
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(clear) {
+ SkColor cl = JsiSkColor::fromValue(runtime, arguments[0]);
+ _canvas->clear(cl);
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(concat) {
+ auto matrix = JsiSkMatrix::fromValue(runtime, arguments[0]);
+ _canvas->concat(*matrix.get());
+ return jsi::Value::undefined();
+ }
+
+ JSI_HOST_FUNCTION(drawPicture) {
+ auto picture = JsiSkPicture::fromValue(runtime, arguments[0]);
+ _canvas->drawPicture(picture);
+ return jsi::Value::undefined();
+ }
+
+ JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkCanvas, drawPaint),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawLine),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawRect),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawImage),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawImageRect),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawImageCubic),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawImageOptions),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawImageNine),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawImageRectCubic),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawImageRectOptions),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawCircle),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawArc),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawRRect),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawDRRect),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawOval),
+ JSI_EXPORT_FUNC(JsiSkCanvas, restoreToCount),
+ JSI_EXPORT_FUNC(JsiSkCanvas, getSaveCount),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawPoints),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawPatch),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawPath),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawVertices),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawText),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawTextBlob),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawGlyphs),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawSvg),
+ JSI_EXPORT_FUNC(JsiSkCanvas, clipPath),
+ JSI_EXPORT_FUNC(JsiSkCanvas, clipRect),
+ JSI_EXPORT_FUNC(JsiSkCanvas, clipRRect),
+ JSI_EXPORT_FUNC(JsiSkCanvas, save),
+ JSI_EXPORT_FUNC(JsiSkCanvas, saveLayer),
+ JSI_EXPORT_FUNC(JsiSkCanvas, restore),
+ JSI_EXPORT_FUNC(JsiSkCanvas, rotate),
+ JSI_EXPORT_FUNC(JsiSkCanvas, translate),
+ JSI_EXPORT_FUNC(JsiSkCanvas, scale),
+ JSI_EXPORT_FUNC(JsiSkCanvas, skew),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawColor),
+ JSI_EXPORT_FUNC(JsiSkCanvas, clear),
+ JSI_EXPORT_FUNC(JsiSkCanvas, concat),
+ JSI_EXPORT_FUNC(JsiSkCanvas, drawPicture))
+
+ explicit JsiSkCanvas(std::shared_ptr context)
+ : JsiSkHostObject(std::move(context)) {}
+
+ JsiSkCanvas(std::shared_ptr context, SkCanvas *canvas)
+ : JsiSkCanvas(std::move(context)) {
+ setCanvas(canvas);
+ }
+
+ void setCanvas(SkCanvas *canvas) { _canvas = canvas; }
+ SkCanvas *getCanvas() { return _canvas; }
+
+private:
+ SkCanvas *_canvas;
+};
+} // namespace ABI49_0_0RNSkia
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkColor.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkColor.h
new file mode 100644
index 00000000000000..88ee2ac242a6ad
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkColor.h
@@ -0,0 +1,85 @@
+#pragma once
+
+#include
+#include
+#include
+
+#include
+
+#include "JsiSkHostObjects.h"
+#include "third_party/CSSColorParser.h"
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdocumentation"
+
+#include "SkColor.h"
+
+#pragma clang diagnostic pop
+
+namespace ABI49_0_0RNSkia {
+
+namespace jsi = ABI49_0_0facebook::jsi;
+
+class JsiSkColor : public ABI49_0_0RNJsi::JsiHostObject {
+public:
+ JsiSkColor() : JsiHostObject() {}
+
+ ~JsiSkColor() {}
+
+ static jsi::Object toValue(jsi::Runtime &runtime, SkColor color) {
+ auto result = runtime.global()
+ .getPropertyAsFunction(runtime, "Float32Array")
+ .callAsConstructor(runtime, 4)
+ .getObject(runtime);
+ jsi::ArrayBuffer buffer =
+ result
+ .getProperty(runtime, jsi::PropNameID::forAscii(runtime, "buffer"))
+ .asObject(runtime)
+ .getArrayBuffer(runtime);
+ auto bfrPtr = reinterpret_cast(buffer.data(runtime));
+ auto color4f = SkColor4f::FromColor(color).array();
+ std::copy(color4f.begin(), color4f.end(), bfrPtr);
+ return result;
+ }
+
+ static SkColor fromValue(jsi::Runtime &runtime, const jsi::Value &obj) {
+ const auto &object = obj.asObject(runtime);
+ jsi::ArrayBuffer buffer =
+ object
+ .getProperty(runtime, jsi::PropNameID::forAscii(runtime, "buffer"))
+ .asObject(runtime)
+ .getArrayBuffer(runtime);
+ auto bfrPtr = reinterpret_cast(buffer.data(runtime));
+ if (bfrPtr[0] > 1 || bfrPtr[1] > 1 || bfrPtr[2] > 1 || bfrPtr[3] > 1) {
+ return SK_ColorBLACK;
+ }
+ return SkColorSetARGB(bfrPtr[3] * 255, bfrPtr[0] * 255, bfrPtr[1] * 255,
+ bfrPtr[2] * 255);
+ }
+
+ /**
+ * Creates the function for construction a new instance of the SkColor
+ * wrapper
+ * @return A function for creating a new host object wrapper for the SkColor
+ * class
+ */
+ static const jsi::HostFunctionType createCtor() {
+ return JSI_HOST_FUNCTION_LAMBDA {
+ if (arguments[0].isNumber()) {
+ return JsiSkColor::toValue(runtime, arguments[0].getNumber());
+ } else if (arguments[0].isString()) {
+ auto text = arguments[0].asString(runtime).utf8(runtime);
+ auto color = CSSColorParser::parse(text);
+ if (color.a == -1.0f) {
+ return JsiSkColor::toValue(runtime, SK_ColorBLACK);
+ }
+ return JsiSkColor::toValue(
+ runtime, SkColorSetARGB(color.a * 255, color.r, color.g, color.b));
+ } else if (arguments[0].isObject()) {
+ return arguments[0].getObject(runtime);
+ }
+ return jsi::Value::undefined();
+ };
+ }
+};
+} // namespace ABI49_0_0RNSkia
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkColorFilter.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkColorFilter.h
new file mode 100644
index 00000000000000..c8500411712e1f
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkColorFilter.h
@@ -0,0 +1,30 @@
+#pragma once
+
+#include "JsiSkHostObjects.h"
+#include
+#include
+#include
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdocumentation"
+
+#include "SkColorFilter.h"
+
+#pragma clang diagnostic pop
+
+namespace ABI49_0_0RNSkia {
+
+namespace jsi = ABI49_0_0facebook::jsi;
+
+class JsiSkColorFilter : public JsiSkWrappingSkPtrHostObject {
+public:
+ JsiSkColorFilter(std::shared_ptr context,
+ sk_sp colorFilter)
+ : JsiSkWrappingSkPtrHostObject(std::move(context),
+ std::move(colorFilter)) {}
+
+ EXPORT_JSI_API_TYPENAME(JsiSkColorFilter, "ColorFilter")
+ JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkColorFilter, dispose))
+};
+
+} // namespace ABI49_0_0RNSkia
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkColorFilterFactory.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkColorFilterFactory.h
new file mode 100644
index 00000000000000..ac598b48ac8bfd
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkColorFilterFactory.h
@@ -0,0 +1,101 @@
+#pragma once
+
+#include "JsiSkColor.h"
+#include "JsiSkColorFilter.h"
+#include "JsiSkHostObjects.h"
+#include
+#include
+#include
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdocumentation"
+
+#include "SkColorFilter.h"
+#include "SkLumaColorFilter.h"
+
+#pragma clang diagnostic pop
+
+namespace ABI49_0_0RNSkia {
+
+namespace jsi = ABI49_0_0facebook::jsi;
+
+class JsiSkColorFilterFactory : public JsiSkHostObject {
+public:
+ JSI_HOST_FUNCTION(MakeMatrix) {
+ auto jsiMatrix = arguments[0].asObject(runtime).asArray(runtime);
+ float matrix[20];
+ for (int i = 0; i < 20; i++) {
+ if (jsiMatrix.size(runtime) > i) {
+ matrix[i] = jsiMatrix.getValueAtIndex(runtime, i).asNumber();
+ }
+ }
+ // Return the newly constructed object
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(
+ getContext(), SkColorFilters::Matrix(std::move(matrix))));
+ }
+
+ JSI_HOST_FUNCTION(MakeBlend) {
+ auto color = JsiSkColor::fromValue(runtime, arguments[0]);
+ SkBlendMode blend = (SkBlendMode)arguments[1].asNumber();
+ // Return the newly constructed object
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(
+ getContext(), SkColorFilters::Blend(color, blend)));
+ }
+
+ JSI_HOST_FUNCTION(MakeCompose) {
+ auto outer = JsiSkColorFilter::fromValue(runtime, arguments[0]);
+ auto inner = JsiSkColorFilter::fromValue(runtime, arguments[1]);
+ // Return the newly constructed object
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(
+ getContext(), SkColorFilters::Compose(std::move(outer),
+ std::move(inner))));
+ }
+
+ JSI_HOST_FUNCTION(MakeLerp) {
+ auto t = arguments[0].asNumber();
+ auto dst = JsiSkColorFilter::fromValue(runtime, arguments[1]);
+ auto src = JsiSkColorFilter::fromValue(runtime, arguments[2]);
+ // Return the newly constructed object
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(
+ getContext(),
+ SkColorFilters::Lerp(t, std::move(dst), std::move(src))));
+ }
+
+ JSI_HOST_FUNCTION(MakeSRGBToLinearGamma) {
+ // Return the newly constructed object
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(
+ getContext(), SkColorFilters::SRGBToLinearGamma()));
+ }
+
+ JSI_HOST_FUNCTION(MakeLinearToSRGBGamma) {
+ // Return the newly constructed object
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(
+ getContext(), SkColorFilters::LinearToSRGBGamma()));
+ }
+
+ JSI_HOST_FUNCTION(MakeLumaColorFilter) {
+ // Return the newly constructed object
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(getContext(),
+ SkLumaColorFilter::Make()));
+ }
+
+ JSI_EXPORT_FUNCTIONS(
+ JSI_EXPORT_FUNC(JsiSkColorFilterFactory, MakeMatrix),
+ JSI_EXPORT_FUNC(JsiSkColorFilterFactory, MakeBlend),
+ JSI_EXPORT_FUNC(JsiSkColorFilterFactory, MakeCompose),
+ JSI_EXPORT_FUNC(JsiSkColorFilterFactory, MakeLerp),
+ JSI_EXPORT_FUNC(JsiSkColorFilterFactory, MakeSRGBToLinearGamma),
+ JSI_EXPORT_FUNC(JsiSkColorFilterFactory, MakeLinearToSRGBGamma),
+ JSI_EXPORT_FUNC(JsiSkColorFilterFactory, MakeLumaColorFilter))
+
+ explicit JsiSkColorFilterFactory(std::shared_ptr context)
+ : JsiSkHostObject(std::move(context)) {}
+};
+} // namespace ABI49_0_0RNSkia
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkContourMeasure.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkContourMeasure.h
new file mode 100644
index 00000000000000..7ac187d0258966
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkContourMeasure.h
@@ -0,0 +1,79 @@
+#pragma once
+
+#include
+#include
+
+#include
+
+#include "JsiSkHostObjects.h"
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdocumentation"
+
+#include "SkContourMeasure.h"
+
+#include "JsiSkPath.h"
+
+#pragma clang diagnostic pop
+
+namespace ABI49_0_0RNSkia {
+
+namespace jsi = ABI49_0_0facebook::jsi;
+
+class JsiSkContourMeasure
+ : public JsiSkWrappingSkPtrHostObject {
+public:
+ JsiSkContourMeasure(std::shared_ptr context,
+ const sk_sp contourMeasure)
+ : JsiSkWrappingSkPtrHostObject(std::move(context),
+ std::move(contourMeasure)) {
+ if (contourMeasure == nullptr) {
+ throw jsi::JSError(*context->getJsRuntime(), "Contour measure is null");
+ }
+ }
+
+ JSI_HOST_FUNCTION(getPosTan) {
+ auto dist = arguments[0].asNumber();
+ SkPoint position;
+ SkPoint tangent;
+ auto result = getObject()->getPosTan(dist, &position, &tangent);
+ if (!result) {
+ throw jsi::JSError(runtime, "getSegment() failed");
+ }
+ auto posTan = jsi::Array(runtime, 2);
+ auto pos = jsi::Object::createFromHostObject(
+ runtime, std::make_shared(getContext(), position));
+ auto tan = jsi::Object::createFromHostObject(
+ runtime, std::make_shared(getContext(), tangent));
+ posTan.setValueAtIndex(runtime, 0, pos);
+ posTan.setValueAtIndex(runtime, 1, tan);
+ return posTan;
+ }
+
+ JSI_HOST_FUNCTION(length) {
+ return jsi::Value(SkScalarToDouble(getObject()->length()));
+ }
+
+ JSI_HOST_FUNCTION(isClosed) { return jsi::Value(getObject()->isClosed()); }
+
+ JSI_HOST_FUNCTION(getSegment) {
+ auto start = arguments[0].asNumber();
+ auto end = arguments[1].asNumber();
+ auto startWithMoveTo = arguments[2].getBool();
+ SkPath path;
+ auto result = getObject()->getSegment(start, end, &path, startWithMoveTo);
+ if (!result) {
+ throw jsi::JSError(runtime, "getSegment() failed");
+ }
+ return JsiSkPath::toValue(runtime, getContext(), std::move(path));
+ }
+
+ EXPORT_JSI_API_TYPENAME(JsiSkContourMeasure, "ContourMeasure")
+
+ JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkContourMeasure, getPosTan),
+ JSI_EXPORT_FUNC(JsiSkContourMeasure, length),
+ JSI_EXPORT_FUNC(JsiSkContourMeasure, isClosed),
+ JSI_EXPORT_FUNC(JsiSkContourMeasure, getSegment),
+ JSI_EXPORT_FUNC(JsiSkContourMeasure, dispose))
+};
+} // namespace ABI49_0_0RNSkia
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkContourMeasureIter.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkContourMeasureIter.h
new file mode 100644
index 00000000000000..3c49e3c070be0f
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkContourMeasureIter.h
@@ -0,0 +1,68 @@
+#pragma once
+
+#include
+#include
+
+#include "JsiSkContourMeasure.h"
+#include "JsiSkHostObjects.h"
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdocumentation"
+
+#include "SkContourMeasure.h"
+
+#include "JsiSkPath.h"
+
+#pragma clang diagnostic pop
+
+namespace ABI49_0_0RNSkia {
+
+namespace jsi = ABI49_0_0facebook::jsi;
+
+class JsiSkContourMeasureIter
+ : public JsiSkWrappingSharedPtrHostObject {
+public:
+ JsiSkContourMeasureIter(std::shared_ptr context,
+ const SkPath &path, bool forceClosed,
+ SkScalar resScale = 1)
+ : JsiSkWrappingSharedPtrHostObject(
+ std::move(context), std::make_shared(
+ path, forceClosed, resScale)) {}
+
+ JSI_HOST_FUNCTION(next) {
+ auto next = getObject()->next();
+ if (next == nullptr) {
+ return jsi::Value::undefined();
+ }
+ auto nextObject =
+ std::make_shared(getContext(), std::move(next));
+
+ return jsi::Object::createFromHostObject(runtime, std::move(nextObject));
+ }
+
+ EXPORT_JSI_API_TYPENAME(JsiSkContourMeasureIter, "ContourMeasureIter")
+
+ JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkContourMeasureIter, next),
+ JSI_EXPORT_FUNC(JsiSkContourMeasureIter, dispose))
+
+ /**
+ * Creates the function for construction a new instance of the
+ * SkContourMeasureIter wrapper
+ * @param context platform context
+ * @return A function for creating a new host object wrapper for the
+ * SkContourMeasureIter class
+ */
+ static const jsi::HostFunctionType
+ createCtor(std::shared_ptr context) {
+ return JSI_HOST_FUNCTION_LAMBDA {
+ auto path = JsiSkPath::fromValue(runtime, arguments[0]);
+ auto forceClosed = arguments[1].getBool();
+ auto resScale = arguments[2].asNumber();
+ // Return the newly constructed object
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(
+ std::move(context), *path, forceClosed, resScale));
+ };
+ }
+};
+} // namespace ABI49_0_0RNSkia
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkData.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkData.h
new file mode 100644
index 00000000000000..0ca99f8c6f69bf
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkData.h
@@ -0,0 +1,30 @@
+#pragma once
+
+#include
+#include
+
+#include
+
+#include "JsiSkHostObjects.h"
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdocumentation"
+
+#include "SkFont.h"
+#include "SkStream.h"
+
+#pragma clang diagnostic pop
+
+namespace ABI49_0_0RNSkia {
+
+namespace jsi = ABI49_0_0facebook::jsi;
+
+class JsiSkData : public JsiSkWrappingSkPtrHostObject {
+public:
+ JsiSkData(std::shared_ptr context, sk_sp asset)
+ : JsiSkWrappingSkPtrHostObject(std::move(context), std::move(asset)) {}
+
+ EXPORT_JSI_API_TYPENAME(JsiSkData, "Data")
+ JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkData, dispose))
+};
+} // namespace ABI49_0_0RNSkia
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkDataFactory.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkDataFactory.h
new file mode 100644
index 00000000000000..6a8f1010d1b632
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkDataFactory.h
@@ -0,0 +1,99 @@
+#pragma once
+
+#include
+#include
+
+#include
+#include
+
+#include "SkBase64.h"
+
+#include "JsiSkData.h"
+
+namespace ABI49_0_0RNSkia {
+
+namespace jsi = ABI49_0_0facebook::jsi;
+namespace ABI49_0_0React = ABI49_0_0facebook::ABI49_0_0React;
+
+class JsiSkDataFactory : public JsiSkHostObject {
+public:
+ JSI_HOST_FUNCTION(fromURI) {
+ auto jsiLocalUri = arguments[0].asString(runtime);
+ auto localUri = jsiLocalUri.utf8(runtime);
+ auto context = getContext();
+ return ABI49_0_0React::createPromiseAsJSIValue(
+ runtime,
+ [context = std::move(context), localUri = std::move(localUri)](
+ jsi::Runtime &runtime,
+ std::shared_ptr promise) -> void {
+ // Create a stream operation - this will be run in a
+ // separate thread
+ context->performStreamOperation(
+ localUri,
+ [&runtime, context = std::move(context),
+ promise = std::move(promise)](
+ std::unique_ptr stream) -> void {
+ // Schedule drawCallback on the Javascript thread
+ auto result =
+ SkData::MakeFromStream(stream.get(), stream->getLength());
+ context->runOnJavascriptThread([&runtime,
+ context = std::move(context),
+ promise = std::move(promise),
+ result = std::move(result)]() {
+ promise->resolve(jsi::Object::createFromHostObject(
+ runtime, std::make_shared(std::move(context),
+ std::move(result))));
+ });
+ });
+ });
+ };
+
+ JSI_HOST_FUNCTION(fromBytes) {
+ auto array = arguments[0].asObject(runtime);
+ jsi::ArrayBuffer buffer =
+ array.getProperty(runtime, jsi::PropNameID::forAscii(runtime, "buffer"))
+ .asObject(runtime)
+ .getArrayBuffer(runtime);
+
+ auto data =
+ SkData::MakeWithCopy(buffer.data(runtime), buffer.size(runtime));
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(getContext(), std::move(data)));
+ }
+
+ JSI_HOST_FUNCTION(fromBase64) {
+ auto base64 = arguments[0].asString(runtime);
+ auto base64Str = base64.utf8(runtime);
+ auto size = base64Str.size();
+
+ // Calculate length
+ size_t len;
+ auto err =
+ SkBase64::Decode(&base64.utf8(runtime).c_str()[0], size, nullptr, &len);
+ if (err != SkBase64::Error::kNoError) {
+ throw jsi::JSError(runtime, "Error decoding base64 string");
+ return jsi::Value::undefined();
+ }
+
+ // Create data object and decode
+ auto data = SkData::MakeUninitialized(len);
+ err = SkBase64::Decode(&base64.utf8(runtime).c_str()[0], size,
+ data->writable_data(), &len);
+ if (err != SkBase64::Error::kNoError) {
+ throw jsi::JSError(runtime, "Error decoding base64 string");
+ return jsi::Value::undefined();
+ }
+
+ return jsi::Object::createFromHostObject(
+ runtime, std::make_shared(getContext(), std::move(data)));
+ }
+
+ JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkDataFactory, fromURI),
+ JSI_EXPORT_FUNC(JsiSkDataFactory, fromBytes),
+ JSI_EXPORT_FUNC(JsiSkDataFactory, fromBase64))
+
+ explicit JsiSkDataFactory(std::shared_ptr context)
+ : JsiSkHostObject(std::move(context)) {}
+};
+
+} // namespace ABI49_0_0RNSkia
diff --git a/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkFont.h b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkFont.h
new file mode 100644
index 00000000000000..c08708fcb7383f
--- /dev/null
+++ b/ios/vendored/sdk49/@shopify/react-native-skia/cpp/api/JsiSkFont.h
@@ -0,0 +1,300 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+
+#include "JsiSkHostObjects.h"
+#include "ABI49_0_0RNSkLog.h"
+#include
+
+#include "JsiSkPaint.h"
+#include "JsiSkPoint.h"
+#include "JsiSkRect.h"
+#include "JsiSkTypeface.h"
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdocumentation"
+
+#include "SkFont.h"
+#include "SkFontMetrics.h"
+
+#pragma clang diagnostic pop
+
+namespace ABI49_0_0RNSkia {
+
+namespace jsi = ABI49_0_0facebook::jsi;
+
+class JsiSkFont : public JsiSkWrappingSharedPtrHostObject {
+public:
+ JSI_HOST_FUNCTION(getGlyphWidths) {
+ auto jsiGlyphs = arguments[0].asObject(runtime).asArray(runtime);
+ std::vector glyphs;
+ int glyphsSize = static_cast(jsiGlyphs.size(runtime));
+
+ std::vector widthPtrs;
+ widthPtrs.resize(glyphsSize);
+
+ glyphs.reserve(glyphsSize);
+ for (int i = 0; i < glyphsSize; i++) {
+ glyphs.push_back(jsiGlyphs.getValueAtIndex(runtime, i).asNumber());
+ }
+ if (count > 1) {
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[1]);
+ getObject()->getWidthsBounds(glyphs.data(), glyphsSize,
+ static_cast(widthPtrs.data()),
+ nullptr, paint.get());
+ } else {
+ getObject()->getWidthsBounds(glyphs.data(), glyphsSize,
+ static_cast(widthPtrs.data()),
+ nullptr, nullptr);
+ }
+ auto jsiWidths = jsi::Array(runtime, glyphsSize);
+ for (int i = 0; i < glyphsSize; i++) {
+ jsiWidths.setValueAtIndex(
+ runtime, i,
+ jsi::Value(
+ SkScalarToDouble(static_cast(widthPtrs.data())[i])));
+ }
+ return jsiWidths;
+ }
+
+ JSI_HOST_FUNCTION(getTextWidth) {
+ auto str = arguments[0].asString(runtime).utf8(runtime);
+ auto numGlyphIDs = getObject()->countText(str.c_str(), str.length(),
+ SkTextEncoding::kUTF8);
+ std::vector glyphs;
+ glyphs.resize(numGlyphIDs);
+ int glyphsSize = static_cast(numGlyphIDs);
+ getObject()->textToGlyphs(str.c_str(), str.length(), SkTextEncoding::kUTF8,
+ static_cast(glyphs.data()),
+ glyphsSize);
+ std::vector widthPtrs;
+ widthPtrs.resize(numGlyphIDs);
+ if (count > 1) {
+ auto paint = JsiSkPaint::fromValue(runtime, arguments[1]);
+ getObject()->getWidthsBounds(glyphs.data(), glyphsSize,
+ static_cast(widthPtrs.data()),
+ nullptr, paint.get());
+ } else {
+ getObject()->getWidthsBounds(glyphs.data(), glyphsSize,
+ static_cast(widthPtrs.data()),
+ nullptr, nullptr);
+ }
+ return jsi::Value(std::accumulate(widthPtrs.begin(), widthPtrs.end(), 0));
+ }
+
+ JSI_HOST_FUNCTION(getMetrics) {
+ SkFontMetrics fm;
+ getObject()->getMetrics(&fm);
+ auto metrics = jsi::Object(runtime);
+ metrics.setProperty(runtime, "ascent", fm.fAscent);
+ metrics.setProperty(runtime, "descent", fm.fDescent);
+ metrics.setProperty(runtime, "leading", fm.fLeading);
+ if (!(fm.fFlags & SkFontMetrics::kBoundsInvalid_Flag)) {
+ auto bounds = SkRect::MakeLTRB(fm.fXMin, fm.fTop, fm.fXMax, fm.fBottom);
+ auto jsiBounds =
+ JsiSkRect::toValue(runtime, getContext(), std::move(bounds));
+ metrics.setProperty(runtime, "bounds", std::move(jsiBounds));
+ }
+ return metrics;
+ }
+
+ JSI_HOST_FUNCTION(getGlyphIDs) {
+ auto str = arguments[0].asString(runtime).utf8(runtime);
+ int numGlyphIDs =
+ count > 1 && !arguments[1].isNull() && !arguments[1].isUndefined()
+ ? static_cast(arguments[1].asNumber())
+ : getObject()->countText(str.c_str(), str.length(),
+ SkTextEncoding::kUTF8);
+ std::vector glyphIDs;
+ glyphIDs.resize(numGlyphIDs);
+ getObject()->textToGlyphs(str.c_str(), str.length(), SkTextEncoding::kUTF8,
+ static_cast(glyphIDs.data()),
+ numGlyphIDs);
+ auto jsiGlyphIDs = jsi::Array(runtime, numGlyphIDs);
+ for (int i = 0; i < numGlyphIDs; i++) {
+ jsiGlyphIDs.setValueAtIndex(runtime, i,
+ jsi::Value(static_cast(glyphIDs[i])));
+ }
+ return jsiGlyphIDs;
+ }
+
+ JSI_HOST_FUNCTION(getGlyphIntercepts) {
+ auto jsiGlyphs = arguments[0].asObject(runtime).asArray(runtime);
+ auto jsiPositions = arguments[1].asObject(runtime).asArray(runtime);
+ auto top = arguments[2].asNumber();
+ auto bottom = arguments[3].asNumber();
+ std::vector