From e5a2ee3bd328ab68e0373e5117d95230ab201f58 Mon Sep 17 00:00:00 2001 From: yungblud Date: Mon, 1 Jul 2024 00:20:28 +0900 Subject: [PATCH 1/3] feat: bump up fabric example react-native iOS (#3951) * feat: :fire: version bump react native for ios FabricExample * feat: :sparkles: copied newly created basic example TS files --- examples/FabricExample/.eslintrc.js | 2 +- examples/FabricExample/.gitignore | 3 + examples/FabricExample/Gemfile | 5 +- examples/FabricExample/Gemfile.lock | 37 +- examples/FabricExample/__tests__/App-test.tsx | 3 + examples/FabricExample/_node-version | 1 - examples/FabricExample/babel.config.js | 2 +- .../FabricExample.xcodeproj/project.pbxproj | 30 +- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../ios/FabricExample/AppDelegate.h | 6 +- .../ios/FabricExample/AppDelegate.mm | 118 +- .../ios/FabricExample/Info.plist | 14 +- examples/FabricExample/ios/Podfile | 25 +- examples/FabricExample/ios/Podfile.lock | 1903 ++++++++++------- examples/FabricExample/jest.config.js | 3 + examples/FabricExample/metro.config.js | 7 +- examples/FabricExample/package.json | 19 +- .../FabricExample/src/MultiValueControl.tsx | 75 + examples/FabricExample/src/ToggleControl.tsx | 73 + examples/FabricExample/src/VideoPlayer.tsx | 1232 ++++++----- .../src/components/AudioTracksSelector.tsx | 53 + .../FabricExample/src/components/Seeker.tsx | 154 ++ .../src/components/TextTracksSelector.tsx | 64 + .../src/components/VideoTracksSelector.tsx | 64 + examples/FabricExample/src/portrait.mp4 | Bin 0 -> 9812941 bytes examples/FabricExample/src/styles.tsx | 167 ++ examples/FabricExample/tsconfig.json | 2 +- 27 files changed, 2665 insertions(+), 1405 deletions(-) delete mode 100644 examples/FabricExample/_node-version create mode 100644 examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/FabricExample/jest.config.js create mode 100644 examples/FabricExample/src/MultiValueControl.tsx create mode 100644 examples/FabricExample/src/ToggleControl.tsx create mode 100644 examples/FabricExample/src/components/AudioTracksSelector.tsx create mode 100644 examples/FabricExample/src/components/Seeker.tsx create mode 100644 examples/FabricExample/src/components/TextTracksSelector.tsx create mode 100644 examples/FabricExample/src/components/VideoTracksSelector.tsx create mode 100644 examples/FabricExample/src/portrait.mp4 create mode 100644 examples/FabricExample/src/styles.tsx diff --git a/examples/FabricExample/.eslintrc.js b/examples/FabricExample/.eslintrc.js index dcf0be0865..9dd57a791b 100644 --- a/examples/FabricExample/.eslintrc.js +++ b/examples/FabricExample/.eslintrc.js @@ -1,6 +1,6 @@ module.exports = { root: true, - extends: '@react-native-community', + extends: '@react-native', parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], overrides: [ diff --git a/examples/FabricExample/.gitignore b/examples/FabricExample/.gitignore index 2423126f72..613b9bdc1e 100644 --- a/examples/FabricExample/.gitignore +++ b/examples/FabricExample/.gitignore @@ -62,3 +62,6 @@ buck-out/ # Ruby / CocoaPods /ios/Pods/ /vendor/bundle/ + +# testing +/coverage \ No newline at end of file diff --git a/examples/FabricExample/Gemfile b/examples/FabricExample/Gemfile index 5efda89f45..6a7d5c7a49 100644 --- a/examples/FabricExample/Gemfile +++ b/examples/FabricExample/Gemfile @@ -1,6 +1,7 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby '2.7.5' +ruby ">= 2.6.10" -gem 'cocoapods', '~> 1.11', '>= 1.11.2' +gem 'cocoapods', '~> 1.13' +gem 'activesupport', '>= 6.1.7.3', '< 7.1.0' diff --git a/examples/FabricExample/Gemfile.lock b/examples/FabricExample/Gemfile.lock index be0b95a462..53cd1ea0b5 100644 --- a/examples/FabricExample/Gemfile.lock +++ b/examples/FabricExample/Gemfile.lock @@ -1,26 +1,29 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml activesupport (7.0.4.3) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - addressable (2.8.4) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) + base64 (0.2.0) claide (1.1.0) - cocoapods (1.12.0) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.12.0) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.6.0, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) cocoapods-trunk (>= 1.6.0, < 2.0) @@ -32,8 +35,8 @@ GEM molinillo (~> 0.8.0) nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.12.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.15.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -44,7 +47,7 @@ GEM public_suffix (~> 4.0) typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.6.3) + cocoapods-downloader (2.1) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -57,27 +60,30 @@ GEM escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - ffi (1.15.5) + ffi (1.17.0) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) httpclient (2.8.3) i18n (1.12.0) concurrent-ruby (~> 1.0) - json (2.6.3) + json (2.7.2) minitest (5.18.0) molinillo (0.8.0) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) + nkf (0.2.0) public_suffix (4.0.7) - rexml (3.2.5) + rexml (3.2.9) + strscan ruby-macho (2.5.1) - typhoeus (1.4.0) + strscan (3.1.0) + typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - xcodeproj (1.22.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -89,7 +95,8 @@ PLATFORMS ruby DEPENDENCIES - cocoapods (~> 1.11, >= 1.11.2) + activesupport (>= 6.1.7.3, < 7.1.0) + cocoapods (~> 1.13) RUBY VERSION ruby 2.7.5p203 diff --git a/examples/FabricExample/__tests__/App-test.tsx b/examples/FabricExample/__tests__/App-test.tsx index 178476699b..9eac6fbc87 100644 --- a/examples/FabricExample/__tests__/App-test.tsx +++ b/examples/FabricExample/__tests__/App-test.tsx @@ -6,6 +6,9 @@ import 'react-native'; import React from 'react'; import App from '../App'; +// Note: import explicitly to use the types shipped with jest. +import {it} from '@jest/globals'; + // Note: test renderer must be required after react-native. import renderer from 'react-test-renderer'; diff --git a/examples/FabricExample/_node-version b/examples/FabricExample/_node-version deleted file mode 100644 index b6a7d89c68..0000000000 --- a/examples/FabricExample/_node-version +++ /dev/null @@ -1 +0,0 @@ -16 diff --git a/examples/FabricExample/babel.config.js b/examples/FabricExample/babel.config.js index 51c969cf73..bd1f13f222 100644 --- a/examples/FabricExample/babel.config.js +++ b/examples/FabricExample/babel.config.js @@ -2,7 +2,7 @@ const path = require('path'); const pak = require('../../package.json'); module.exports = { - presets: ['module:metro-react-native-babel-preset'], + presets: ['module:@react-native/babel-preset'], plugins: [ [ 'module-resolver', diff --git a/examples/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj b/examples/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj index 8ef48fc2d8..26875e8c76 100644 --- a/examples/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj +++ b/examples/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj @@ -437,7 +437,7 @@ "$(inherited)", ); INFOPLIST_FILE = FabricExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -461,7 +461,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; INFOPLIST_FILE = FabricExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -535,7 +535,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -580,7 +580,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -592,18 +592,25 @@ ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRN_FABRIC_ENABLED", + ); OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", + "-DRN_FABRIC_ENABLED", ); OTHER_LDFLAGS = ( "$(inherited)", - " ", + "-Wl", + "-ld_classic", ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; + USE_HERMES = true; }; name = Debug; }; @@ -612,7 +619,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -653,7 +660,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -664,18 +671,25 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRN_FABRIC_ENABLED", + ); OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", + "-DRN_FABRIC_ENABLED", ); OTHER_LDFLAGS = ( "$(inherited)", - " ", + "-Wl", + "-ld_classic", ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; + USE_HERMES = true; VALIDATE_PRODUCT = YES; }; name = Release; diff --git a/examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/FabricExample/ios/FabricExample/AppDelegate.h b/examples/FabricExample/ios/FabricExample/AppDelegate.h index ef1de86a2a..5d2808256c 100644 --- a/examples/FabricExample/ios/FabricExample/AppDelegate.h +++ b/examples/FabricExample/ios/FabricExample/AppDelegate.h @@ -1,8 +1,6 @@ -#import +#import #import -@interface AppDelegate : UIResponder - -@property (nonatomic, strong) UIWindow *window; +@interface AppDelegate : RCTAppDelegate @end diff --git a/examples/FabricExample/ios/FabricExample/AppDelegate.mm b/examples/FabricExample/ios/FabricExample/AppDelegate.mm index 42eee33f92..a429e31e21 100644 --- a/examples/FabricExample/ios/FabricExample/AppDelegate.mm +++ b/examples/FabricExample/ios/FabricExample/AppDelegate.mm @@ -1,88 +1,25 @@ #import "AppDelegate.h" -#import #import -#import - -#import - -#if RCT_NEW_ARCH_ENABLED -#import -#import -#import -#import -#import -#import - -#import - -static NSString *const kRNConcurrentRoot = @"concurrentRoot"; - -@interface AppDelegate () { - RCTTurboModuleManager *_turboModuleManager; - RCTSurfacePresenterBridgeAdapter *_bridgeAdapter; - std::shared_ptr _reactNativeConfig; - facebook::react::ContextContainer::Shared _contextContainer; -} -@end -#endif @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - RCTAppSetupPrepareApp(application, true); - - RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; - -#if RCT_NEW_ARCH_ENABLED - _contextContainer = std::make_shared(); - _reactNativeConfig = std::make_shared(); - _contextContainer->insert("ReactNativeConfig", _reactNativeConfig); - _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer]; - bridge.surfacePresenter = _bridgeAdapter.surfacePresenter; -#endif + self.moduleName = @"FabricExample"; + // You can add your custom initial props in the dictionary below. + // They will be passed down to the ViewController used by React Native. + self.initialProps = @{}; - NSDictionary *initProps = [self prepareInitialProps]; - UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"FabricExample", initProps, true); - - if (@available(iOS 13.0, *)) { - rootView.backgroundColor = [UIColor systemBackgroundColor]; - } else { - rootView.backgroundColor = [UIColor whiteColor]; - } - - self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - UIViewController *rootViewController = [UIViewController new]; - rootViewController.view = rootView; - self.window.rootViewController = rootViewController; - [self.window makeKeyAndVisible]; - return YES; -} - -/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. -/// -/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html -/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). -/// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it returns `false`. -- (BOOL)concurrentRootEnabled -{ - // Switch this bool to turn on and off the concurrent root - return true; + return [super application:application didFinishLaunchingWithOptions:launchOptions]; } -- (NSDictionary *)prepareInitialProps +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { - NSMutableDictionary *initProps = [NSMutableDictionary new]; - -#ifdef RCT_NEW_ARCH_ENABLED - initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]); -#endif - - return initProps; + return [self getBundleURL]; } -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +- (NSURL *)getBundleURL { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; @@ -91,43 +28,4 @@ - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge #endif } -#if RCT_NEW_ARCH_ENABLED - -#pragma mark - RCTCxxBridgeDelegate - -- (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge -{ - _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge - delegate:self - jsInvoker:bridge.jsCallInvoker]; - return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager); -} - -#pragma mark RCTTurboModuleManagerDelegate - -- (Class)getModuleClassFromName:(const char *)name -{ - return RCTCoreModulesClassProvider(name); -} - -- (std::shared_ptr)getTurboModule:(const std::string &)name - jsInvoker:(std::shared_ptr)jsInvoker -{ - return nullptr; -} - -- (std::shared_ptr)getTurboModule:(const std::string &)name - initParams: - (const facebook::react::ObjCTurboModule::InitParams &)params -{ - return nullptr; -} - -- (id)getModuleInstanceFromClass:(Class)moduleClass -{ - return RCTAppSetupDefaultModuleFromClass(moduleClass); -} - -#endif - @end diff --git a/examples/FabricExample/ios/FabricExample/Info.plist b/examples/FabricExample/ios/FabricExample/Info.plist index 860ea180cb..b0cb3daca6 100644 --- a/examples/FabricExample/ios/FabricExample/Info.plist +++ b/examples/FabricExample/ios/FabricExample/Info.plist @@ -26,17 +26,13 @@ NSAppTransportSecurity - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + NSLocationWhenInUseUsageDescription - + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities diff --git a/examples/FabricExample/ios/Podfile b/examples/FabricExample/ios/Podfile index d39c16451c..eeaebf83d5 100644 --- a/examples/FabricExample/ios/Podfile +++ b/examples/FabricExample/ios/Podfile @@ -1,28 +1,25 @@ ENV['RCT_NEW_ARCH_ENABLED'] = "1" -require_relative '../node_modules/react-native/scripts/react_native_pods' -require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' -platform :ios, '12.4' +# Resolve react_native_pods.rb with node to allow for hoisting +require Pod::Executable.execute_command('node', ['-p', + 'require.resolve( + "react-native/scripts/react_native_pods.rb", + {paths: [process.argv[1]]}, + )', __dir__]).strip + +platform :ios, '13.4' install! 'cocoapods', :deterministic_uuids => false target 'FabricExample' do config = use_native_modules! - # Flags change depending on the env values. - flags = get_default_flags() - use_react_native!( :path => config[:reactNativePath], - # Hermes is now enabled by default. Disable by setting this flag to false. - # Upcoming versions of React Native may rely on get_default_flags(), but - # we make it explicit here to aid in the React Native upgrade process. - :hermes_enabled => true, - :fabric_enabled => flags[:fabric_enabled], # Enables Flipper. # # Note that if you have use_frameworks! enabled, Flipper will not work and # you should disable the next line. - :flipper_configuration => FlipperConfiguration.enabled, + # :flipper_configuration => FlipperConfiguration.enabled, # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) @@ -35,10 +32,8 @@ target 'FabricExample' do post_install do |installer| react_native_post_install( installer, - # Set `mac_catalyst_enabled` to `true` in order to apply patches - # necessary for Mac Catalyst builds + config[:reactNativePath], :mac_catalyst_enabled => false ) - __apply_Xcode_12_5_M1_post_install_workaround(installer) end end diff --git a/examples/FabricExample/ios/Podfile.lock b/examples/FabricExample/ios/Podfile.lock index cd35a33b95..882f92aabc 100644 --- a/examples/FabricExample/ios/Podfile.lock +++ b/examples/FabricExample/ios/Podfile.lock @@ -1,797 +1,1167 @@ PODS: - - boost (1.76.0) - - CocoaAsyncSocket (7.6.5) + - boost (1.83.0) - DoubleConversion (1.1.6) - - FBLazyVector (0.71.15) - - FBReactNativeSpec (0.71.15): - - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-Core (= 0.71.15) - - React-jsi (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - Flipper (0.125.0): - - Flipper-Folly (~> 2.6) - - Flipper-RSocket (~> 1.4) - - Flipper-Boost-iOSX (1.76.0.1.11) - - Flipper-DoubleConversion (3.2.0.1) - - Flipper-Fmt (7.1.7) - - Flipper-Folly (2.6.10): - - Flipper-Boost-iOSX - - Flipper-DoubleConversion - - Flipper-Fmt (= 7.1.7) - - Flipper-Glog - - libevent (~> 2.1.12) - - OpenSSL-Universal (= 1.1.1100) - - Flipper-Glog (0.5.0.5) - - Flipper-PeerTalk (0.0.4) - - Flipper-RSocket (1.4.3): - - Flipper-Folly (~> 2.6) - - FlipperKit (0.125.0): - - FlipperKit/Core (= 0.125.0) - - FlipperKit/Core (0.125.0): - - Flipper (~> 0.125.0) - - FlipperKit/CppBridge - - FlipperKit/FBCxxFollyDynamicConvert - - FlipperKit/FBDefines - - FlipperKit/FKPortForwarding - - SocketRocket (~> 0.6.0) - - FlipperKit/CppBridge (0.125.0): - - Flipper (~> 0.125.0) - - FlipperKit/FBCxxFollyDynamicConvert (0.125.0): - - Flipper-Folly (~> 2.6) - - FlipperKit/FBDefines (0.125.0) - - FlipperKit/FKPortForwarding (0.125.0): - - CocoaAsyncSocket (~> 7.6) - - Flipper-PeerTalk (~> 0.0.4) - - FlipperKit/FlipperKitHighlightOverlay (0.125.0) - - FlipperKit/FlipperKitLayoutHelpers (0.125.0): - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutTextSearchable - - FlipperKit/FlipperKitLayoutIOSDescriptors (0.125.0): - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutHelpers - - YogaKit (~> 1.18) - - FlipperKit/FlipperKitLayoutPlugin (0.125.0): - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutHelpers - - FlipperKit/FlipperKitLayoutIOSDescriptors - - FlipperKit/FlipperKitLayoutTextSearchable - - YogaKit (~> 1.18) - - FlipperKit/FlipperKitLayoutTextSearchable (0.125.0) - - FlipperKit/FlipperKitNetworkPlugin (0.125.0): - - FlipperKit/Core - - FlipperKit/FlipperKitReactPlugin (0.125.0): - - FlipperKit/Core - - FlipperKit/FlipperKitUserDefaultsPlugin (0.125.0): - - FlipperKit/Core - - FlipperKit/SKIOSNetworkPlugin (0.125.0): - - FlipperKit/Core - - FlipperKit/FlipperKitNetworkPlugin + - FBLazyVector (0.73.2) - fmt (6.2.1) - glog (0.3.5) - - hermes-engine (0.71.15): - - hermes-engine/Pre-built (= 0.71.15) - - hermes-engine/Pre-built (0.71.15) + - hermes-engine (0.73.2): + - hermes-engine/Pre-built (= 0.73.2) + - hermes-engine/Pre-built (0.73.2) - libevent (2.1.12) - - OpenSSL-Universal (1.1.1100) - - PromisesObjC (2.2.0) - - PromisesSwift (2.2.0): - - PromisesObjC (= 2.2.0) - - RCT-Folly (2021.07.22.00): + - RCT-Folly (2022.05.16.00): - boost - DoubleConversion - fmt (~> 6.2.1) - glog - - RCT-Folly/Default (= 2021.07.22.00) - - RCT-Folly/Default (2021.07.22.00): + - RCT-Folly/Default (= 2022.05.16.00) + - RCT-Folly/Default (2022.05.16.00): - boost - DoubleConversion - fmt (~> 6.2.1) - glog - - RCT-Folly/Fabric (2021.07.22.00): + - RCT-Folly/Fabric (2022.05.16.00): - boost - DoubleConversion - fmt (~> 6.2.1) - glog - - RCT-Folly/Futures (2021.07.22.00): + - RCT-Folly/Futures (2022.05.16.00): - boost - DoubleConversion - fmt (~> 6.2.1) - glog - libevent - - RCTRequired (0.71.15) - - RCTTypeSafety (0.71.15): - - FBLazyVector (= 0.71.15) - - RCTRequired (= 0.71.15) - - React-Core (= 0.71.15) - - React (0.71.15): - - React-Core (= 0.71.15) - - React-Core/DevSupport (= 0.71.15) - - React-Core/RCTWebSocket (= 0.71.15) - - React-RCTActionSheet (= 0.71.15) - - React-RCTAnimation (= 0.71.15) - - React-RCTBlob (= 0.71.15) - - React-RCTImage (= 0.71.15) - - React-RCTLinking (= 0.71.15) - - React-RCTNetwork (= 0.71.15) - - React-RCTSettings (= 0.71.15) - - React-RCTText (= 0.71.15) - - React-RCTVibration (= 0.71.15) - - React-callinvoker (0.71.15) - - React-Codegen (0.71.15): - - FBReactNativeSpec + - RCTRequired (0.73.2) + - RCTTypeSafety (0.73.2): + - FBLazyVector (= 0.73.2) + - RCTRequired (= 0.73.2) + - React-Core (= 0.73.2) + - React (0.73.2): + - React-Core (= 0.73.2) + - React-Core/DevSupport (= 0.73.2) + - React-Core/RCTWebSocket (= 0.73.2) + - React-RCTActionSheet (= 0.73.2) + - React-RCTAnimation (= 0.73.2) + - React-RCTBlob (= 0.73.2) + - React-RCTImage (= 0.73.2) + - React-RCTLinking (= 0.73.2) + - React-RCTNetwork (= 0.73.2) + - React-RCTSettings (= 0.73.2) + - React-RCTText (= 0.73.2) + - React-RCTVibration (= 0.73.2) + - React-callinvoker (0.73.2) + - React-Codegen (0.73.2): + - DoubleConversion + - glog - hermes-engine - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-FabricImage - React-graphics - React-jsi - React-jsiexecutor - - React-rncore + - React-NativeModulesApple + - React-rendererdebug + - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-Core (0.71.15): + - React-Core (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.15) - - React-cxxreact (= 0.71.15) + - RCT-Folly (= 2022.05.16.00) + - React-Core/Default (= 0.73.2) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/CoreModulesHeaders (0.71.15): + - React-Core/CoreModulesHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/Default (0.71.15): + - React-Core/Default (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.15) + - RCT-Folly (= 2022.05.16.00) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/DevSupport (0.71.15): + - React-Core/DevSupport (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.15) - - React-Core/RCTWebSocket (= 0.71.15) - - React-cxxreact (= 0.71.15) + - RCT-Folly (= 2022.05.16.00) + - React-Core/Default (= 0.73.2) + - React-Core/RCTWebSocket (= 0.73.2) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-jsinspector (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-jsinspector (= 0.73.2) + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTActionSheetHeaders (0.71.15): + - React-Core/RCTActionSheetHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTAnimationHeaders (0.71.15): + - React-Core/RCTAnimationHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTBlobHeaders (0.71.15): + - React-Core/RCTBlobHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTImageHeaders (0.71.15): + - React-Core/RCTImageHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTLinkingHeaders (0.71.15): + - React-Core/RCTLinkingHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTNetworkHeaders (0.71.15): + - React-Core/RCTNetworkHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTSettingsHeaders (0.71.15): + - React-Core/RCTSettingsHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTTextHeaders (0.71.15): + - React-Core/RCTTextHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTVibrationHeaders (0.71.15): + - React-Core/RCTVibrationHeaders (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2022.05.16.00) - React-Core/Default - - React-cxxreact (= 0.71.15) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTWebSocket (0.71.15): + - React-Core/RCTWebSocket (0.73.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.15) - - React-cxxreact (= 0.71.15) + - RCT-Folly (= 2022.05.16.00) + - React-Core/Default (= 0.73.2) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-perflogger (= 0.71.15) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-CoreModules (0.71.15): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.15) - - React-Codegen (= 0.71.15) - - React-Core/CoreModulesHeaders (= 0.71.15) - - React-jsi (= 0.71.15) + - React-CoreModules (0.73.2): + - RCT-Folly (= 2022.05.16.00) + - RCTTypeSafety (= 0.73.2) + - React-Codegen + - React-Core/CoreModulesHeaders (= 0.73.2) + - React-jsi (= 0.73.2) + - React-NativeModulesApple - React-RCTBlob - - React-RCTImage (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-cxxreact (0.71.15): - - boost (= 1.76.0) - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsinspector (= 0.71.15) - - React-logger (= 0.71.15) - - React-perflogger (= 0.71.15) - - React-runtimeexecutor (= 0.71.15) - - React-Fabric (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-Fabric/animations (= 0.71.15) - - React-Fabric/attributedstring (= 0.71.15) - - React-Fabric/butter (= 0.71.15) - - React-Fabric/componentregistry (= 0.71.15) - - React-Fabric/componentregistrynative (= 0.71.15) - - React-Fabric/components (= 0.71.15) - - React-Fabric/config (= 0.71.15) - - React-Fabric/core (= 0.71.15) - - React-Fabric/debug_core (= 0.71.15) - - React-Fabric/debug_renderer (= 0.71.15) - - React-Fabric/imagemanager (= 0.71.15) - - React-Fabric/leakchecker (= 0.71.15) - - React-Fabric/mapbuffer (= 0.71.15) - - React-Fabric/mounting (= 0.71.15) - - React-Fabric/runtimescheduler (= 0.71.15) - - React-Fabric/scheduler (= 0.71.15) - - React-Fabric/telemetry (= 0.71.15) - - React-Fabric/templateprocessor (= 0.71.15) - - React-Fabric/textlayoutmanager (= 0.71.15) - - React-Fabric/uimanager (= 0.71.15) - - React-Fabric/utils (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/animations (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/attributedstring (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/butter (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/componentregistry (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/componentregistrynative (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-Fabric/components/activityindicator (= 0.71.15) - - React-Fabric/components/image (= 0.71.15) - - React-Fabric/components/inputaccessory (= 0.71.15) - - React-Fabric/components/legacyviewmanagerinterop (= 0.71.15) - - React-Fabric/components/modal (= 0.71.15) - - React-Fabric/components/root (= 0.71.15) - - React-Fabric/components/safeareaview (= 0.71.15) - - React-Fabric/components/scrollview (= 0.71.15) - - React-Fabric/components/slider (= 0.71.15) - - React-Fabric/components/text (= 0.71.15) - - React-Fabric/components/textinput (= 0.71.15) - - React-Fabric/components/unimplementedview (= 0.71.15) - - React-Fabric/components/view (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/activityindicator (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/image (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/inputaccessory (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/legacyviewmanagerinterop (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/modal (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/root (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/safeareaview (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/scrollview (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/slider (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/text (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/textinput (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/unimplementedview (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/components/view (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) + - React-RCTImage (= 0.73.2) + - ReactCommon + - SocketRocket (= 0.6.1) + - React-cxxreact (0.73.2): + - boost (= 1.83.0) + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - React-callinvoker (= 0.73.2) + - React-debug (= 0.73.2) + - React-jsi (= 0.73.2) + - React-jsinspector (= 0.73.2) + - React-logger (= 0.73.2) + - React-perflogger (= 0.73.2) + - React-runtimeexecutor (= 0.73.2) + - React-debug (0.73.2) + - React-Fabric (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/animations (= 0.73.2) + - React-Fabric/attributedstring (= 0.73.2) + - React-Fabric/componentregistry (= 0.73.2) + - React-Fabric/componentregistrynative (= 0.73.2) + - React-Fabric/components (= 0.73.2) + - React-Fabric/core (= 0.73.2) + - React-Fabric/imagemanager (= 0.73.2) + - React-Fabric/leakchecker (= 0.73.2) + - React-Fabric/mounting (= 0.73.2) + - React-Fabric/scheduler (= 0.73.2) + - React-Fabric/telemetry (= 0.73.2) + - React-Fabric/templateprocessor (= 0.73.2) + - React-Fabric/textlayoutmanager (= 0.73.2) + - React-Fabric/uimanager (= 0.73.2) + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/animations (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/attributedstring (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistry (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistrynative (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/components/inputaccessory (= 0.73.2) + - React-Fabric/components/legacyviewmanagerinterop (= 0.73.2) + - React-Fabric/components/modal (= 0.73.2) + - React-Fabric/components/rncore (= 0.73.2) + - React-Fabric/components/root (= 0.73.2) + - React-Fabric/components/safeareaview (= 0.73.2) + - React-Fabric/components/scrollview (= 0.73.2) + - React-Fabric/components/text (= 0.73.2) + - React-Fabric/components/textinput (= 0.73.2) + - React-Fabric/components/unimplementedview (= 0.73.2) + - React-Fabric/components/view (= 0.73.2) + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/inputaccessory (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/legacyviewmanagerinterop (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/modal (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/rncore (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/root (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/safeareaview (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/scrollview (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/text (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/textinput (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/unimplementedview (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/view (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core - Yoga - - React-Fabric/config (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/core (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/debug_core (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/debug_renderer (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/imagemanager (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - React-RCTImage (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/leakchecker (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/mapbuffer (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/mounting (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/runtimescheduler (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/scheduler (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/telemetry (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/templateprocessor (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/textlayoutmanager (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) + - React-Fabric/core (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/imagemanager (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/leakchecker (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/mounting (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/scheduler (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/telemetry (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/templateprocessor (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/textlayoutmanager (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug - React-Fabric/uimanager - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/uimanager (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-Fabric/utils (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 0.71.15) - - RCTTypeSafety (= 0.71.15) - - React-graphics (= 0.71.15) - - React-jsi (= 0.71.15) - - React-jsiexecutor (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-graphics (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - React-Core/Default (= 0.71.15) - - React-hermes (0.71.15): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 0.71.15) - - React-jsi - - React-jsiexecutor (= 0.71.15) - - React-jsinspector (= 0.71.15) - - React-perflogger (= 0.71.15) - - React-jsi (0.71.15): - - boost (= 1.76.0) - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-jsiexecutor (0.71.15): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.15) - - React-jsi (= 0.71.15) - - React-perflogger (= 0.71.15) - - React-jsinspector (0.71.15) - - React-logger (0.71.15): - - glog - - react-native-video (6.0.0-beta.4): - - React-Core - - react-native-video/Video (= 6.0.0-beta.4) - - react-native-video/Video (6.0.0-beta.4): - - PromisesSwift - - React-Core - - React-perflogger (0.71.15) - - React-RCTActionSheet (0.71.15): - - React-Core/RCTActionSheetHeaders (= 0.71.15) - - React-RCTAnimation (0.71.15): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.15) - - React-Codegen (= 0.71.15) - - React-Core/RCTAnimationHeaders (= 0.71.15) - - React-jsi (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-RCTAppDelegate (0.71.15): + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-FabricImage (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - RCTRequired (= 0.73.2) + - RCTTypeSafety (= 0.73.2) + - React-Fabric + - React-graphics + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.73.2) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - Yoga + - React-graphics (0.73.2): + - glog + - RCT-Folly/Fabric (= 2022.05.16.00) + - React-Core/Default (= 0.73.2) + - React-utils + - React-hermes (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - RCT-Folly/Futures (= 2022.05.16.00) + - React-cxxreact (= 0.73.2) + - React-jsi + - React-jsiexecutor (= 0.73.2) + - React-jsinspector (= 0.73.2) + - React-perflogger (= 0.73.2) + - React-ImageManager (0.73.2): + - glog + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - React-jserrorhandler (0.73.2): + - RCT-Folly/Fabric (= 2022.05.16.00) + - React-debug + - React-jsi + - React-Mapbuffer + - React-jsi (0.73.2): + - boost (= 1.83.0) + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - React-jsiexecutor (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - React-cxxreact (= 0.73.2) + - React-jsi (= 0.73.2) + - React-perflogger (= 0.73.2) + - React-jsinspector (0.73.2) + - React-jsitracing (0.73.2): + - React-jsi + - React-logger (0.73.2): + - glog + - React-Mapbuffer (0.73.2): + - glog + - React-debug + - react-native-video (6.3.0): + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - React-debug + - React-Fabric + - React-graphics + - React-ImageManager + - react-native-video/Video (= 6.3.0) + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-video/Video (6.3.0): + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - React-debug + - React-Fabric + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-nativeconfig (0.73.2) + - React-NativeModulesApple (0.73.2): + - glog + - hermes-engine + - React-callinvoker + - React-Core + - React-cxxreact + - React-jsi + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-perflogger (0.73.2) + - React-RCTActionSheet (0.73.2): + - React-Core/RCTActionSheetHeaders (= 0.73.2) + - React-RCTAnimation (0.73.2): + - RCT-Folly (= 2022.05.16.00) + - RCTTypeSafety + - React-Codegen + - React-Core/RCTAnimationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCommon + - React-RCTAppDelegate (0.73.2): - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core + - React-CoreModules + - React-debug + - React-Fabric + - React-graphics + - React-hermes + - React-nativeconfig + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-RCTNetwork + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - ReactCommon + - React-RCTBlob (0.73.2): + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - React-Codegen + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-NativeModulesApple + - React-RCTNetwork + - ReactCommon + - React-RCTFabric (0.73.2): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-graphics + - React-ImageManager + - React-jsi + - React-nativeconfig + - React-RCTImage + - React-RCTText + - React-rendererdebug + - React-runtimescheduler + - React-utils + - Yoga + - React-RCTImage (0.73.2): + - RCT-Folly (= 2022.05.16.00) + - RCTTypeSafety + - React-Codegen + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTNetwork + - ReactCommon + - React-RCTLinking (0.73.2): + - React-Codegen + - React-Core/RCTLinkingHeaders (= 0.73.2) + - React-jsi (= 0.73.2) + - React-NativeModulesApple + - ReactCommon + - ReactCommon/turbomodule/core (= 0.73.2) + - React-RCTNetwork (0.73.2): + - RCT-Folly (= 2022.05.16.00) + - RCTTypeSafety + - React-Codegen + - React-Core/RCTNetworkHeaders + - React-jsi + - React-NativeModulesApple + - ReactCommon + - React-RCTSettings (0.73.2): + - RCT-Folly (= 2022.05.16.00) + - RCTTypeSafety + - React-Codegen + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - ReactCommon + - React-RCTText (0.73.2): + - React-Core/RCTTextHeaders (= 0.73.2) + - Yoga + - React-RCTVibration (0.73.2): + - RCT-Folly (= 2022.05.16.00) + - React-Codegen + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCommon + - React-rendererdebug (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - RCT-Folly (= 2022.05.16.00) + - React-debug + - React-rncore (0.73.2) + - React-RuntimeApple (0.73.2): + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-utils + - React-RuntimeCore (0.73.2): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - React-cxxreact + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-runtimeexecutor + - React-runtimescheduler + - React-runtimeexecutor (0.73.2): + - React-jsi (= 0.73.2) + - React-RuntimeHermes (0.73.2): + - hermes-engine + - RCT-Folly/Fabric (= 2022.05.16.00) + - React-jsi + - React-jsitracing + - React-nativeconfig + - React-utils + - React-runtimescheduler (0.73.2): + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - React-callinvoker + - React-cxxreact + - React-debug + - React-jsi + - React-rendererdebug + - React-runtimeexecutor + - React-utils + - React-utils (0.73.2): + - glog + - RCT-Folly (= 2022.05.16.00) + - React-debug + - ReactCommon (0.73.2): + - React-logger (= 0.73.2) + - ReactCommon/turbomodule (= 0.73.2) + - ReactCommon/turbomodule (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - React-callinvoker (= 0.73.2) + - React-cxxreact (= 0.73.2) + - React-jsi (= 0.73.2) + - React-logger (= 0.73.2) + - React-perflogger (= 0.73.2) + - ReactCommon/turbomodule/bridging (= 0.73.2) + - ReactCommon/turbomodule/core (= 0.73.2) + - ReactCommon/turbomodule/bridging (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - React-callinvoker (= 0.73.2) + - React-cxxreact (= 0.73.2) + - React-jsi (= 0.73.2) + - React-logger (= 0.73.2) + - React-perflogger (= 0.73.2) + - ReactCommon/turbomodule/core (0.73.2): + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - React-callinvoker (= 0.73.2) + - React-cxxreact (= 0.73.2) + - React-jsi (= 0.73.2) + - React-logger (= 0.73.2) + - React-perflogger (= 0.73.2) + - RNCPicker (2.7.5): + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - React-debug + - React-Fabric - React-graphics + - React-ImageManager + - React-NativeModulesApple - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-RCTBlob (0.71.15): - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.15) - - React-Core/RCTBlobHeaders (= 0.71.15) - - React-Core/RCTWebSocket (= 0.71.15) - - React-jsi (= 0.71.15) - - React-RCTNetwork (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-RCTFabric (0.71.15): - - RCT-Folly/Fabric (= 2021.07.22.00) - - React-Core (= 0.71.15) - - React-Fabric (= 0.71.15) - - React-RCTImage (= 0.71.15) - - React-RCTImage (0.71.15): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.15) - - React-Codegen (= 0.71.15) - - React-Core/RCTImageHeaders (= 0.71.15) - - React-jsi (= 0.71.15) - - React-RCTNetwork (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-RCTLinking (0.71.15): - - React-Codegen (= 0.71.15) - - React-Core/RCTLinkingHeaders (= 0.71.15) - - React-jsi (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-RCTNetwork (0.71.15): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.15) - - React-Codegen (= 0.71.15) - - React-Core/RCTNetworkHeaders (= 0.71.15) - - React-jsi (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-RCTSettings (0.71.15): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.15) - - React-Codegen (= 0.71.15) - - React-Core/RCTSettingsHeaders (= 0.71.15) - - React-jsi (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-RCTText (0.71.15): - - React-Core/RCTTextHeaders (= 0.71.15) - - React-RCTVibration (0.71.15): - - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.15) - - React-Core/RCTVibrationHeaders (= 0.71.15) - - React-jsi (= 0.71.15) - - ReactCommon/turbomodule/core (= 0.71.15) - - React-rncore (0.71.15) - - React-runtimeexecutor (0.71.15): - - React-jsi (= 0.71.15) - - ReactCommon/turbomodule/bridging (0.71.15): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.15) - - React-Core (= 0.71.15) - - React-cxxreact (= 0.71.15) - - React-jsi (= 0.71.15) - - React-logger (= 0.71.15) - - React-perflogger (= 0.71.15) - - ReactCommon/turbomodule/core (0.71.15): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.15) - - React-Core (= 0.71.15) - - React-cxxreact (= 0.71.15) - - React-jsi (= 0.71.15) - - React-logger (= 0.71.15) - - React-perflogger (= 0.71.15) - - SocketRocket (0.6.0) + - Yoga + - SocketRocket (0.6.1) - Yoga (1.14.0) - - YogaKit (1.18.1): - - Yoga (~> 1.14) DEPENDENCIES: - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - - Flipper (= 0.125.0) - - Flipper-Boost-iOSX (= 1.76.0.1.11) - - Flipper-DoubleConversion (= 3.2.0.1) - - Flipper-Fmt (= 7.1.7) - - Flipper-Folly (= 2.6.10) - - Flipper-Glog (= 0.5.0.5) - - Flipper-PeerTalk (= 0.0.4) - - Flipper-RSocket (= 1.4.3) - - FlipperKit (= 0.125.0) - - FlipperKit/Core (= 0.125.0) - - FlipperKit/CppBridge (= 0.125.0) - - FlipperKit/FBCxxFollyDynamicConvert (= 0.125.0) - - FlipperKit/FBDefines (= 0.125.0) - - FlipperKit/FKPortForwarding (= 0.125.0) - - FlipperKit/FlipperKitHighlightOverlay (= 0.125.0) - - FlipperKit/FlipperKitLayoutPlugin (= 0.125.0) - - FlipperKit/FlipperKitLayoutTextSearchable (= 0.125.0) - - FlipperKit/FlipperKitNetworkPlugin (= 0.125.0) - - FlipperKit/FlipperKitReactPlugin (= 0.125.0) - - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.125.0) - - FlipperKit/SKIOSNetworkPlugin (= 0.125.0) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - libevent (~> 2.1.12) - - OpenSSL-Universal (= 1.1.1100) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) @@ -800,18 +1170,25 @@ DEPENDENCIES: - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - React-Codegen (from `build/generated/ios`) - React-Core (from `../node_modules/react-native/`) - - React-Core/DevSupport (from `../node_modules/react-native/`) - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../node_modules/react-native/ReactCommon`) - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - react-native-video (from `../../..`) + - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) + - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) @@ -824,30 +1201,23 @@ DEPENDENCIES: - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - React-rncore (from `../node_modules/react-native/ReactCommon`) + - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: - - CocoaAsyncSocket - - Flipper - - Flipper-Boost-iOSX - - Flipper-DoubleConversion - - Flipper-Fmt - - Flipper-Folly - - Flipper-Glog - - Flipper-PeerTalk - - Flipper-RSocket - - FlipperKit - fmt - libevent - - OpenSSL-Universal - - PromisesObjC - - PromisesSwift - SocketRocket - - YogaKit EXTERNAL SOURCES: boost: @@ -856,12 +1226,11 @@ EXTERNAL SOURCES: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" - FBReactNativeSpec: - :path: "../node_modules/react-native/React/FBReactNativeSpec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2023-11-17-RNv0.73.0-21043a3fc062be445e56a2c10ecd8be028dd9cc5 RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: @@ -880,22 +1249,38 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../node_modules/react-native/ReactCommon/react/debug" React-Fabric: :path: "../node_modules/react-native/ReactCommon" + React-FabricImage: + :path: "../node_modules/react-native/ReactCommon" React-graphics: :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" React-hermes: :path: "../node_modules/react-native/ReactCommon/hermes" + React-ImageManager: + :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jserrorhandler: + :path: "../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: :path: "../node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector" + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsitracing: + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: :path: "../node_modules/react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../node_modules/react-native/ReactCommon" react-native-video: :path: "../../.." + React-nativeconfig: + :path: "../node_modules/react-native/ReactCommon" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: :path: "../node_modules/react-native/ReactCommon/reactperflogger" React-RCTActionSheet: @@ -920,73 +1305,87 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: :path: "../node_modules/react-native/Libraries/Vibration" + React-rendererdebug: + :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" React-rncore: :path: "../node_modules/react-native/ReactCommon" + React-RuntimeApple: + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimescheduler: + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-utils: + :path: "../node_modules/react-native/ReactCommon/react/utils" ReactCommon: :path: "../node_modules/react-native/ReactCommon" + RNCPicker: + :path: "../node_modules/@react-native-picker/picker" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost: 7dcd2de282d72e344012f7d6564d024930a6a440 - CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - FBLazyVector: d06bbe89e3a89ee90c4deab1c84bf306ffa5ed37 - FBReactNativeSpec: 6fecc43741c2aed59c2bc6ba2c2f486014e03521 - Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0 - Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c - Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 - Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b - Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3 - Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446 - Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 - Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 - FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86 + boost: d3f49c53809116a5d38da093a8aa78bf551aed09 + DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953 + FBLazyVector: fbc4957d9aa695250b55d879c1d86f79d7e69ab4 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b - hermes-engine: 04437e4291ede4af0c76c25e7efd0eacb8fd25e5 + glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 + hermes-engine: b361c9ef5ef3cda53f66e195599b47e1f84ffa35 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 - OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c - PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef - PromisesSwift: cf9eb58666a43bbe007302226e510b16c1e10959 - RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 - RCTRequired: 4ce9da4fa2f8a134f62c70e4ab9d971b9d640f41 - RCTTypeSafety: decfec2884f0c523f799600d2b6105cdc15e13db - React: ca22a0b3f199b6acac95416ef7eb96cc84a55103 - React-callinvoker: 366d4449bc2901e89da3f30c6d203c491d060350 - React-Codegen: 6fe71a7e025aa51e73b66ebb092d59a2a7701bae - React-Core: 169395096d2c22872e22cd74e3694a4b041cce76 - React-CoreModules: 8c2a970d9fd778e6016b9297f2c2dddbe78b04ec - React-cxxreact: e61b3e92887bb8fc241326b83d667953ff732923 - React-Fabric: f4ddd27dc414581018db9cbdd362c80e77b08eca - React-graphics: 516c3bb35198e4a2531fd52ab6cfc681dad71874 - React-hermes: 476b93736605b457d1bc390336656c94460205b7 - React-jsi: 9fe8766963aa3aea90bbd477ea63255eb847d404 - React-jsiexecutor: e0cde8d57cee18097b3d2b1bf6404ad25dd8d33b - React-jsinspector: 4ade58a6a355d97a53f847543b14f4cb5033cb70 - React-logger: 56699550750c013096a11dce3bc996e7dd583835 - react-native-video: 6078b448c21630b0a2937436527ad54fd2a1fdd8 - React-perflogger: 0cc42978a483a47f3696171dac2e7033936fc82d - React-RCTActionSheet: ea922b476d24f6d40b8e02ac3228412bd3637468 - React-RCTAnimation: 7be2c148398eaa5beac950b2b5ec7102389ec3ad - React-RCTAppDelegate: dc57448e65541509565b59518e8a81e30ae69bd7 - React-RCTBlob: c1e1e53b334f36b3311c3206036c99f4e5406cdf - React-RCTFabric: 42e8e9067f73fdb2e9d12f0b09003cd49d3da139 - React-RCTImage: 4a2cd71dd8c1954cfab50e244b269d47bdcc76da - React-RCTLinking: c8ff9fe7f5741afc05894c7da4a0d2bd1458f247 - React-RCTNetwork: 93c329744baa8c04057a5a29b790618e0c2a6a68 - React-RCTSettings: bcd09cd3ee26967bdfbc8af174404b8ffabfbc3c - React-RCTText: c525eb78cfe9489f130fa69004ff081a5ae33e06 - React-RCTVibration: a97783e3645ddf852e34da2e015656e309f3a083 - React-rncore: 0fc98082b749bad91dbb7a4bca9cb53386477c81 - React-runtimeexecutor: 8f2ddd9db7874ec7de84f5c55d73aeaaf82908e2 - ReactCommon: 309d965cb51f058d07dea65bc04dcf462911f0a4 - SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 - Yoga: 68c9c592c3e80ec37ff28db20eedb13d84aae5df - YogaKit: f782866e155069a2cca2517aafea43200b01fd5a + RCT-Folly: 7169b2b1c44399c76a47b5deaaba715eeeb476c0 + RCTRequired: 9b1e7e262745fb671e33c51c1078d093bd30e322 + RCTTypeSafety: a759e3b086eccf3e2cbf2493d22f28e082f958e6 + React: 805f5dd55bbdb92c36b4914c64aaae4c97d358dc + React-callinvoker: 6a697867607c990c2c2c085296ee32cfb5e47c01 + React-Codegen: f3cb992539e5c21675f087e536d64b1f2a448655 + React-Core: 49f66fecc7695464e9b7bc7dc7cd9473d2c60584 + React-CoreModules: 710e7c557a1a8180bd1645f5b4bf79f4bd3f5417 + React-cxxreact: 345857b5e4be000c0527df78be3b41a0677a20ce + React-debug: f1637bce73342b2f6eee4982508fdfb088667a87 + React-Fabric: 4dfcff8f14d8e5a7a60b11b7862dad2a9d99c65b + React-FabricImage: 4a9e9510b7f28bbde6a743b18c0cb941a142e938 + React-graphics: dd5af9d8b1b45171fd6933e19fed522f373bcb10 + React-hermes: a52d183a5cf8ccb7020ce3df4275b89d01e6b53e + React-ImageManager: c5b7db131eff71443d7f3a8d686fd841d18befd3 + React-jserrorhandler: 97a6a12e2344c3c4fdd7ba1edefb005215c732f8 + React-jsi: a182068133f80918cd0eec77875abaf943a0b6be + React-jsiexecutor: dacd00ce8a18fc00a0ae6c25e3015a6437e5d2e8 + React-jsinspector: 03644c063fc3621c9a4e8bf263a8150909129618 + React-jsitracing: 7c77101b38fcc8fa7f198de7e1d834350a85af90 + React-logger: 66b168e2b2bee57bd8ce9e69f739d805732a5570 + React-Mapbuffer: 9ee041e1d7be96da6d76a251f92e72b711c651d6 + react-native-video: 382353af62f6cbf8002a6de8d6633769edd2af07 + React-nativeconfig: d753fbbc8cecc8ae413d615599ac378bbf6999bb + React-NativeModulesApple: 964f4eeab1b4325e8b6a799cf4444c3fd4eb0a9c + React-perflogger: 29efe63b7ef5fbaaa50ef6eaa92482f98a24b97e + React-RCTActionSheet: 69134c62aefd362027b20da01cd5d14ffd39db3f + React-RCTAnimation: 3b5a57087c7a5e727855b803d643ac1d445488f5 + React-RCTAppDelegate: cb1a9a8447ddad006f934988016390f4df472e74 + React-RCTBlob: 26ea660f2be1e6de62f2d2ad9a9c7b9bfabb786f + React-RCTFabric: bb6dbbff2f80b9489f8b2f1d2554aa040aa2e3cd + React-RCTImage: 27b27f4663df9e776d0549ed2f3536213e793f1b + React-RCTLinking: 962880ce9d0e2ea83fd182953538fc4ed757d4da + React-RCTNetwork: 73a756b44d4ad584bae13a5f1484e3ce12accac8 + React-RCTSettings: 6d7f8d807f05de3d01cfb182d14e5f400716faac + React-RCTText: 73006e95ca359595c2510c1c0114027c85a6ddd3 + React-RCTVibration: 599f427f9cbdd9c4bf38959ca020e8fef0717211 + React-rendererdebug: f2946e0a1c3b906e71555a7c4a39aa6a6c0e639b + React-rncore: 6e3139cf51cea08068f008da426821d1deaa24b9 + React-RuntimeApple: 08c29690996ed935e35054965bcfb70ebea67318 + React-RuntimeCore: 5b73f40b46d78a825cf71714e1e5044d389702d6 + React-runtimeexecutor: 2d1f64f58193f00a3ad71d3f89c2bfbfe11cf5a5 + React-RuntimeHermes: 01dcb5a4e9073496f6f981a8648843771e3f6516 + React-runtimescheduler: df8945a656356ff10f58f65a70820478bfcf33ad + React-utils: f5bc61e7ea3325c0732ae2d755f4441940163b85 + ReactCommon: 45b5d4f784e869c44a6f5a8fad5b114ca8f78c53 + RNCPicker: 6ce7e81292cec4ddf1a5eeaeec00c31206e9e134 + SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 + Yoga: e64aa65de36c0832d04e8c7bd614396c77a80047 -PODFILE CHECKSUM: 780eb8fa466e7a1ad2e9200598bc65585b637433 +PODFILE CHECKSUM: cf04724bfafa2ca6f6877a9a65072610a4b6ed7c -COCOAPODS: 1.12.0 +COCOAPODS: 1.15.2 diff --git a/examples/FabricExample/jest.config.js b/examples/FabricExample/jest.config.js new file mode 100644 index 0000000000..8130feaddf --- /dev/null +++ b/examples/FabricExample/jest.config.js @@ -0,0 +1,3 @@ +module.exports = { + preset: 'react-native', +}; \ No newline at end of file diff --git a/examples/FabricExample/metro.config.js b/examples/FabricExample/metro.config.js index 46475fb308..b5f681a802 100644 --- a/examples/FabricExample/metro.config.js +++ b/examples/FabricExample/metro.config.js @@ -2,6 +2,7 @@ const path = require('path'); const escape = require('escape-string-regexp'); const exclusionList = require('metro-config/src/defaults/exclusionList'); const pak = require('../../package.json'); +const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config'); const root = path.resolve(__dirname, '../../'); @@ -9,7 +10,7 @@ const modules = Object.keys({ ...pak.peerDependencies, }); -module.exports = { +const config = { projectRoot: __dirname, watchFolders: [root], @@ -37,4 +38,6 @@ module.exports = { }, }), }, -}; +} + +module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/examples/FabricExample/package.json b/examples/FabricExample/package.json index bbb234ad45..2fdbd92d70 100644 --- a/examples/FabricExample/package.json +++ b/examples/FabricExample/package.json @@ -11,27 +11,33 @@ "pod-install": "bundle exec npx pod-install --project-directory=ios --verbose" }, "dependencies": { + "@react-native-picker/picker": "2.7.5", "react": "18.1.0", - "react-native": "^0.71.6" + "react-native": "0.73.2" }, "devDependencies": { "@babel/core": "^7.12.9", "@babel/runtime": "^7.12.5", "@react-native-community/eslint-config": "^2.0.0", + "@react-native/babel-preset": "0.73.19", + "@react-native/eslint-config": "0.73.2", + "@react-native/metro-config": "0.73.3", + "@react-native/typescript-config": "0.73.1", "@tsconfig/react-native": "^2.0.2", "@types/jest": "^26.0.23", - "@types/react": "^18.0.21", + "@types/react": "^18.2.6", "@types/react-native": "^0.70.6", "@types/react-test-renderer": "^18.0.0", "@typescript-eslint/eslint-plugin": "^5.37.0", "@typescript-eslint/parser": "^5.37.0", - "babel-jest": "^26.6.3", + "babel-jest": "^29.6.3", "babel-plugin-module-resolver": "^5.0.0", "eslint": "^7.32.0", - "jest": "^26.6.3", + "jest": "^29.6.3", "metro-react-native-babel-preset": "0.72.3", + "prettier": "2.8.8", "react-test-renderer": "18.1.0", - "typescript": "^4.8.3" + "typescript": "5.0.4" }, "jest": { "preset": "react-native", @@ -43,5 +49,8 @@ "json", "node" ] + }, + "engines": { + "node": ">=18" } } diff --git a/examples/FabricExample/src/MultiValueControl.tsx b/examples/FabricExample/src/MultiValueControl.tsx new file mode 100644 index 0000000000..bf58f3a96a --- /dev/null +++ b/examples/FabricExample/src/MultiValueControl.tsx @@ -0,0 +1,75 @@ +import React, {FunctionComponent} from 'react'; + +import { + StyleSheet, + Text, + TextStyle, + TouchableOpacity, + View, +} from 'react-native'; +import {ResizeMode} from 'react-native-video'; + +export type MultiValueControlPropType = number | string | ResizeMode; + +/* + * MultiValueControl displays a list clickable text view + */ + +interface MultiValueControlType { + // a list a string or number to be displayed + values: Array; + // The selected value in values + selected?: T; + // callback to press onPress + onPress: (arg: MultiValueControlPropType) => void; +} + +const MultiValueControl: FunctionComponent< + MultiValueControlType +> = ({values, selected, onPress}) => { + const selectedStyle: TextStyle = StyleSheet.flatten([ + styles.option, + {fontWeight: 'bold'}, + ]); + + const unselectedStyle: TextStyle = StyleSheet.flatten([ + styles.option, + {fontWeight: 'normal'}, + ]); + + return ( + + {values.map((value: MultiValueControlPropType) => { + const _style = value === selected ? selectedStyle : unselectedStyle; + return ( + { + onPress?.(value); + }}> + {value} + + ); + })} + + ); +}; + +const styles = StyleSheet.create({ + option: { + alignSelf: 'center', + fontSize: 11, + color: 'white', + paddingLeft: 2, + paddingRight: 2, + lineHeight: 12, + }, + container: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + }, +}); + +export default MultiValueControl; diff --git a/examples/FabricExample/src/ToggleControl.tsx b/examples/FabricExample/src/ToggleControl.tsx new file mode 100644 index 0000000000..fd5f83a509 --- /dev/null +++ b/examples/FabricExample/src/ToggleControl.tsx @@ -0,0 +1,73 @@ +import React from 'react'; + +import { + StyleSheet, + Text, + TextStyle, + TouchableOpacity, + View, +} from 'react-native'; + +/* + * ToggleControl displays a 2 states clickable text + */ + +interface ToggleControlType { + // boolean indicating if text is selected state + isSelected?: boolean; + // value of text when selected + selectedText?: string; + // value of text when NOT selected + unselectedText?: string; + // default text if no only one text field is needed + text?: string; + // callback called when pressing the component + onPress: () => void; +} + +const ToggleControl = ({ + isSelected, + selectedText, + unselectedText, + text, + onPress, +}: ToggleControlType) => { + const selectedStyle: TextStyle = StyleSheet.flatten([ + styles.controlOption, + {fontWeight: 'bold'}, + ]); + + const unselectedStyle: TextStyle = StyleSheet.flatten([ + styles.controlOption, + {fontWeight: 'normal'}, + ]); + + const style = isSelected ? selectedStyle : unselectedStyle; + const _text = text ? text : isSelected ? selectedText : unselectedText; + return ( + + + {_text} + + + ); +}; + +const styles = StyleSheet.create({ + controlOption: { + alignSelf: 'center', + fontSize: 11, + color: 'white', + paddingLeft: 2, + paddingRight: 2, + lineHeight: 12, + }, + resizeModeControl: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + }, +}); + +export default ToggleControl; diff --git a/examples/FabricExample/src/VideoPlayer.tsx b/examples/FabricExample/src/VideoPlayer.tsx index 34a4776b94..ba12f40314 100644 --- a/examples/FabricExample/src/VideoPlayer.tsx +++ b/examples/FabricExample/src/VideoPlayer.tsx @@ -1,557 +1,831 @@ 'use strict'; -import React, {Component, createRef} from 'react'; + +import React, {Component} from 'react'; import { - Alert, - GestureResponderEvent, - Platform, - StyleSheet, Text, TouchableOpacity, View, + ActivityIndicator, + ToastAndroid, + Platform, + Alert, } from 'react-native'; -import Video, {FilterType, VideoRef, ResizeMode, IgnoreSilentSwitchType, MixWithOthersType} from 'react-native-video'; - -const filterTypes = [ - FilterType.NONE, - FilterType.INVERT, - FilterType.MONOCHROME, - FilterType.POSTERIZE, - FilterType.FALSE, - FilterType.MAXIMUMCOMPONENT, - FilterType.MINIMUMCOMPONENT, - FilterType.CHROME, - FilterType.FADE, - FilterType.INSTANT, - FilterType.MONO, - FilterType.NOIR, - FilterType.PROCESS, - FilterType.TONAL, - FilterType.TRANSFER, - FilterType.SEPIA, -]; - -type SkinType = 'custom' | 'native' | 'embed' - -type State = { - rate: number, - volume: number, - muted: boolean, - resizeMode: ResizeMode, - duration: number, - currentTime: number, - controls: boolean, - paused: boolean, - skin: SkinType, - ignoreSilentSwitch: IgnoreSilentSwitchType, - mixWithOthers: MixWithOthersType, - isBuffering: boolean, - filter: FilterType, - filterEnabled: boolean, +import Video, { + AudioTrack, + OnAudioTracksData, + OnLoadData, + OnProgressData, + OnTextTracksData, + OnVideoAspectRatioData, + TextTrack, + VideoDecoderProperties, + OnBufferData, + OnAudioFocusChangedData, + OnVideoErrorData, + VideoRef, + ResizeMode, + SelectedTrack, + DRMType, + OnTextTrackDataChangedData, + TextTrackType, + ISO639_1, + OnSeekData, + OnPlaybackStateChangedData, + OnPlaybackRateChangeData, + OnVideoTracksData, + VideoTrack, + SelectedVideoTrackType, + SelectedVideoTrack, + BufferingStrategyType, + ReactVideoSource, + Drm, + TextTracks, +} from 'react-native-video'; +import ToggleControl from './ToggleControl'; +import MultiValueControl, { + MultiValueControlPropType, +} from './MultiValueControl'; +import styles from './styles'; +import AudioTrackSelector from './components/AudioTracksSelector'; +import TextTrackSelector from './components/TextTracksSelector'; +import VideoTrackSelector from './components/VideoTracksSelector'; +import Seeker from './components/Seeker'; + +type AdditionnalSourceInfo = { + textTracks: TextTracks; + adTagUrl: string; + description: string; + drm: Drm; + noView: boolean; +}; + +type SampleVideoSource = ReactVideoSource | AdditionnalSourceInfo; + +interface StateType { + rate: number; + volume: number; + muted: boolean; + resizeMode: ResizeMode; + duration: number; + currentTime: number; + videoWidth: number; + videoHeight: number; + paused: boolean; + fullscreen: true; + decoration: true; + isLoading: boolean; + audioTracks: Array; + textTracks: Array; + videoTracks: Array; + selectedAudioTrack: SelectedTrack | undefined; + selectedTextTrack: SelectedTrack | undefined; + selectedVideoTrack: SelectedVideoTrack; + srcListId: number; + loop: boolean; + showRNVControls: boolean; + useCache: boolean; + poster?: string; + showNotificationControls: boolean; + isSeeking: boolean; } -class VideoPlayer extends Component<{}, State> { - controlRef: React.RefObject; - videoRef: React.RefObject; - constructor(props: any) { - super(props); - this.onLoad = this.onLoad.bind(this); - this.onProgress = this.onProgress.bind(this); - this.onBuffer = this.onBuffer.bind(this); - this.onTouchControl = this.onTouchControl.bind(this); - this.controlRef = createRef(); - this.videoRef = createRef(); - } - state: State = { +class VideoPlayer extends Component { + state: StateType = { rate: 1, volume: 1, muted: false, resizeMode: ResizeMode.CONTAIN, duration: 0.0, currentTime: 0.0, - controls: false, - paused: true, - skin: 'custom', - ignoreSilentSwitch: IgnoreSilentSwitchType.IGNORE, - mixWithOthers: MixWithOthersType.DUCK, - isBuffering: false, - filter: FilterType.NONE, - filterEnabled: true, + videoWidth: 0, + videoHeight: 0, + paused: false, + fullscreen: true, + decoration: true, + isLoading: false, + audioTracks: [], + textTracks: [], + videoTracks: [], + selectedAudioTrack: undefined, + selectedTextTrack: undefined, + selectedVideoTrack: { + type: SelectedVideoTrackType.AUTO, + }, + srcListId: 0, + loop: false, + showRNVControls: false, + useCache: false, + poster: undefined, + showNotificationControls: false, + isSeeking: false, }; - onLoad(data: any) { - console.log('On load fired!'); - console.log(data.duration); - this.setState({duration: data.duration}); - } + // internal usage change to index if you want to select tracks by index instead of lang + textTracksSelectionBy = 'index'; + + srcAllPlatformList = [ + { + description: 'local file landscape', + uri: require('./broadchurch.mp4'), + }, + { + description: 'local file landscape cropped', + uri: require('./broadchurch.mp4'), + cropStart: 3000, + cropEnd: 10000, + }, + { + description: 'local file portrait', + uri: require('./portrait.mp4'), + metadata: { + title: 'Test Title', + subtitle: 'Test Subtitle', + artist: 'Test Artist', + description: 'Test Description', + imageUri: + 'https://pbs.twimg.com/profile_images/1498641868397191170/6qW2XkuI_400x400.png', + }, + }, + { + description: '(hls|live) red bull tv', + textTracksAllowChunklessPreparation: false, + uri: 'https://rbmn-live.akamaized.net/hls/live/590964/BoRB-AT/master_928.m3u8', + metadata: { + title: 'Custom Title', + subtitle: 'Custom Subtitle', + artist: 'Custom Artist', + description: 'Custom Description', + imageUri: + 'https://pbs.twimg.com/profile_images/1498641868397191170/6qW2XkuI_400x400.png', + }, + }, + { + description: 'invalid URL', + uri: 'mmt://www.youtube.com', + type: 'mpd', + }, + {description: '(no url) Stopped playback', uri: undefined}, + { + description: '(no view) no View', + noView: true, + }, + { + description: 'Another live sample', + uri: 'https://live.forstreet.cl/live/livestream.m3u8', + }, + { + description: 'another bunny (can be saved)', + uri: 'https://rawgit.com/mediaelement/mediaelement-files/master/big_buck_bunny.mp4', + headers: {referer: 'www.github.com', 'User-Agent': 'react.native.video'}, + }, + { + description: 'sintel with subtitles', + uri: 'https://bitmovin-a.akamaihd.net/content/sintel/hls/playlist.m3u8', + }, + { + description: 'sintel starts at 20sec', + uri: 'https://bitmovin-a.akamaihd.net/content/sintel/hls/playlist.m3u8', + startPosition: 50000, + }, + { + description: 'BigBugBunny sideLoaded subtitles', + // sideloaded subtitles wont work for streaming like HLS on ios + // mp4 + uri: 'https://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4', + textTracks: [ + { + title: 'test', + language: 'en' as ISO639_1, + type: TextTrackType.VTT, + uri: 'https://bitdash-a.akamaihd.net/content/sintel/subtitles/subtitles_en.vtt', + }, + ], + }, + ]; + + srcIosList = []; + + srcAndroidList = [ + { + description: 'Another live sample', + uri: 'https://live.forstreet.cl/live/livestream.m3u8', + }, + { + description: 'asset file', + uri: 'asset:///broadchurch.mp4', + }, + { + description: '(dash) sintel subtitles', + uri: 'https://bitmovin-a.akamaihd.net/content/sintel/sintel.mpd', + }, + { + description: '(mp4) big buck bunny', + uri: 'http://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4', + }, + { + description: '(mp4|subtitles) demo with sintel Subtitles', + uri: 'http://www.youtube.com/api/manifest/dash/id/bf5bb2419360daf1/source/youtube?as=fmp4_audio_clear,fmp4_sd_hd_clear&sparams=ip,ipbits,expire,source,id,as&ip=0.0.0.0&ipbits=0&expire=19000000000&signature=51AF5F39AB0CEC3E5497CD9C900EBFEAECCCB5C7.8506521BFC350652163895D4C26DEE124209AA9E&key=ik0', + type: 'mpd', + }, + { + description: '(mp4) big buck bunny With Ads', + adTagUrl: + 'https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/vmap_ad_samples&sz=640x480&cust_params=sample_ar%3Dpremidpostoptimizedpodbumper&ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&env=vp&impl=s&cmsid=496&vid=short_onecue&correlator=', + uri: 'http://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4', + }, + { + description: 'WV: Secure SD & HD (cbcs,MP4,H264)', + uri: 'https://storage.googleapis.com/wvmedia/cbcs/h264/tears/tears_aes_cbcs.mpd', + drm: { + type: DRMType.WIDEVINE, + licenseServer: + 'https://proxy.uat.widevine.com/proxy?provider=widevine_test', + }, + }, + { + description: 'Secure UHD (cenc)', + uri: 'https://storage.googleapis.com/wvmedia/cenc/h264/tears/tears_uhd.mpd', + drm: { + type: DRMType.WIDEVINE, + licenseServer: + 'https://proxy.uat.widevine.com/proxy?provider=widevine_test', + }, + }, + { + description: 'rtsp big bug bunny', + uri: 'rtsp://rtspstream:3cfa3c36a9c00f4aa38f3cd35816b287@zephyr.rtsp.stream/movie', + type: 'rtsp', + }, + ]; + + // poster which can be displayed + samplePoster = + 'https://upload.wikimedia.org/wikipedia/commons/1/18/React_Native_Logo.png'; + + srcList: SampleVideoSource[] = this.srcAllPlatformList.concat( + Platform.OS === 'android' ? this.srcAndroidList : this.srcIosList, + ); + + video?: VideoRef; + + popupInfo = () => { + VideoDecoderProperties.getWidevineLevel().then((widevineLevel: number) => { + VideoDecoderProperties.isHEVCSupported().then((hevc: string) => { + VideoDecoderProperties.isCodecSupported('video/avc', 1920, 1080).then( + (avc: string) => { + this.toast( + true, + 'Widevine level: ' + + widevineLevel + + '\n hevc: ' + + hevc + + '\n avc: ' + + avc, + ); + }, + ); + }); + }); + }; - onProgress(data: any) { + onLoad = (data: OnLoadData) => { + this.setState({duration: data.duration, loading: false}); + this.onAudioTracks(data); + this.onTextTracks(data); + this.onVideoTracks(data); + }; + + onProgress = (data: OnProgressData) => { this.setState({currentTime: data.currentTime}); - } + }; - onBuffer({isBuffering}: {isBuffering: boolean}) { - this.setState({isBuffering}); - } + onSeek = (data: OnSeekData) => { + this.setState({isSeeking: false}); + this.setState({currentTime: data.currentTime}); + }; - onTouchControl(e: GestureResponderEvent) { - if (!this.controlRef.current || !this.videoRef.current) return; - const videoCommands = this.videoRef.current; - const touchX = e.nativeEvent.pageX; - const duration = this.state.duration; + onVideoLoadStart = () => { + console.log('onVideoLoadStart'); + this.setState({isLoading: true}); + }; - this.controlRef.current.measureInWindow((x, y, width, height) => { - const relativeX = touchX - x; - const nextTime = (relativeX / width) * duration; - videoCommands.seek(nextTime); + onAudioTracks = (data: OnAudioTracksData) => { + const selectedTrack = data.audioTracks?.find((x: AudioTrack) => { + return x.selected; }); - } - - getCurrentTimePercentage() { - if (this.state.currentTime > 0 && this.state.duration !== 0) { - return this.state.currentTime / this.state.duration; + if (selectedTrack?.index) { + this.setState({ + audioTracks: data.audioTracks, + selectedAudioTrack: { + type: SelectedVideoTrackType.INDEX, + value: selectedTrack?.index, + }, + }); } else { - return 0; + this.setState({ + audioTracks: data.audioTracks, + }); } - } + }; + + onVideoTracks = (data: OnVideoTracksData) => { + console.log('onVideoTracks', data.videoTracks); + this.setState({ + videoTracks: data.videoTracks, + }); + }; - setFilter(step: number) { - let index = filterTypes.indexOf(this.state.filter) + step; + onTextTracks = (data: OnTextTracksData) => { + const selectedTrack = data.textTracks?.find((x: TextTrack) => { + return x?.selected; + }); - if (index === filterTypes.length) { - index = 0; - } else if (index === -1) { - index = filterTypes.length - 1; + if (selectedTrack?.language) { + this.setState({ + textTracks: data.textTracks, + selectedTextTrack: + this.textTracksSelectionBy === 'index' + ? { + type: 'index', + value: selectedTrack?.index, + } + : { + type: 'language', + value: selectedTrack?.language, + }, + }); + } else { + this.setState({ + textTracks: data.textTracks, + }); } + }; + onTextTrackDataChanged = (data: OnTextTrackDataChangedData) => { + console.log(`Subtitles: ${JSON.stringify(data, null, 2)}`); + }; + + onAspectRatio = (data: OnVideoAspectRatioData) => { + console.log('onAspectRadio called ' + JSON.stringify(data)); this.setState({ - filter: filterTypes[index], + videoWidth: data.width, + videoHeight: data.height, }); + }; + + onVideoBuffer = (param: OnBufferData) => { + console.log('onVideoBuffer'); + this.setState({isLoading: param.isBuffering}); + }; + + onReadyForDisplay = () => { + console.log('onReadyForDisplay'); + this.setState({isLoading: false}); + }; + + onAudioBecomingNoisy = () => { + this.setState({paused: true}); + }; + + onAudioFocusChanged = (event: OnAudioFocusChangedData) => { + this.setState({paused: !event.hasAudioFocus}); + }; + + toast = (visible: boolean, message: string) => { + if (visible) { + if (Platform.OS === 'android') { + ToastAndroid.showWithGravityAndOffset( + message, + ToastAndroid.LONG, + ToastAndroid.BOTTOM, + 25, + 50, + ); + } else { + Alert.alert(message, message); + } + } + }; + + onError = (err: OnVideoErrorData) => { + console.log(JSON.stringify(err)); + this.toast(true, 'error: ' + JSON.stringify(err)); + }; + + onEnd = () => { + if (!this.state.loop) { + this.channelUp(); + } + }; + + onPlaybackRateChange = (data: OnPlaybackRateChangeData) => { + console.log('onPlaybackRateChange', data); + }; + + onPlaybackStateChanged = (data: OnPlaybackStateChangedData) => { + console.log('onPlaybackStateChanged', data); + }; + + toggleFullscreen() { + this.setState({fullscreen: !this.state.fullscreen}); + } + toggleControls() { + this.setState({showRNVControls: !this.state.showRNVControls}); } - renderSkinControl(skin: 'custom' | 'native' | 'embed') { - const isSelected = this.state.skin == skin; - const selectControls = skin == 'native' || skin == 'embed'; - return ( - { - this.setState({ - controls: selectControls, - skin: skin, - }); - }}> - - {skin} - - - ); + toggleDecoration() { + this.setState({decoration: !this.state.decoration}); + this.video?.setFullScreen(!this.state.decoration); } - renderRateControl(rate: number) { - const isSelected = this.state.rate == rate; + toggleShowNotificationControls() { + this.setState({ + showNotificationControls: !this.state.showNotificationControls, + }); + } - return ( - { - this.setState({rate: rate}); - }}> - - {rate}x - - - ); + goToChannel(channel: number) { + this.setState({ + srcListId: channel, + duration: 0.0, + currentTime: 0.0, + videoWidth: 0, + videoHeight: 0, + isLoading: false, + audioTracks: [], + textTracks: [], + selectedAudioTrack: undefined, + selectedTextTrack: undefined, + selectedVideoTrack: { + type: SelectedVideoTrackType.AUTO, + }, + }); } - renderResizeModeControl(resizeMode: ResizeMode) { - const isSelected = this.state.resizeMode == resizeMode; + channelUp() { + console.log('channel up'); + this.goToChannel((this.state.srcListId + 1) % this.srcList.length); + } - return ( - { - this.setState({resizeMode: resizeMode}); - }}> - - {resizeMode} - - + channelDown() { + console.log('channel down'); + this.goToChannel( + (this.state.srcListId + this.srcList.length - 1) % this.srcList.length, ); } - renderVolumeControl(volume: number) { - const isSelected = this.state.volume == volume; + videoSeek(position: number) { + this.setState({isSeeking: true}); + this.video?.seek(position); + } + renderSeekBar() { return ( - { - this.setState({volume: volume}); - }}> - - {volume * 100}% - - + this.videoSeek(prop)} + isUISeeking={this.state.isSeeking} + /> ); } - renderIgnoreSilentSwitchControl(ignoreSilentSwitch: IgnoreSilentSwitchType) { - const isSelected = this.state.ignoreSilentSwitch == ignoreSilentSwitch; + IndicatorLoadingView() { + if (this.state.isLoading) { + return ( + + ); + } else { + return ; + } + } + renderTopControl() { return ( - { - this.setState({ignoreSilentSwitch: ignoreSilentSwitch}); - }}> - - {ignoreSilentSwitch} + + + {(this.srcList[this.state.srcListId] as AdditionnalSourceInfo) + ?.description || 'local file'} - + + { + this.toggleControls(); + }}> + + {this.state.showRNVControls ? 'Hide controls' : 'Show controls'} + + + + ); } - renderMixWithOthersControl(mixWithOthers: MixWithOthersType) { - const isSelected = this.state.mixWithOthers == mixWithOthers; + onRateSelected = (value: MultiValueControlPropType) => { + this.setState({rate: value}); + }; + onVolumeSelected = (value: MultiValueControlPropType) => { + this.setState({volume: value}); + }; + onResizeModeSelected = (value: MultiValueControlPropType) => { + this.setState({resizeMode: value}); + }; - return ( - { - this.setState({mixWithOthers: mixWithOthers}); - }}> - - {mixWithOthers} - - - ); - } + onSelectedAudioTrackChange = (itemValue: string) => { + console.log('on audio value change ' + itemValue); + if (itemValue === 'none') { + this.setState({ + selectedAudioTrack: SelectedVideoTrackType.DISABLED, + }); + } else { + this.setState({ + selectedAudioTrack: { + type: SelectedVideoTrackType.INDEX, + value: itemValue, + }, + }); + } + }; + + onSelectedTextTrackChange = (itemValue: string) => { + console.log('on value change ' + itemValue); + this.setState({ + selectedTextTrack: { + type: this.textTracksSelectionBy === 'index' ? 'index' : 'language', + value: itemValue, + }, + }); + }; - renderCustomSkin() { - const flexCompleted = this.getCurrentTimePercentage() * 100; - const flexRemaining = (1 - this.getCurrentTimePercentage()) * 100; + onSelectedVideoTrackChange = (itemValue: string) => { + console.log('on value change ' + itemValue); + if (itemValue === undefined || itemValue === 'auto') { + this.setState({ + selectedVideoTrack: { + type: SelectedVideoTrackType.AUTO, + }, + }); + } else { + this.setState({ + selectedVideoTrack: { + type: SelectedVideoTrackType.INDEX, + value: itemValue, + }, + }); + } + }; + renderOverlay() { return ( - - { - this.setState({paused: !this.state.paused}); - }}> - - - - - - {this.renderSkinControl('custom')} - {this.renderSkinControl('native')} - {this.renderSkinControl('embed')} + <> + {this.IndicatorLoadingView()} + + + {this.renderTopControl()} + + + {!this.state.showRNVControls ? ( + <> + + { + this.channelDown(); + }} + text="ChDown" + /> + + + { + this.channelUp(); + }} + text="ChUp" + /> - {this.state.filterEnabled ? ( - - + + {Platform.OS === 'android' ? ( + + { + this.popupInfo(); + }} + text="decoderInfo" + /> + { + this.setState({useCache: !this.state.useCache}); + }} + selectedText="enable cache" + unselectedText="disable cache" + /> + + ) : null} + { - this.setFilter(-1); - }}> - Previous Filter - - + { + this.setState({loop: !this.state.loop}); + }} + selectedText="loop enable" + unselectedText="loop disable" + /> + { - this.setFilter(1); - }}> - Next Filter - + this.toggleFullscreen(); + }} + text="fullscreen" + /> + { + this.toggleDecoration(); + }} + text="decoration" + /> + { + this.setState({ + poster: this.state.poster ? undefined : this.samplePoster, + }); + }} + selectedText="poster" + unselectedText="no poster" + /> + { + this.toggleShowNotificationControls(); + }} + selectedText="hide notification controls" + unselectedText="show notification controls" + /> - ) : null} - - - - {this.renderRateControl(0.5)} - {this.renderRateControl(1.0)} - {this.renderRateControl(2.0)} - - - - {this.renderVolumeControl(0.5)} - {this.renderVolumeControl(1)} - {this.renderVolumeControl(1.5)} - - - - {this.renderResizeModeControl(ResizeMode.COVER)} - {this.renderResizeModeControl(ResizeMode.CONTAIN)} - {this.renderResizeModeControl(ResizeMode.STRETCH)} - - - - {Platform.OS === 'ios' ? ( - <> - - {this.renderIgnoreSilentSwitchControl(IgnoreSilentSwitchType.IGNORE)} - {this.renderIgnoreSilentSwitchControl(IgnoreSilentSwitchType.OBEY)} - - - {this.renderMixWithOthersControl(MixWithOthersType.MIX)} - {this.renderMixWithOthersControl(MixWithOthersType.DUCK)} - - - ) : null} - - - - - + {/* shall be replaced by slider */} + + {/* shall be replaced by slider */} + - + { + this.setState({muted: !this.state.muted}); + }} + text="muted" + /> + {Platform.OS === 'ios' ? ( + { + this.video + ?.save({}) + ?.then(response => { + console.log('Downloaded URI', response); + }) + .catch(error => { + console.log('error during save ', error); + }); + }} + text="save" + /> + ) : null} + + {this.renderSeekBar()} + + + + - - - + + ) : null} + ); } - renderNativeSkin() { - const videoStyle = - this.state.skin == 'embed' - ? styles.nativeVideoControls - : styles.fullScreen; - return ( - - - - - - - {this.renderSkinControl('custom')} - {this.renderSkinControl('native')} - {this.renderSkinControl('embed')} - - {this.state.filterEnabled ? ( - - { - this.setFilter(-1); - }}> - Previous Filter - - { - this.setFilter(1); - }}> - Next Filter - - - ) : null} - - - - {this.renderRateControl(0.5)} - {this.renderRateControl(1.0)} - {this.renderRateControl(2.0)} - + renderVideoView() { + const viewStyle = this.state.fullscreen + ? styles.fullScreen + : styles.halfScreen; - - {this.renderVolumeControl(0.5)} - {this.renderVolumeControl(1)} - {this.renderVolumeControl(1.5)} - + const currentSrc = this.srcList[this.state.srcListId]; + const additionnal = currentSrc as AdditionnalSourceInfo; - - {this.renderResizeModeControl(ResizeMode.COVER)} - {this.renderResizeModeControl(ResizeMode.CONTAIN)} - {this.renderResizeModeControl(ResizeMode.STRETCH)} - - - - {Platform.OS === 'ios' ? ( - <> - - {this.renderIgnoreSilentSwitchControl(IgnoreSilentSwitchType.IGNORE)} - {this.renderIgnoreSilentSwitchControl(IgnoreSilentSwitchType.OBEY)} - - - {this.renderMixWithOthersControl(MixWithOthersType.MIX)} - {this.renderMixWithOthersControl(MixWithOthersType.DUCK)} - - - ) : null} - - - + return ( + + ); } render() { - return this.state.controls - ? this.renderNativeSkin() - : this.renderCustomSkin(); + return ( + + {(this.srcList[this.state.srcListId] as AdditionnalSourceInfo)?.noView + ? null + : this.renderVideoView()} + {this.renderOverlay()} + + ); } } - -const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - backgroundColor: 'black', - }, - fullScreen: { - position: 'absolute', - top: 0, - left: 0, - bottom: 0, - right: 0, - }, - controls: { - backgroundColor: 'transparent', - borderRadius: 5, - position: 'absolute', - bottom: 44, - left: 4, - right: 4, - }, - progress: { - flex: 1, - flexDirection: 'row', - borderRadius: 3, - overflow: 'hidden', - }, - innerProgressCompleted: { - height: 20, - backgroundColor: '#cccccc', - }, - innerProgressRemaining: { - height: 20, - backgroundColor: '#2C2C2C', - }, - generalControls: { - flex: 1, - flexDirection: 'row', - overflow: 'hidden', - paddingBottom: 10, - }, - skinControl: { - flex: 1, - flexDirection: 'row', - justifyContent: 'center', - }, - rateControl: { - flex: 1, - flexDirection: 'row', - justifyContent: 'center', - }, - volumeControl: { - flex: 1, - flexDirection: 'row', - justifyContent: 'center', - }, - resizeModeControl: { - flex: 1, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - }, - ignoreSilentSwitchControl: { - flex: 1, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - }, - mixWithOthersControl: { - flex: 1, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - }, - controlOption: { - alignSelf: 'center', - fontSize: 11, - color: 'white', - paddingLeft: 2, - paddingRight: 2, - lineHeight: 12, - }, - nativeVideoControls: { - top: 184, - height: 300, - }, - trackingControls: { - flex: 1, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - }, -}); export default VideoPlayer; diff --git a/examples/FabricExample/src/components/AudioTracksSelector.tsx b/examples/FabricExample/src/components/AudioTracksSelector.tsx new file mode 100644 index 0000000000..41c5e748c6 --- /dev/null +++ b/examples/FabricExample/src/components/AudioTracksSelector.tsx @@ -0,0 +1,53 @@ +import {Picker} from '@react-native-picker/picker'; +import {Text} from 'react-native'; +import {AudioTrack, SelectedTrack} from 'react-native-video'; +import styles from '../styles'; +import React from 'react'; + +export interface AudioTrackSelectorType { + audioTracks: Array; + selectedAudioTrack: SelectedTrack | undefined; + onValueChange: (arg0: string) => void; +} + +const AudioTrackSelector = ({ + audioTracks, + selectedAudioTrack, + onValueChange, +}: AudioTrackSelectorType) => { + return ( + <> + AudioTrack + { + if (itemValue !== 'empty') { + console.log('on audio value change ' + itemValue); + onValueChange(`${itemValue}`); + } + }}> + {audioTracks?.length <= 0 ? ( + + ) : ( + + )} + {audioTracks.map(track => { + if (!track) { + return; + } + return ( + + ); + })} + + + ); +}; + +export default AudioTrackSelector; diff --git a/examples/FabricExample/src/components/Seeker.tsx b/examples/FabricExample/src/components/Seeker.tsx new file mode 100644 index 0000000000..a74122b0c8 --- /dev/null +++ b/examples/FabricExample/src/components/Seeker.tsx @@ -0,0 +1,154 @@ +import React, {useCallback, useEffect, useState} from 'react'; +import {PanResponder, View} from 'react-native'; +import styles from '../styles'; + +interface SeekerProps { + currentTime: number; + duration: number; + isLoading: boolean; + isUISeeking: boolean; + videoSeek: (arg0: number) => void; +} + +const Seeker = ({ + currentTime, + duration, + isLoading, + isUISeeking, + videoSeek, +}: SeekerProps) => { + const [seeking, setSeeking] = useState(false); + const [seekerPosition, setSeekerPosition] = useState(0); + const [seekerWidth, setSeekerWidth] = useState(0); + + /** + * Set the position of the seekbar's components + * (both fill and handle) according to the + * position supplied. + * + * @param {float} position position in px of seeker handle} + */ + const updateSeekerPosition = useCallback( + (position = 0) => { + if (position <= 0) { + position = 0; + } else if (position >= seekerWidth) { + position = seekerWidth; + } + setSeekerPosition(position); + }, + [seekerWidth], + ); + + /** + * Return the time that the video should be at + * based on where the seeker handle is. + * + * @return {float} time in ms based on seekerPosition. + */ + const calculateTimeFromSeekerPosition = () => { + const percent = seekerPosition / seekerWidth; + return duration * percent; + }; + + /** + * Get our seekbar responder going + */ + + const seekPanResponder = PanResponder.create({ + // Ask to be the responder. + onStartShouldSetPanResponder: (_evt, _gestureState) => true, + onMoveShouldSetPanResponder: (_evt, _gestureState) => true, + + /** + * When we start the pan tell the machine that we're + * seeking. This stops it from updating the seekbar + * position in the onProgress listener. + */ + onPanResponderGrant: (evt, _gestureState) => { + const position = evt.nativeEvent.locationX; + updateSeekerPosition(position); + setSeeking(true); + }, + + /** + * When panning, update the seekbar position, duh. + */ + onPanResponderMove: (evt, _gestureState) => { + const position = evt.nativeEvent.locationX; + updateSeekerPosition(position); + }, + + /** + * On release we update the time and seek to it in the video. + * If you seek to the end of the video we fire the + * onEnd callback + */ + onPanResponderRelease: (_evt, _gestureState) => { + const time = calculateTimeFromSeekerPosition(); + if (time >= duration && !isLoading) { + // FIXME ... + // state.paused = true; + // this.onEnd(); + } else { + videoSeek(time); + setSeeking(false); + } + }, + }); + + useEffect(() => { + if (!isLoading && !seeking && !isUISeeking) { + const percent = currentTime / duration; + const position = seekerWidth * percent; + updateSeekerPosition(position); + } + }, [ + currentTime, + duration, + isLoading, + seekerWidth, + seeking, + isUISeeking, + updateSeekerPosition, + ]); + + if (!seekPanResponder) { + return null; + } + const seekerStyle = [ + styles.seekbarFill, + { + width: seekerPosition > 0 ? seekerPosition : 0, + backgroundColor: '#FFF', + }, + ]; + + const seekerPositionStyle = [ + styles.seekbarHandle, + { + left: seekerPosition > 0 ? seekerPosition : 0, + }, + ]; + + const seekerPointerStyle = [styles.seekbarCircle, {backgroundColor: '#FFF'}]; + + return ( + + setSeekerWidth(event.nativeEvent.layout.width)} + pointerEvents={'none'}> + + + + + + + ); +}; + +export default Seeker; diff --git a/examples/FabricExample/src/components/TextTracksSelector.tsx b/examples/FabricExample/src/components/TextTracksSelector.tsx new file mode 100644 index 0000000000..84faac3dad --- /dev/null +++ b/examples/FabricExample/src/components/TextTracksSelector.tsx @@ -0,0 +1,64 @@ +import {Picker} from '@react-native-picker/picker'; +import {Text} from 'react-native'; +import {TextTrack, SelectedTrack} from 'react-native-video'; +import styles from '../styles'; +import React from 'react'; + +export interface TextTrackSelectorType { + textTracks: Array; + selectedTextTrack: SelectedTrack | undefined; + onValueChange: (arg0: string) => void; + textTracksSelectionBy: string; +} + +const TextTrackSelector = ({ + textTracks, + selectedTextTrack, + onValueChange, + textTracksSelectionBy, +}: TextTrackSelectorType) => { + return ( + <> + TextTrack + { + if (itemValue !== 'empty') { + onValueChange(itemValue); + } + }}> + {textTracks?.length <= 0 ? ( + + ) : ( + + )} + {textTracks.map(track => { + if (!track) { + return; + } + if (textTracksSelectionBy === 'index') { + return ( + + ); + } else { + return ( + + ); + } + })} + + + ); +}; + +export default TextTrackSelector; diff --git a/examples/FabricExample/src/components/VideoTracksSelector.tsx b/examples/FabricExample/src/components/VideoTracksSelector.tsx new file mode 100644 index 0000000000..568953c86d --- /dev/null +++ b/examples/FabricExample/src/components/VideoTracksSelector.tsx @@ -0,0 +1,64 @@ +import {Picker} from '@react-native-picker/picker'; +import {Text} from 'react-native'; +import { + SelectedVideoTrack, + SelectedVideoTrackType, + VideoTrack, +} from 'react-native-video'; +import styles from '../styles'; +import React from 'react'; + +export interface VideoTrackSelectorType { + videoTracks: Array; + selectedVideoTrack: SelectedVideoTrack | undefined; + onValueChange: (arg0: string) => void; +} + +const VideoTrackSelector = ({ + videoTracks, + selectedVideoTrack, + onValueChange, +}: VideoTrackSelectorType) => { + return ( + <> + VideoTrack + { + if (itemValue !== 'empty') { + onValueChange(itemValue); + } + }}> + + {videoTracks?.length <= 0 || videoTracks?.length <= 0 ? ( + + ) : ( + + )} + {videoTracks?.map(track => { + if (!track) { + return; + } + return ( + + ); + })} + + + ); +}; + +export default VideoTrackSelector; diff --git a/examples/FabricExample/src/portrait.mp4 b/examples/FabricExample/src/portrait.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0e4414c6f8b065094db4a1794df81c2fbe09c348 GIT binary patch literal 9812941 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 RaTPXaauS(Mb(7IoJRA-r+ApCeCrhf{Lhpi4 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