From 76e470dd646203723eecbda10a0cd2c6cdc7c158 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Thu, 20 Nov 2025 13:45:19 +0200 Subject: [PATCH 01/36] initial commit --- ReactNativeNavigation.podspec | 8 +- .../__helpers__/generate_version_header.js | 87 +++++++++++++++++++ .../__helpers__/reactNativeVersion.js | 76 ++++++++++++++++ autolink/postlink/appDelegateLinker.js | 78 ++++++++++++++++- autolink/postlink/path.js | 2 - 5 files changed, 244 insertions(+), 7 deletions(-) create mode 100644 autolink/postlink/__helpers__/generate_version_header.js create mode 100644 autolink/postlink/__helpers__/reactNativeVersion.js diff --git a/ReactNativeNavigation.podspec b/ReactNativeNavigation.podspec index cbd33bf876..59fbd0b47b 100644 --- a/ReactNativeNavigation.podspec +++ b/ReactNativeNavigation.podspec @@ -6,7 +6,7 @@ package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1' # Detect if this is a Swift project by looking for user AppDelegate.swift files -start_dir = File.expand_path('../', __dir__) +start_dir = File.expand_path('../../', __dir__) swift_delegate_path = nil Find.find(start_dir) do |path| if path =~ /AppDelegate\.swift$/ @@ -26,6 +26,7 @@ end Pod::Spec.new do |s| s.name = "ReactNativeNavigation" + s.prepare_command = 'node autolink/postlink/__helpers__/generate_version_header.js' s.version = package['version'] s.summary = package['description'] @@ -40,11 +41,12 @@ Pod::Spec.new do |s| s.subspec 'Core' do |ss| s.source = { :git => "https://github.com/wix/react-native-navigation.git", :tag => "#{s.version}" } s.source_files = 'ios/**/*.{h,m,mm,cpp}' - s.exclude_files = "ios/ReactNativeNavigationTests/**/*.*", "lib/ios/OCMock/**/*.*" + s.exclude_files = "ios/ReactNativeNavigationTests/**/*.*", "ios/OCMock/**/*.*" # Only expose headers for Swift projects if swift_project s.public_header_files = [ - 'ios/RNNAppDelegate.h' + 'ios/RNNAppDelegate.h', + 'ios/ReactNativeVersionExtracted.h' ] end end diff --git a/autolink/postlink/__helpers__/generate_version_header.js b/autolink/postlink/__helpers__/generate_version_header.js new file mode 100644 index 0000000000..11e02a3022 --- /dev/null +++ b/autolink/postlink/__helpers__/generate_version_header.js @@ -0,0 +1,87 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); +const { getReactNativeVersion, findProjectPackageJson } = require('./reactNativeVersion'); + +function generateVersionHeader() { + const startDir = __dirname; + + console.log(`Searching for project package.json from: ${startDir}`); + + const packageJsonPath = findProjectPackageJson(); + + if (!packageJsonPath) { + console.log('Warning: Project package.json not found'); + return; + } + + console.log(`Using package.json: ${packageJsonPath}`); + + const versionInfo = getReactNativeVersion(); + + if (!versionInfo) { + console.log('Warning: react-native not found in package.json'); + return; + } + + console.log(`Found React Native version: ${versionInfo.raw}`); + + const { major, minor, patch } = versionInfo; + + // Generate header content + const headerContent = `// + // ReactNativeVersionExtracted.h + // React Native version: ${versionInfo.raw} + // Generated on: ${new Date().toISOString()} + // Source: ${packageJsonPath} + // + + #ifndef ReactNativeVersionExtracted_h + #define ReactNativeVersionExtracted_h + + static const int REACT_NATIVE_VERSION_MAJOR = ${major}; + static const int REACT_NATIVE_VERSION_MINOR = ${minor}; + static const int REACT_NATIVE_VERSION_PATCH = ${patch}; + + #define RN_VERSION_MAJOR ${major} + #define RN_VERSION_MINOR ${minor} + #define RN_VERSION_PATCH ${patch} + + #endif + `; + + // Find RNN root by looking upwards from script location for RNN's package.json + let currentDir = __dirname; + let rnnPackageJson = null; + + for (let i = 0; i < 5; i++) { + const potential = path.join(currentDir, 'package.json'); + if (fs.existsSync(potential)) { + const pkg = JSON.parse(fs.readFileSync(potential, 'utf8')); + // This is RNN's package.json if name matches + if (pkg.name === 'react-native-navigation') { + rnnPackageJson = currentDir; + break; + } + } + currentDir = path.resolve(currentDir, '..'); + } + + if (!rnnPackageJson) { + console.log('Warning: Could not find react-native-navigation root'); + return; + } + + const outputFile = path.join(rnnPackageJson, 'ios/ReactNativeVersionExtracted.h'); + + fs.writeFileSync(outputFile, headerContent, 'utf8'); + console.log(`✅ Generated ${outputFile}`); + console.log(` Version: ${major}.${minor}.${patch}`); +} + +// Run if called directly +if (require.main === module) { + generateVersionHeader(); +} + +module.exports = { generateVersionHeader }; \ No newline at end of file diff --git a/autolink/postlink/__helpers__/reactNativeVersion.js b/autolink/postlink/__helpers__/reactNativeVersion.js new file mode 100644 index 0000000000..19f1d81f85 --- /dev/null +++ b/autolink/postlink/__helpers__/reactNativeVersion.js @@ -0,0 +1,76 @@ +// @ts-check +var fs = require('fs'); +var nodePath = require('path'); +var { warnn } = require('../log'); + +/** + * Find the project root package.json + * @returns {string|null} Path to project's package.json or null if not found + */ +function findProjectPackageJson() { + var searchDirs = [process.cwd(), __dirname]; + + for (var j = 0; j < searchDirs.length; j++) { + var searchDir = searchDirs[j]; + for (var i = 0; i < 10; i++) { + var packagePath = nodePath.join(searchDir, 'package.json'); + if (fs.existsSync(packagePath)) { + try { + var pkg = JSON.parse(fs.readFileSync(packagePath, 'utf8')); + if ((pkg.dependencies && pkg.dependencies['react-native']) || + (pkg.devDependencies && pkg.devDependencies['react-native'])) { + return packagePath; + } + } catch (e) { } + } + var parent = nodePath.dirname(searchDir); + if (parent === searchDir) break; + searchDir = parent; + } + } + + return null; +} + +/** + * Get React Native version as parsed object + * @returns {Object|null} { major, minor, patch, raw } or null + */ +function getReactNativeVersion() { + var projectPackageJsonPath = findProjectPackageJson(); + if (!projectPackageJsonPath) { + warnn('Could not find package.json to detect React Native version'); + return null; + } + + try { + var packageJson = JSON.parse(fs.readFileSync(projectPackageJsonPath, 'utf8')); + var rnVersion = packageJson.dependencies && packageJson.dependencies['react-native'] || + packageJson.devDependencies && packageJson.devDependencies['react-native']; + + if (!rnVersion) { + warnn('React Native not found in package.json'); + return null; + } + + // Parse version (remove ^, ~, >=, etc.) + var cleanVersion = rnVersion.replace(/^[\^~>=<]+/, ''); + var parts = cleanVersion.split('.'); + + return { + major: parseInt(parts[0]) || 0, + minor: parseInt(parts[1]) || 0, + patch: parseInt(parts[2]) || 0, + raw: rnVersion + }; + } catch (e) { + warnn('Error detecting React Native version: ' + e.message); + return null; + } +} + +module.exports = { + findProjectPackageJson: findProjectPackageJson, + getReactNativeVersion: getReactNativeVersion +}; + diff --git a/autolink/postlink/appDelegateLinker.js b/autolink/postlink/appDelegateLinker.js index 35ff99e10c..856d866c98 100644 --- a/autolink/postlink/appDelegateLinker.js +++ b/autolink/postlink/appDelegateLinker.js @@ -10,6 +10,9 @@ class AppDelegateLinker { this.appDelegateHeaderPath = path.appDelegateHeader; this.removeUnneededImportsSuccess = false; this.removeApplicationLaunchContentSuccess = false; + const rnVersion = this._getReactNativeVersion(); + infon('Found React Native version: ' + (rnVersion ? rnVersion.raw : 'unknown')); + this.isRN79orHigher = rnVersion && (rnVersion.major > 0 || rnVersion.minor >= 79); } link() { @@ -20,7 +23,7 @@ class AppDelegateLinker { return; } - logn('Linking AppDelegate...'); + logn('Linking AppDelegate: ' + this.appDelegatePath); // New flow for Swift if (nodePath.extname(this.appDelegatePath) === '.swift') { @@ -194,16 +197,87 @@ class AppDelegateLinker { // SWIFT implementation _extendRNNAppDelegateSwift(content) { - return content + let newContent = content; + + newContent = newContent .replace( /import React_RCTAppDelegate/, 'import ReactNativeNavigation' ) + + // add this ONLY for < RN079 + if (!this.isRN79orHigher) { + newContent = this._updateRNNAppDelegateSwift_77_78(newContent); + } else { + newContent = this._updateRNNAppDelegateSwift_79(newContent); + } + + return newContent; + } + + _updateRNNAppDelegateSwift_77_78(content) { + return content .replace( /class AppDelegate: RCTAppDelegate/, 'class AppDelegate: RNNAppDelegate' ) } + _updateRNNAppDelegateSwift_79(content) { + let newContent = content; + newContent = newContent + .replace( + 'class AppDelegate: UIResponder, UIApplicationDelegate', + 'class AppDelegate: RNNAppDelegate' + ) + + newContent = newContent + .replace(/^\s*var window: UIWindow\?\s*$/gm, '') + .replace(/^\s*var reactNativeDelegate: ReactNativeDelegate\?\s*$/gm, '') + .replace(/^\s*var reactNativeFactory: RCTReactNativeFactory\?\s*$/gm, '') + + newContent = newContent + .replace( + /func application/, + 'override func application' + ) + + newContent = newContent + .replace( + /let delegate = ReactNativeDelegate\(\)/, + 'self.reactNativeDelegate = ReactNativeDelegate\(\)' + ) + + newContent = newContent + .replace( + /let factory = RCTReactNativeFactory\(delegate: delegate\)/, + 'super.application\(application, didFinishLaunchingWithOptions: launchOptions\)' + ) + + newContent = newContent + .replace(/^\s*delegate.dependencyProvider = RCTAppDependencyProvider\(\)\s*$/gm, '') + newContent = newContent + .replace(/^\s*reactNativeDelegate = delegate\s*$/gm, '') + newContent = newContent + .replace(/^\s*reactNativeFactory = factory\s*$/gm, '') + newContent = newContent + .replace(/^\s*window = UIWindow\(frame: UIScreen.main.bounds\)\s*$/gm, '') + newContent = newContent + .replace( + /factory\.startReactNative\([\s\S]*?withModuleName:\s*".*?"[\s\S]*?\)/g, + '' + ) + + return newContent; + } + + /** + * Get React Native version from package.json + * @returns {Object} { major, minor, patch } or null + */ + _getReactNativeVersion() { + const { getReactNativeVersion } = require('./__helpers__/reactNativeVersion'); + return getReactNativeVersion(); + } } module.exports = AppDelegateLinker; diff --git a/autolink/postlink/path.js b/autolink/postlink/path.js index c3fb62d4eb..6d7e79ef54 100644 --- a/autolink/postlink/path.js +++ b/autolink/postlink/path.js @@ -9,8 +9,6 @@ var mainApplicationKotlin = glob.sync('**/MainApplication.kt', ignoreFolders)[0] exports.mainApplicationKotlin = mainApplicationKotlin; exports.rootGradle = mainApplicationKotlin.replace(/android\/app\/.*\.kt/, 'android/build.gradle'); -var reactNativeVersion = require('../../../react-native/package.json').version; -infon('Found React Native version: ' + reactNativeVersion); infon('Locating the AppDelegate.mm file ...'); exports.appDelegate = glob.sync( '**/AppDelegate.mm', From f2d3c0c75cf34a3ad76d65ab26f2ede55d10abf0 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Thu, 20 Nov 2025 13:58:25 +0200 Subject: [PATCH 02/36] AppDelegate updates --- ios/RNNAppDelegate.h | 34 +++++- ios/RNNAppDelegate.mm | 137 ++++++++++++----------- playground/ios/playground/AppDelegate.mm | 67 +++++++---- 3 files changed, 146 insertions(+), 92 deletions(-) diff --git a/ios/RNNAppDelegate.h b/ios/RNNAppDelegate.h index 91ab6ff2b8..9ec3c3a1c5 100644 --- a/ios/RNNAppDelegate.h +++ b/ios/RNNAppDelegate.h @@ -1,13 +1,45 @@ #import #import +#import +#if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 #if __has_include() #import #elif __has_include() -// for importing the header from framework, the dash will be transformed to underscore #import #endif +#import +#else +#if __has_include() +#import +#elif __has_include() +#import +#endif +#endif + +#if __has_include() +#import +#endif + +#if __has_include() +#import +#elif __has_include() +#import +#endif + +#import + +#if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 @interface RNNAppDelegate : RCTAppDelegate +#else +@interface RNNAppDelegate : UIResponder +@property(nonatomic, strong) UIWindow *window; + +@property(nonatomic, strong) RCTDefaultReactNativeFactoryDelegate *reactNativeDelegate; + +@property(nonatomic, strong) RCTReactNativeFactory *reactNativeFactory; +@property(nonatomic) BOOL bridgelessEnabled; +#endif @end diff --git a/ios/RNNAppDelegate.mm b/ios/RNNAppDelegate.mm index 3bd9f71f21..9f54052b72 100644 --- a/ios/RNNAppDelegate.mm +++ b/ios/RNNAppDelegate.mm @@ -1,10 +1,8 @@ - #import "RNNAppDelegate.h" #import #import #import - #import "RCTAppSetupUtils.h" #import #import @@ -14,17 +12,7 @@ #import #import - - -#if __has_include() -#import -#import -#elif __has_include() -#import -#import -#else -// RN 0.77 support -#define RN077 +#if __has_include() #import #endif @@ -39,100 +27,113 @@ #import + static NSString *const kRNConcurrentRoot = @"concurrentRoot"; +#if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 @interface RNNAppDelegate () { +RCTComponentViewFactoryComponentProvider> { } @end +#else +@interface RNNAppDelegate () { +} +@end +#endif @implementation RNNAppDelegate - (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - -#ifdef RN077 +didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + +#if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 [self _setUpFeatureFlags]; - self.rootViewFactory = [self createRCTRootViewFactory]; + self.reactNativeFactory.rootViewFactory = [self createRCTRootViewFactory]; [RCTComponentViewFactory currentComponentViewFactory].thirdPartyFabricComponentsProvider = self; RCTAppSetupPrepareApp(application, self.newArchEnabled); RCTSetNewArchEnabled(TRUE); -#else - self.reactNativeFactory = [RCTReactNativeFactory new]; - self.reactNativeFactory = [self.reactNativeFactory initWithDelegate:self]; -#endif RCTEnableTurboModuleInterop(YES); RCTEnableTurboModuleInteropBridgeProxy(YES); - + self.rootViewFactory.reactHost = [self.rootViewFactory createReactHost:launchOptions]; - + [ReactNativeNavigation bootstrapWithHost:self.rootViewFactory.reactHost]; - +#else + self.reactNativeFactory = [[RCTReactNativeFactory alloc] initWithDelegate:self.reactNativeDelegate]; + self.reactNativeDelegate.dependencyProvider = [RCTAppDependencyProvider new]; + + RCTAppSetupPrepareApp(application, YES); + RCTEnableTurboModuleInteropBridgeProxy(YES); + + self.reactNativeFactory.rootViewFactory.reactHost = [self.reactNativeFactory.rootViewFactory createReactHost:launchOptions]; + + [ReactNativeNavigation bootstrapWithHost:self.reactNativeFactory.rootViewFactory.reactHost]; +#endif + return YES; } + +#if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { - [NSException raise:@"RCTBridgeDelegate::sourceURLForBridge not implemented" - format:@"Subclasses must implement a valid sourceURLForBridge method"]; - return nil; + [NSException raise:@"RCTBridgeDelegate::sourceURLForBridge not implemented" + format:@"Subclasses must implement a valid sourceURLForBridge method"]; + return nil; } - (BOOL)concurrentRootEnabled { - return true; + return true; } - - -#ifdef RN077 - (RCTRootViewFactory *)createRCTRootViewFactory { - __weak __typeof(self) weakSelf = self; - RCTBundleURLBlock bundleUrlBlock = ^{ - RCTAppDelegate *strongSelf = weakSelf; - return strongSelf.bundleURL; - }; - - RCTRootViewFactoryConfiguration *configuration = - [[RCTRootViewFactoryConfiguration alloc] initWithBundleURLBlock:bundleUrlBlock - newArchEnabled:self.newArchEnabled]; - - - return [[RCTRootViewFactory alloc] initWithConfiguration:configuration andTurboModuleManagerDelegate:self]; + __weak __typeof(self) weakSelf = self; + RCTBundleURLBlock bundleUrlBlock = ^{ + RCTAppDelegate *strongSelf = weakSelf; + return strongSelf.bundleURL; + }; + + RCTRootViewFactoryConfiguration *configuration = + [[RCTRootViewFactoryConfiguration alloc] initWithBundleURLBlock:bundleUrlBlock + newArchEnabled:self.newArchEnabled]; + + + return [[RCTRootViewFactory alloc] initWithConfiguration:configuration andTurboModuleManagerDelegate:self]; } - #pragma mark - Feature Flags class RCTAppDelegateBridgelessFeatureFlags : public facebook::react::ReactNativeFeatureFlagsDefaults { - public: - bool enableBridgelessArchitecture() override - { - return true; - } - bool enableFabricRenderer() override - { - return true; - } - bool useTurboModules() override - { - return true; - } - bool useNativeViewConfigsInBridgelessMode() override - { - return true; - } - bool enableFixForViewCommandRace() override - { - return true; - } +public: + bool enableBridgelessArchitecture() override + { + return true; + } + bool enableFabricRenderer() override + { + return true; + } + bool useTurboModules() override + { + return true; + } + bool useNativeViewConfigsInBridgelessMode() override + { + return true; + } + + + bool enableFixForViewCommandRace() override + { + return true; + } }; - (void)_setUpFeatureFlags { facebook::react::ReactNativeFeatureFlags::override( - std::make_unique()); + std::make_unique()); } #endif @end - diff --git a/playground/ios/playground/AppDelegate.mm b/playground/ios/playground/AppDelegate.mm index 1b68e1e2a8..6c729d4259 100644 --- a/playground/ios/playground/AppDelegate.mm +++ b/playground/ios/playground/AppDelegate.mm @@ -1,54 +1,75 @@ #import "AppDelegate.h" #import "RNNCustomViewController.h" -#import -#import #import +#if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 @interface AppDelegate () @end +#else +@interface AppDelegate () +@end + +@interface ReactNativeDelegate : RCTDefaultReactNativeFactoryDelegate +@end + +@implementation ReactNativeDelegate +- (NSURL *)bundleURL +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +- (BOOL)newArchEnabled +{ + return YES; +} + +@end +#endif + @implementation AppDelegate - (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { +didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { +#if RN_VERSION_MAJOR == 0 && (RN_VERSION_MINOR >= 79 || RN_VERSION_MAJOR > 0) + self.reactNativeDelegate = [ReactNativeDelegate new]; +#endif [super application:application didFinishLaunchingWithOptions:launchOptions]; - self.dependencyProvider = [RCTAppDependencyProvider new]; - - if (self.bridgelessEnabled) { -#ifdef RCT_NEW_ARCH_ENABLED - [ReactNativeNavigation - registerExternalHostComponent: @"RNNCustomComponent" - callback:^UIViewController *(NSDictionary *props, RCTHost *host) { - return [[RNNCustomViewController alloc] initWithProps:props]; - }]; +#if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 + self.dependencyProvider = [RCTAppDependencyProvider new]; #endif - } else { - [ReactNativeNavigation - registerExternalComponent:@"RNNCustomComponent" - callback:^UIViewController *(NSDictionary *props, RCTBridge *bridge) { - return [[RNNCustomViewController alloc] initWithProps:props]; - }]; - } + + [ReactNativeNavigation + registerExternalHostComponent: @"RNNCustomComponent" + callback:^UIViewController *(NSDictionary *props, RCTHost *host) { + return [[RNNCustomViewController alloc] initWithProps:props]; + }]; return YES; } +#if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 #pragma mark - RCTBridgeDelegate - - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { - return [self bundleURL]; + return [self bundleURL]; } - (NSURL *)bundleURL { #if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; #else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif } +#endif @end + From b04308c37d636ee654384a29363bce61a5259f89 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Thu, 20 Nov 2025 14:07:14 +0200 Subject: [PATCH 03/36] RNNAppDelegate update --- ios/RNNAppDelegate.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/ios/RNNAppDelegate.mm b/ios/RNNAppDelegate.mm index 9f54052b72..f89f581237 100644 --- a/ios/RNNAppDelegate.mm +++ b/ios/RNNAppDelegate.mm @@ -48,6 +48,7 @@ - (BOOL)application:(UIApplication *)application #if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 [self _setUpFeatureFlags]; + self.reactNativeFactory = [[RCTReactNativeFactory alloc] init]; self.reactNativeFactory.rootViewFactory = [self createRCTRootViewFactory]; [RCTComponentViewFactory currentComponentViewFactory].thirdPartyFabricComponentsProvider = self; RCTAppSetupPrepareApp(application, self.newArchEnabled); From 5d3298e3e124457fc57dc689198b2c607223ce07 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Thu, 20 Nov 2025 15:31:15 +0200 Subject: [PATCH 04/36] RNNAppDelegate update --- ios/RNNAppDelegate.mm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ios/RNNAppDelegate.mm b/ios/RNNAppDelegate.mm index f89f581237..fecb583857 100644 --- a/ios/RNNAppDelegate.mm +++ b/ios/RNNAppDelegate.mm @@ -48,8 +48,13 @@ - (BOOL)application:(UIApplication *)application #if RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR < 79 [self _setUpFeatureFlags]; - self.reactNativeFactory = [[RCTReactNativeFactory alloc] init]; - self.reactNativeFactory.rootViewFactory = [self createRCTRootViewFactory]; + #if RN_VERSION_MINOR == 77 + self.rootViewFactory = [self createRCTRootViewFactory]; + #else + self.reactNativeFactory = [[RCTReactNativeFactory alloc] init]; + self.reactNativeFactory.rootViewFactory = [self createRCTRootViewFactory]; + #endif + [RCTComponentViewFactory currentComponentViewFactory].thirdPartyFabricComponentsProvider = self; RCTAppSetupPrepareApp(application, self.newArchEnabled); RCTSetNewArchEnabled(TRUE); From a5d9b053d788b34e2591a9c1fa2464ed99c759de Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 10:19:37 +0200 Subject: [PATCH 05/36] update scripts --- .../__helpers__/generate_version_header.js | 15 ++++++++-- .../__helpers__/reactNativeVersion.js | 29 +++++++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/autolink/postlink/__helpers__/generate_version_header.js b/autolink/postlink/__helpers__/generate_version_header.js index 11e02a3022..a8845b08fe 100644 --- a/autolink/postlink/__helpers__/generate_version_header.js +++ b/autolink/postlink/__helpers__/generate_version_header.js @@ -17,6 +17,17 @@ function generateVersionHeader() { console.log(`Using package.json: ${packageJsonPath}`); + // Determine actual source of version + const projectRoot = path.dirname(packageJsonPath); + const rnPackageJsonPath = path.join(projectRoot, 'node_modules', 'react-native', 'package.json'); + let versionSource = packageJsonPath; + let versionSourceType = 'package.json'; + + if (fs.existsSync(rnPackageJsonPath)) { + versionSource = rnPackageJsonPath; + versionSourceType = 'node_modules/react-native/package.json (installed version)'; + } + const versionInfo = getReactNativeVersion(); if (!versionInfo) { @@ -24,7 +35,7 @@ function generateVersionHeader() { return; } - console.log(`Found React Native version: ${versionInfo.raw}`); + console.log(`Found React Native version: ${versionInfo.raw} from ${versionSourceType}`); const { major, minor, patch } = versionInfo; @@ -33,7 +44,7 @@ function generateVersionHeader() { // ReactNativeVersionExtracted.h // React Native version: ${versionInfo.raw} // Generated on: ${new Date().toISOString()} - // Source: ${packageJsonPath} + // Source: ${versionSource} // #ifndef ReactNativeVersionExtracted_h diff --git a/autolink/postlink/__helpers__/reactNativeVersion.js b/autolink/postlink/__helpers__/reactNativeVersion.js index 19f1d81f85..b0be09b3e1 100644 --- a/autolink/postlink/__helpers__/reactNativeVersion.js +++ b/autolink/postlink/__helpers__/reactNativeVersion.js @@ -33,7 +33,7 @@ function findProjectPackageJson() { } /** - * Get React Native version as parsed object + * Get React Native version as parsed object from node_modules * @returns {Object|null} { major, minor, patch, raw } or null */ function getReactNativeVersion() { @@ -43,13 +43,38 @@ function getReactNativeVersion() { return null; } + var projectRoot = nodePath.dirname(projectPackageJsonPath); + + // First, try to read from node_modules/react-native/package.json (actual installed version) + var rnPackageJsonPath = nodePath.join(projectRoot, 'node_modules', 'react-native', 'package.json'); + + try { + if (fs.existsSync(rnPackageJsonPath)) { + var rnPackageJson = JSON.parse(fs.readFileSync(rnPackageJsonPath, 'utf8')); + var rnVersion = rnPackageJson.version; + + if (rnVersion) { + var parts = rnVersion.split('.'); + return { + major: parseInt(parts[0]) || 0, + minor: parseInt(parts[1]) || 0, + patch: parseInt(parts[2]) || 0, + raw: rnVersion + }; + } + } + } catch (e) { + // Fall through to backup method + } + + // Fallback: read from project's package.json dependencies try { var packageJson = JSON.parse(fs.readFileSync(projectPackageJsonPath, 'utf8')); var rnVersion = packageJson.dependencies && packageJson.dependencies['react-native'] || packageJson.devDependencies && packageJson.devDependencies['react-native']; if (!rnVersion) { - warnn('React Native not found in package.json'); + warnn('React Native not found in package.json or node_modules'); return null; } From ccbf5d1eb80c7eafe0374612795a3198a3887929 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 12:00:08 +0200 Subject: [PATCH 06/36] sim updates --- playground/e2e/detox.config.js | 4 ++-- scripts/test-unit.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/playground/e2e/detox.config.js b/playground/e2e/detox.config.js index 8b020b7569..963f0e7c6d 100644 --- a/playground/e2e/detox.config.js +++ b/playground/e2e/detox.config.js @@ -21,8 +21,8 @@ const config = { simulator: { type: 'ios.simulator', device: { - type: 'iPhone 13 Pro Max', - os: '15.5', + type: 'iPhone 16 Pro Max', + os: '18.5', }, }, emulator: { diff --git a/scripts/test-unit.js b/scripts/test-unit.js index 4546cd9ac4..df4d7025cc 100644 --- a/scripts/test-unit.js +++ b/scripts/test-unit.js @@ -25,7 +25,7 @@ function runAndroidUnitTests() { function runIosUnitTests() { exec.execSync('yarn run pod-install'); - testTarget('playground', 'iPhone 13', '15.5'); + testTarget('playground', 'iPhone 16 Pro Max', '18.5'); } function testTarget(scheme, device, OS = 'latest') { From c4ce866cd9281a55d28e1fc8413f1423a5287088 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 13:10:07 +0200 Subject: [PATCH 07/36] podspec update --- ReactNativeNavigation.podspec | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ReactNativeNavigation.podspec b/ReactNativeNavigation.podspec index 59fbd0b47b..aadd551bce 100644 --- a/ReactNativeNavigation.podspec +++ b/ReactNativeNavigation.podspec @@ -8,11 +8,18 @@ fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1' # Detect if this is a Swift project by looking for user AppDelegate.swift files start_dir = File.expand_path('../../', __dir__) swift_delegate_path = nil -Find.find(start_dir) do |path| - if path =~ /AppDelegate\.swift$/ - swift_delegate_path = path - break +begin + Find.find(start_dir) do |path| + # Skip hidden directories and common directories that shouldn't be searched + Find.prune if path =~ /\/(\.git|\.Trash|node_modules|Pods|DerivedData|build)\b/ + + if path =~ /AppDelegate\.swift$/ + swift_delegate_path = path + break + end end +rescue Errno::EACCES, Errno::EPERM + # Ignore permission errors end swift_project = swift_delegate_path && File.exist?(swift_delegate_path) From d4d5c25161ff4c76aaee5ab8f89d0b7313b0ae82 Mon Sep 17 00:00:00 2001 From: Georgy Steshin Date: Sun, 23 Nov 2025 13:31:18 +0200 Subject: [PATCH 08/36] Upgraded to latest version React Native --- .../views/touch/OverlayTouchDelegate.kt | 17 +- package.json | 18 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- playground/package.json | 16 +- yarn.lock | 957 ++++++++---------- 5 files changed, 438 insertions(+), 572 deletions(-) diff --git a/android/src/main/java/com/reactnativenavigation/views/touch/OverlayTouchDelegate.kt b/android/src/main/java/com/reactnativenavigation/views/touch/OverlayTouchDelegate.kt index 81e3b74c65..b0330d7894 100644 --- a/android/src/main/java/com/reactnativenavigation/views/touch/OverlayTouchDelegate.kt +++ b/android/src/main/java/com/reactnativenavigation/views/touch/OverlayTouchDelegate.kt @@ -4,7 +4,6 @@ import android.view.MotionEvent import android.view.View import android.view.ViewGroup import androidx.annotation.VisibleForTesting -import com.facebook.react.views.debuggingoverlay.DebuggingOverlay import com.reactnativenavigation.options.params.Bool import com.reactnativenavigation.options.params.NullBool import com.reactnativenavigation.react.ReactView @@ -57,7 +56,19 @@ open class OverlayTouchDelegate( return false } - private fun debuggingOverlay(childItem: View?): Boolean = - childItem is ViewGroup && childItem.getChildAt(0) is DebuggingOverlay + private fun debuggingOverlay(childItem: View?): Boolean { + if (childItem !is ViewGroup) return false + val firstChild = childItem.getChildAt(0) ?: return false + return isDebuggingOverlay(firstChild) + } + + private fun isDebuggingOverlay(view: View): Boolean { + return try { + val className = view.javaClass.name + className == "com.facebook.react.views.debuggingoverlay.DebuggingOverlay" + } catch (e: Exception) { + false + } + } } \ No newline at end of file diff --git a/package.json b/package.json index 217ab3806f..7c4e5e9e2c 100644 --- a/package.json +++ b/package.json @@ -88,15 +88,15 @@ "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", "@babel/types": "7.25.0", - "@react-native-community/cli": "15.1.0", - "@react-native-community/cli-platform-android": "15.1.0", - "@react-native-community/cli-platform-ios": "15.1.0", + "@react-native-community/cli": "18.0.0", + "@react-native-community/cli-platform-android": "18.0.0", + "@react-native-community/cli-platform-ios": "18.0.0", "@react-native-community/datetimepicker": "^8.2.0", "@react-native-community/netinfo": "^11.4.1", - "@react-native/babel-preset": "0.78.3", - "@react-native/eslint-config": "0.78.3", - "@react-native/metro-config": "0.78.3", - "@react-native/typescript-config": "0.78.3", + "@react-native/babel-preset": "0.79.7", + "@react-native/eslint-config": "0.79.7", + "@react-native/metro-config": "0.79.7", + "@react-native/typescript-config": "0.79.7", "@testing-library/jest-native": "^5.4.2", "@testing-library/react-native": "^13.0.1", "@types/hoist-non-react-statics": "^3.3.6", @@ -124,7 +124,7 @@ "pngjs": "^6.0.0", "prettier": "2.8.8", "react": "19.0.0", - "react-native": "0.78.3", + "react-native": "0.79.7", "react-native-builder-bob": "^0.40.13", "react-native-fast-image": "^8.6.3", "react-native-gesture-handler": "^2.22.1", @@ -179,4 +179,4 @@ ] ] } -} \ No newline at end of file +} diff --git a/playground/android/gradle/wrapper/gradle-wrapper.properties b/playground/android/gradle/wrapper/gradle-wrapper.properties index 3d4d21f118..0fd128f9ee 100644 --- a/playground/android/gradle/wrapper/gradle-wrapper.properties +++ b/playground/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Thu Jul 28 13:48:47 IDT 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/playground/package.json b/playground/package.json index 9edf9264ab..c6e3a0a14f 100644 --- a/playground/package.json +++ b/playground/package.json @@ -32,15 +32,15 @@ "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", "@babel/types": "7.25.0", - "@react-native-community/cli": "15.1.0", - "@react-native-community/cli-platform-android": "15.1.0", - "@react-native-community/cli-platform-ios": "15.1.0", + "@react-native-community/cli": "18.0.0", + "@react-native-community/cli-platform-android": "18.0.0", + "@react-native-community/cli-platform-ios": "18.0.0", "@react-native-community/datetimepicker": "^8.2.0", "@react-native-community/netinfo": "^11.4.1", - "@react-native/babel-preset": "0.78.3", - "@react-native/eslint-config": "0.78.3", - "@react-native/metro-config": "0.78.3", - "@react-native/typescript-config": "0.78.3", + "@react-native/babel-preset": "0.79.7", + "@react-native/eslint-config": "0.79.7", + "@react-native/metro-config": "0.79.7", + "@react-native/typescript-config": "0.79.7", "@testing-library/jest-native": "^5.4.2", "@testing-library/react-native": "^13.0.1", "@types/hoist-non-react-statics": "^3.3.6", @@ -68,7 +68,7 @@ "pngjs": "^6.0.0", "prettier": "2.8.8", "react": "19.0.0", - "react-native": "0.78.3", + "react-native": "0.79.7", "react-native-fast-image": "^8.6.3", "react-native-gesture-handler": "^2.22.1", "react-native-monorepo-config": "^0.3.0", diff --git a/yarn.lock b/yarn.lock index 680ae52203..a09a6b909f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -55,7 +55,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.7, @babel/core@npm:^7.25.2": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.25.2": version: 7.28.5 resolution: "@babel/core@npm:7.28.5" dependencies: @@ -318,7 +318,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.5": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.5": version: 7.28.5 resolution: "@babel/parser@npm:7.28.5" dependencies: @@ -745,7 +745,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.0.0-0, @babel/plugin-transform-class-properties@npm:^7.24.7, @babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.27.1": +"@babel/plugin-transform-class-properties@npm:^7.0.0-0, @babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" dependencies: @@ -889,7 +889,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.25.2, @babel/plugin-transform-flow-strip-types@npm:^7.26.5, @babel/plugin-transform-flow-strip-types@npm:^7.27.1": +"@babel/plugin-transform-flow-strip-types@npm:^7.25.2, @babel/plugin-transform-flow-strip-types@npm:^7.26.5": version: 7.27.1 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.27.1" dependencies: @@ -982,7 +982,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.24.7, @babel/plugin-transform-modules-commonjs@npm:^7.24.8, @babel/plugin-transform-modules-commonjs@npm:^7.27.1": +"@babel/plugin-transform-modules-commonjs@npm:^7.24.8, @babel/plugin-transform-modules-commonjs@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.27.1" dependencies: @@ -1103,7 +1103,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.0.0-0, @babel/plugin-transform-optional-chaining@npm:^7.24.7, @babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.5": +"@babel/plugin-transform-optional-chaining@npm:^7.0.0-0, @babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.5": version: 7.28.5 resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.5" dependencies: @@ -1492,19 +1492,6 @@ __metadata: languageName: node linkType: hard -"@babel/preset-flow@npm:^7.24.7": - version: 7.27.1 - resolution: "@babel/preset-flow@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": ^7.27.1 - "@babel/helper-validator-option": ^7.27.1 - "@babel/plugin-transform-flow-strip-types": ^7.27.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f3f25b390debf72a6ff0170a2d5198aea344ba96f05eaca0bae2c7072119706fd46321604d89646bda1842527cfc6eab8828a983ec90149218d2120b9cd26596 - languageName: node - linkType: hard - "@babel/preset-modules@npm:0.1.6-no-external-plugins": version: 0.1.6-no-external-plugins resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" @@ -1549,21 +1536,6 @@ __metadata: languageName: node linkType: hard -"@babel/register@npm:^7.24.6": - version: 7.28.3 - resolution: "@babel/register@npm:7.28.3" - dependencies: - clone-deep: ^4.0.1 - find-cache-dir: ^2.0.0 - make-dir: ^2.1.0 - pirates: ^4.0.6 - source-map-support: ^0.5.16 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 179b6a5d499a25aa52e2f36a28f7cc04f720684457d46951d4d308e4ebfbe59c6d0a3b84bee2070e36964457c644da1d839be47fbb33b0bdad1ef263d65bc395 - languageName: node - linkType: hard - "@babel/runtime@npm:^7.25.0": version: 7.28.4 resolution: "@babel/runtime@npm:7.28.4" @@ -1886,7 +1858,7 @@ __metadata: languageName: node linkType: hard -"@jest/create-cache-key-function@npm:^29.6.3": +"@jest/create-cache-key-function@npm:^29.7.0": version: 29.7.0 resolution: "@jest/create-cache-key-function@npm:29.7.0" dependencies: @@ -2232,62 +2204,65 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-clean@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-clean@npm:15.1.0" +"@react-native-community/cli-clean@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-clean@npm:18.0.0" dependencies: - "@react-native-community/cli-tools": 15.1.0 + "@react-native-community/cli-tools": 18.0.0 chalk: ^4.1.2 execa: ^5.0.0 fast-glob: ^3.3.2 - checksum: 570a240ba3c7e38c1cca82a946f81e5d339fc179fbb230a8dcaaa62ece097aebc2ae1b82bf914d4a9edb30b90c611212b0b383fa53e6b577dbf0952e818f44af + checksum: 901f9ba9c124447de7da76b4e4a52dd6c374ffd117def571368e23393e2a4591e907076d937f8a6a6a81d97a24fcc6f73b7d026d327d9319bf3c4e83f84a79c5 languageName: node linkType: hard -"@react-native-community/cli-config-apple@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-config-apple@npm:15.1.0" +"@react-native-community/cli-config-android@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-config-android@npm:18.0.0" dependencies: - "@react-native-community/cli-tools": 15.1.0 + "@react-native-community/cli-tools": 18.0.0 chalk: ^4.1.2 - execa: ^5.0.0 fast-glob: ^3.3.2 - checksum: 1f03a81c8360c26b01f813e586cd28c66f21c1af07572e45e15b9d6613612add0d0dd3104a99d3c1e5fca4e8956c3768ef76e516a583426faedea69110552af7 + fast-xml-parser: ^4.4.1 + checksum: 60baf6f009f2ecbfa28c9320a83f32682336e4718697d18ac63530cebba7df7040a9209871ddf96c90cf8047f23b49cac11e8fc67c0cb3419f1f4758e8cc3efc languageName: node linkType: hard -"@react-native-community/cli-config@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-config@npm:15.1.0" +"@react-native-community/cli-config-apple@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-config-apple@npm:18.0.0" dependencies: - "@react-native-community/cli-tools": 15.1.0 + "@react-native-community/cli-tools": 18.0.0 chalk: ^4.1.2 - cosmiconfig: ^9.0.0 - deepmerge: ^4.3.0 + execa: ^5.0.0 fast-glob: ^3.3.2 - joi: ^17.2.1 - checksum: c944f782c35cefeb75c5ac250a46cc912da9ae956a9c3c6f76e562ccb0c04d61d5eb43bafbf90fa82e4548000af4ae9d9bb0301efabc733f876415b7f1272f2c + checksum: 2b085ccfb615d37cfb68389ee7534e76d8d277bb2966ee0497fd06ece372c00da05d677d72a7f50d759c7500ba380bd4f64f18c96a53bbbc2feab9d03a1ee9ba languageName: node linkType: hard -"@react-native-community/cli-debugger-ui@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-debugger-ui@npm:15.1.0" +"@react-native-community/cli-config@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-config@npm:18.0.0" dependencies: - serve-static: ^1.13.1 - checksum: 2ffa7c1c2a5e11212c2c815dd15545866ea8e1a07b6950a625819b43a9d2bfb0c7b0085f922d324ab07bdd7a0d983295f423b1397948c898fbf307bc16477c55 + "@react-native-community/cli-tools": 18.0.0 + chalk: ^4.1.2 + cosmiconfig: ^9.0.0 + deepmerge: ^4.3.0 + fast-glob: ^3.3.2 + joi: ^17.2.1 + checksum: d4df3fdce60753667f654da6029577d7cfecaaf7eb193ee6ff437a90fa594cbbf0afe3894c938eb120b47f2b97a6e57729c1ffc46daff8f504bf7022da4068b4 languageName: node linkType: hard -"@react-native-community/cli-doctor@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-doctor@npm:15.1.0" +"@react-native-community/cli-doctor@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-doctor@npm:18.0.0" dependencies: - "@react-native-community/cli-config": 15.1.0 - "@react-native-community/cli-platform-android": 15.1.0 - "@react-native-community/cli-platform-apple": 15.1.0 - "@react-native-community/cli-platform-ios": 15.1.0 - "@react-native-community/cli-tools": 15.1.0 + "@react-native-community/cli-config": 18.0.0 + "@react-native-community/cli-platform-android": 18.0.0 + "@react-native-community/cli-platform-apple": 18.0.0 + "@react-native-community/cli-platform-ios": 18.0.0 + "@react-native-community/cli-tools": 18.0.0 chalk: ^4.1.2 command-exists: ^1.2.8 deepmerge: ^4.3.0 @@ -2296,105 +2271,102 @@ __metadata: node-stream-zip: ^1.9.1 ora: ^5.4.1 semver: ^7.5.2 - strip-ansi: ^5.2.0 wcwidth: ^1.0.1 yaml: ^2.2.1 - checksum: 8a0355eb29bb2d204cbaad4d9488a451b992dff254681270fcfd280646a70b7c2451120c1e73603f2212fb4062662049021784fa2d5fe1604a7740d20089bdad + checksum: bcf703aabf63cf9f06b2fa1b6a1f7b1bbfd50f2d0486621a718718ccd8a1ad5ebd47335e9d8b9809d354684d8836c495606b77f49552698970ef5dd9dedcd8b5 languageName: node linkType: hard -"@react-native-community/cli-platform-android@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-platform-android@npm:15.1.0" +"@react-native-community/cli-platform-android@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-platform-android@npm:18.0.0" dependencies: - "@react-native-community/cli-tools": 15.1.0 + "@react-native-community/cli-config-android": 18.0.0 + "@react-native-community/cli-tools": 18.0.0 chalk: ^4.1.2 execa: ^5.0.0 - fast-glob: ^3.3.2 - fast-xml-parser: ^4.4.1 logkitty: ^0.7.1 - checksum: 9407b12ab2ebced7f5e1730fe3a2aac3444f0553c0345fb18444d779311b353fd94a20dca58b43989d6001758feff13dd43f9baf58b15e9f9cfcb40d66aa7fe6 + checksum: 9ea334d9add268faa33a9e346d0df21718e8c99306a13560380d734d8562688dd25486483735ab33d8caccc34f1eea07f2837932ab7d335d5d918b20902458fa languageName: node linkType: hard -"@react-native-community/cli-platform-apple@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-platform-apple@npm:15.1.0" +"@react-native-community/cli-platform-apple@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-platform-apple@npm:18.0.0" dependencies: - "@react-native-community/cli-config-apple": 15.1.0 - "@react-native-community/cli-tools": 15.1.0 + "@react-native-community/cli-config-apple": 18.0.0 + "@react-native-community/cli-tools": 18.0.0 chalk: ^4.1.2 execa: ^5.0.0 fast-xml-parser: ^4.4.1 - checksum: 641d38892bd55c1e8ce5be1789a3535f643aef91b462ae69961c1bdba68b23f45cbdd1be519812a52db1cb653f892d96dc1e56f3f95e79dacfbbd7082bdcfaff + checksum: ef3381bfeabe83e75820c9e4e560791b9fd98ed9ca109ab11b7e70ff7f687fad11d301952060d60b2c2ffe91345a024cc024fa9c9d2f5973bf704d3dddef0c15 languageName: node linkType: hard -"@react-native-community/cli-platform-ios@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-platform-ios@npm:15.1.0" +"@react-native-community/cli-platform-ios@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-platform-ios@npm:18.0.0" dependencies: - "@react-native-community/cli-platform-apple": 15.1.0 - checksum: ff91a726a0c7e9d30cdc0ee9464fc3481778a6fce651a871ecddace083a3deab4e92c02b8310023400261d1dc95a9d9d8a15fc569b93864a3b6d61e00a1622d3 + "@react-native-community/cli-platform-apple": 18.0.0 + checksum: 9d0786e41f5f1e8853c0fa43005f7a12b7926dde583163b8dd5b79c95df1a1e0cfdc3e80665c0646aa398f6a1b1bf82e952caeb2c56170204926421e7f5fcbea languageName: node linkType: hard -"@react-native-community/cli-server-api@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-server-api@npm:15.1.0" +"@react-native-community/cli-server-api@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-server-api@npm:18.0.0" dependencies: - "@react-native-community/cli-debugger-ui": 15.1.0 - "@react-native-community/cli-tools": 15.1.0 + "@react-native-community/cli-tools": 18.0.0 + body-parser: ^1.20.3 compression: ^1.7.1 connect: ^3.6.5 errorhandler: ^1.5.1 nocache: ^3.0.1 + open: ^6.2.0 pretty-format: ^26.6.2 serve-static: ^1.13.1 ws: ^6.2.3 - checksum: f8ac7416d13658656a50093dbf9e03cde0ee1acf53c3fd3455810452cb70aa326e3999c5fe651d5380e6540156d863365a773242e5372f77192fb9ce5b484967 + checksum: 839e9a97b8cb8b875d00ca8a3743ad125beb7a85b74ee07adc9b712896b78d9ed5a35b46c2b7ea5dbfc312a797f9ee96af1bf3462d315252f10375aa22315fe8 languageName: node linkType: hard -"@react-native-community/cli-tools@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-tools@npm:15.1.0" +"@react-native-community/cli-tools@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-tools@npm:18.0.0" dependencies: + "@vscode/sudo-prompt": ^9.0.0 appdirsjs: ^1.2.4 chalk: ^4.1.2 execa: ^5.0.0 find-up: ^5.0.0 + launch-editor: ^2.9.1 mime: ^2.4.1 - open: ^6.2.0 ora: ^5.4.1 prompts: ^2.4.2 semver: ^7.5.2 - shell-quote: ^1.7.3 - sudo-prompt: ^9.0.0 - checksum: bac3ef6472f8929167c2943f7f5c8fc3db02aa64a00cff9341e162414e1d5ed8913bb4226535b7c774dc85af6d076d5d2f7a6bccf8afa2262a502b1786ea65fb + checksum: 96a941c4b62da75dccd2fb09dc859dbc724e46be7ca2a9061a2235d58bb2a2c1d6040b203efcdc03dd0c8dbe9306b47a903073abc9fe2f300dcce9f8cd4afd84 languageName: node linkType: hard -"@react-native-community/cli-types@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli-types@npm:15.1.0" +"@react-native-community/cli-types@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli-types@npm:18.0.0" dependencies: joi: ^17.2.1 - checksum: 433b1f358fc4f41f5630bcf95c18f564752ef68181d13cd199d2266247bd27de3b9f48ebf6a7db9eb67bbe1d78885471f2c3981b11375b3299a6d6d8686112e2 + checksum: 92768eb2dd74549069230b6b594b3ae4cdeae03f938504a642fcaed564c22b2b2bb516c4b6cd880a5b419f408206404d88034795e369f8bb8765bdb1f38ed07d languageName: node linkType: hard -"@react-native-community/cli@npm:15.1.0": - version: 15.1.0 - resolution: "@react-native-community/cli@npm:15.1.0" +"@react-native-community/cli@npm:18.0.0": + version: 18.0.0 + resolution: "@react-native-community/cli@npm:18.0.0" dependencies: - "@react-native-community/cli-clean": 15.1.0 - "@react-native-community/cli-config": 15.1.0 - "@react-native-community/cli-debugger-ui": 15.1.0 - "@react-native-community/cli-doctor": 15.1.0 - "@react-native-community/cli-server-api": 15.1.0 - "@react-native-community/cli-tools": 15.1.0 - "@react-native-community/cli-types": 15.1.0 + "@react-native-community/cli-clean": 18.0.0 + "@react-native-community/cli-config": 18.0.0 + "@react-native-community/cli-doctor": 18.0.0 + "@react-native-community/cli-server-api": 18.0.0 + "@react-native-community/cli-tools": 18.0.0 + "@react-native-community/cli-types": 18.0.0 chalk: ^4.1.2 commander: ^9.4.1 deepmerge: ^4.3.0 @@ -2406,7 +2378,7 @@ __metadata: semver: ^7.5.2 bin: rnc-cli: build/bin.js - checksum: fb2c144dad3d92e0ea1c540f99a9053781b9818b0f5c358c7c19f1621a89ff12b57436af5e7cdd8542f153300997e987dfc400a456d884eb532b67e5a6cfd64e + checksum: bd4d4142c95339393f35509038042fa854b4dd2d7dd458fcb2226d2e63d947cff561f20ce47253249bde310db35c071f836195377761dd7a8e64cb1ce1e35217 languageName: node linkType: hard @@ -2438,26 +2410,26 @@ __metadata: languageName: node linkType: hard -"@react-native/assets-registry@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/assets-registry@npm:0.78.3" - checksum: 246a1631717f1be7050ce8c395db1a466e9cb111ffbd006ce44f053c5aab8835969ecc9d347ccb1cd1445b91769cbd3318ec28ef075822361f769c6f8a868e77 +"@react-native/assets-registry@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/assets-registry@npm:0.79.7" + checksum: 4ba5f118177431be00b398368d1db7c69cf587308bc3cf2df84a34512e6ecc7be9e6b1687279ae85ff7bbcdcbc1a0608cf84f8d16fc3f9abb91e148470964f82 languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/babel-plugin-codegen@npm:0.78.3" +"@react-native/babel-plugin-codegen@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/babel-plugin-codegen@npm:0.79.7" dependencies: "@babel/traverse": ^7.25.3 - "@react-native/codegen": 0.78.3 - checksum: 728f5347be554905a7af8306465d825206990dbb18b0b669bc8b062e9e08e7020f4c8899df137af7664e0bc8d7088b5f6de4692201e6dc8fbb00dbce0c94ad3e + "@react-native/codegen": 0.79.7 + checksum: 60df348c43739cfa0a3163835a019337d39c42f9050bba0f8bfbd5ca9b9b3577acdf647d2c961a05a81fedf5eed6e774315916b9bfdf08e16efae954da0d638d languageName: node linkType: hard -"@react-native/babel-preset@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/babel-preset@npm:0.78.3" +"@react-native/babel-preset@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/babel-preset@npm:0.79.7" dependencies: "@babel/core": ^7.25.2 "@babel/plugin-proposal-export-default-from": ^7.24.7 @@ -2500,69 +2472,67 @@ __metadata: "@babel/plugin-transform-typescript": ^7.25.2 "@babel/plugin-transform-unicode-regex": ^7.24.7 "@babel/template": ^7.25.0 - "@react-native/babel-plugin-codegen": 0.78.3 + "@react-native/babel-plugin-codegen": 0.79.7 babel-plugin-syntax-hermes-parser: 0.25.1 babel-plugin-transform-flow-enums: ^0.0.2 react-refresh: ^0.14.0 peerDependencies: "@babel/core": "*" - checksum: 32f8e3df8a46f6a4edea024cc3f3179da6b26be1b91b3c1141bcc1e1c84e83287110812d5f05f8a3d2cde4083b4cabe3e3886273d20a44801ceb25754cd583de + checksum: 77618ceaccc133c032182584e2162fc74d3fb6b7d853bbf593be58979093c404824995dd6f0889e42a29c36628b3dbe29029ad661cc273e53dd205ee84ce9281 languageName: node linkType: hard -"@react-native/codegen@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/codegen@npm:0.78.3" +"@react-native/codegen@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/codegen@npm:0.79.7" dependencies: + "@babel/core": ^7.25.2 "@babel/parser": ^7.25.3 glob: ^7.1.1 hermes-parser: 0.25.1 invariant: ^2.2.4 - jscodeshift: ^17.0.0 nullthrows: ^1.1.1 yargs: ^17.6.2 peerDependencies: - "@babel/preset-env": ^7.1.6 - checksum: 8d4a5d814bb4f0326f9e612c08e549a4ff4a544c9e01b7e703ddc0dbe614e621c0b78bf26be515ca7a9f16a06206ecb59d0748a04a0193cf44e5c7a85a9be79a + "@babel/core": "*" + checksum: 61d8c21fe672c17ea0c4189cc8094dd27c2ee25e8aca1bd0e5afbf5464d97641e0bfe12cdc4d1d71aa43ebba4bd08517d0a03b2131a194688f043781959baa7d languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/community-cli-plugin@npm:0.78.3" +"@react-native/community-cli-plugin@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/community-cli-plugin@npm:0.79.7" dependencies: - "@react-native/dev-middleware": 0.78.3 - "@react-native/metro-babel-transformer": 0.78.3 + "@react-native/dev-middleware": 0.79.7 chalk: ^4.0.0 debug: ^2.2.0 invariant: ^2.2.4 - metro: ^0.81.3 - metro-config: ^0.81.3 - metro-core: ^0.81.3 - readline: ^1.3.0 + metro: ^0.82.0 + metro-config: ^0.82.0 + metro-core: ^0.82.0 semver: ^7.1.3 peerDependencies: "@react-native-community/cli": "*" peerDependenciesMeta: "@react-native-community/cli": optional: true - checksum: 663af8ba4ada71739d9dccfc014c81fa1f7171a3968b7ac4e0b5b25ccaf43d1d9e265fd5bcdbc9db7bfc22283debca9e83e34059fe2ff7f12cf0b50d06505e54 + checksum: d43f701dc22cc67c0f9fb8aa8afbde585740da401264f9eb6bef536e26934a32a4bd73721a76db362011e385793c87026168bfc9280a75cc07c8cbbe6f975173 languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/debugger-frontend@npm:0.78.3" - checksum: 5476f42c0bfa3c77b00d6f8a274d2cf7771bac529a70f2b85f35e6bdac9524b530396c1dc43cb0b5cc8786c3411759cda05e5a59810d26f5f3e1afcf5e68acac +"@react-native/debugger-frontend@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/debugger-frontend@npm:0.79.7" + checksum: c0b6992c4c9417f85869969df13816735c5d432dca10663f422ca38759ad595e70994f55d8b755c4e3ba6b77535b7eda4498011c5514e9d71fdaba2538cf1711 languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/dev-middleware@npm:0.78.3" +"@react-native/dev-middleware@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/dev-middleware@npm:0.79.7" dependencies: "@isaacs/ttlcache": ^1.4.1 - "@react-native/debugger-frontend": 0.78.3 + "@react-native/debugger-frontend": 0.79.7 chrome-launcher: ^0.15.2 chromium-edge-launcher: ^0.2.0 connect: ^3.6.5 @@ -2570,20 +2540,19 @@ __metadata: invariant: ^2.2.4 nullthrows: ^1.1.1 open: ^7.0.3 - selfsigned: ^2.4.1 serve-static: ^1.16.2 ws: ^6.2.3 - checksum: 06e4c47642c18dec9c1376660b6bdeaddb2a01a7589f8db05717ccb9b186d9981c88726d9e56b681f03bd9168c5f19fccb311f6bd2b73614a89372edbf2f36cc + checksum: b223fb7d4079342e74440ce915ec9c0d0b8fb81d69c646bc8ed376cda8219c57d3823c9d9a72cacce11db60d028b72561be4acfa054957bc8fa3abaa1e5cec33 languageName: node linkType: hard -"@react-native/eslint-config@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/eslint-config@npm:0.78.3" +"@react-native/eslint-config@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/eslint-config@npm:0.79.7" dependencies: "@babel/core": ^7.25.2 "@babel/eslint-parser": ^7.25.1 - "@react-native/eslint-plugin": 0.78.3 + "@react-native/eslint-plugin": 0.79.7 "@typescript-eslint/eslint-plugin": ^7.1.1 "@typescript-eslint/parser": ^7.1.1 eslint-config-prettier: ^8.5.0 @@ -2596,74 +2565,74 @@ __metadata: peerDependencies: eslint: ">=8" prettier: ">=2" - checksum: 92aaa23067b99ed6783f28ff51d7e39b8e7363b173d5a449ecb101b84913ea6224649a76729eb805ab9003843d2ce674acf61db14dc95475b9070748a382386f + checksum: 86362f2a5ad042e94e3398c33aac3b9387a75c037207de36717be2e3c5be5cd6a0dca8b53aa8e874d2e001e2800d12b920f6691fd23221f6bab49fe6a763d821 languageName: node linkType: hard -"@react-native/eslint-plugin@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/eslint-plugin@npm:0.78.3" - checksum: b14a613641a2f79db83268661aa2bf82ab97cf13c6a00e30745d7c689d4b3551b05109d1fe833b58659b728b411b37255f221d9a91d9cd58f2badbc68c4bdcec +"@react-native/eslint-plugin@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/eslint-plugin@npm:0.79.7" + checksum: e36362b5bee53d0dd21433eff8e42f43f452a06daff025a9d615b54e3790b59187edd1d2c3227287a0ab5155465972ce9f2412fbf8aec0731d0ea7e4ba4cdec5 languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/gradle-plugin@npm:0.78.3" - checksum: 795474d1f931153b3363416287ae9c5252b0681ea239f15cb5575127d97b64d8031ea47aba85d50f72c5842aaa96ddf3a97c4099c4be28edc7915b6008bf726e +"@react-native/gradle-plugin@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/gradle-plugin@npm:0.79.7" + checksum: c7a9761c2149a33a649a149c6be1109acf2960bb9857642170ba16a0e4556c6a1d18592dcb7ab95f5c23aaeb598af893f83c6a9f4bb9856c7c70ed919160ed88 languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/js-polyfills@npm:0.78.3" - checksum: 007c5cdb95277899ce26cf1ed049fe005339f97e136b954d54beac8f61337b246d5d0377a2bbee71fb7b43447c1e90c13a2af8beebc4af98419fecbaa38774c1 +"@react-native/js-polyfills@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/js-polyfills@npm:0.79.7" + checksum: 61c93a84c9d4eb8e2ba88d781d67677d76561bcc541793bb963d20f86f35fae80eac6e9c8d1b3da64657ddbaf3317d8b6e4ebf8122332eb2d780011576cfdc06 languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/metro-babel-transformer@npm:0.78.3" +"@react-native/metro-babel-transformer@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/metro-babel-transformer@npm:0.79.7" dependencies: "@babel/core": ^7.25.2 - "@react-native/babel-preset": 0.78.3 + "@react-native/babel-preset": 0.79.7 hermes-parser: 0.25.1 nullthrows: ^1.1.1 peerDependencies: "@babel/core": "*" - checksum: ae4727ad662b734bab947246808afe600e0066ea474237b70fa7bb671e1d809445ba99e3363d8d48a379b40e37232a973c2753e21f880aeef946e64594109361 + checksum: 2eb5bcdc460f3fc83dc84c93d32b7abcba0ec3b657940bed24cc920bb9a3b4984a7a5ff4df1ff492a7686d9b149cd34fd730c33ebfd8a79aca3897b9c33b1fd4 languageName: node linkType: hard -"@react-native/metro-config@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/metro-config@npm:0.78.3" +"@react-native/metro-config@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/metro-config@npm:0.79.7" dependencies: - "@react-native/js-polyfills": 0.78.3 - "@react-native/metro-babel-transformer": 0.78.3 - metro-config: ^0.81.3 - metro-runtime: ^0.81.3 - checksum: 4225017872f8bd8192feb7a2eab440be29df7b4d1407924f25fd08c60125754b1897a4a55fb029ba3133491659ef2b254b4fee770e692d73c9bd819f29171c81 + "@react-native/js-polyfills": 0.79.7 + "@react-native/metro-babel-transformer": 0.79.7 + metro-config: ^0.82.0 + metro-runtime: ^0.82.0 + checksum: 72ade5725fb1c56fc0268e979bf4d3363a5a00f8c3a45856b1742aee1911d20f372975289b92a0358bb54752b79f25d32e8516d3da731e7ba717456a31ee7c6f languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/normalize-colors@npm:0.78.3" - checksum: c5c1a17fdc7614f74360c1115d31d47b3110a3d2b601a9a930e5c0fb6ecd4e33b4b075b4a2e0bffd34e3ba9c64133c0026c8e41f845c2d2e7528a18d10c1606e +"@react-native/normalize-colors@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/normalize-colors@npm:0.79.7" + checksum: 0c9420bbacb93965c50d872ab65edc17669a51ba7404ae845a6ee51356d0ef5c616c41782bb7b0af7b795f0a63e579ae28145450788fbcf053abf423038c2389 languageName: node linkType: hard -"@react-native/typescript-config@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/typescript-config@npm:0.78.3" - checksum: d1a2080e75d050abb2b6adebb2897313f853eaf9ea2a9ae5cf13fecc005c0905a755ba7f2c89cea4455632324593fec55fd0997102b9f8a9bfd1f8c417cd1b4d +"@react-native/typescript-config@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/typescript-config@npm:0.79.7" + checksum: add9f04e7019011fff96e72e270fad3cbf714776f028136255b2a84027faad461ed20e121587052d1da838fc0d66c4b4a0579312eb5f17d6210f93251e5a3041 languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.78.3": - version: 0.78.3 - resolution: "@react-native/virtualized-lists@npm:0.78.3" +"@react-native/virtualized-lists@npm:0.79.7": + version: 0.79.7 + resolution: "@react-native/virtualized-lists@npm:0.79.7" dependencies: invariant: ^2.2.4 nullthrows: ^1.1.1 @@ -2674,7 +2643,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: f75b05fc9d34bafd8a7df3eac81893a11e4b01f6ef34a818f1925e826d6ef4d8e7ec91656f66fa78ac6df22eb1e5ff94ac2ed9b9713553b9357f358d7e9d842c + checksum: 91e05a838a040d21f86221e2a5a89130148470b38e78d7505ba89bd5ebb12b3bafe05d27df52e525b966251c083737cd99c9aa5d70d1006c9c856e4a1a9c0408 languageName: node linkType: hard @@ -3029,15 +2998,6 @@ __metadata: languageName: node linkType: hard -"@types/node-forge@npm:^1.3.0": - version: 1.3.14 - resolution: "@types/node-forge@npm:1.3.14" - dependencies: - "@types/node": "*" - checksum: ff621803390e723e56b289a89fca3a06f9f8b438add1b843203a0f64bcbc7ac03d457136b3c15010b5bc89d81f57b35f62964e6e980f6290597bb21b4463c009 - languageName: node - linkType: hard - "@types/node@npm:*": version: 24.10.0 resolution: "@types/node@npm:24.10.0" @@ -3533,6 +3493,13 @@ __metadata: languageName: node linkType: hard +"@vscode/sudo-prompt@npm:^9.0.0": + version: 9.3.1 + resolution: "@vscode/sudo-prompt@npm:9.3.1" + checksum: 07a6ce9ef2e4e2b369288b78344f7ef3db977d5f1576b944075c22aacb9cf830acfd5f773d1b0497610bec4f811d44793142234114e57763abc78ea2cef8940a + languageName: node + linkType: hard + "@wix-pilot/core@npm:^3.4.2": version: 3.4.2 resolution: "@wix-pilot/core@npm:3.4.2" @@ -4058,15 +4025,6 @@ __metadata: languageName: node linkType: hard -"ast-types@npm:^0.16.1": - version: 0.16.1 - resolution: "ast-types@npm:0.16.1" - dependencies: - tslib: ^2.0.1 - checksum: 21c186da9fdb1d8087b1b7dabbc4059f91aa5a1e593a9776b4393cc1eaa857e741b2dda678d20e34b16727b78fef3ab59cf8f0c75ed1ba649c78fe194e5c114b - languageName: node - linkType: hard - "astral-regex@npm:^1.0.0": version: 1.0.0 resolution: "astral-regex@npm:1.0.0" @@ -4371,6 +4329,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:^1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: 3.1.2 + content-type: ~1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: ~1.6.18 + unpipe: 1.0.0 + checksum: 1a35c59a6be8d852b00946330141c4f142c6af0f970faa87f10ad74f1ee7118078056706a05ae3093c54dabca9cd3770fa62a170a85801da1a4324f04381167d + languageName: node + linkType: hard + "boolean@npm:^3.0.1": version: 3.2.0 resolution: "boolean@npm:3.2.0" @@ -4989,17 +4967,6 @@ __metadata: languageName: node linkType: hard -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: ^2.0.4 - kind-of: ^6.0.2 - shallow-clone: ^3.0.0 - checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 - languageName: node - linkType: hard - "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -5180,13 +5147,6 @@ __metadata: languageName: node linkType: hard -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb - languageName: node - linkType: hard - "compare-versions@npm:^3.6.0": version: 3.6.0 resolution: "compare-versions@npm:3.6.0" @@ -5291,6 +5251,13 @@ __metadata: languageName: node linkType: hard +"content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 + languageName: node + linkType: hard + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -5520,7 +5487,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.1": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.1": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -6580,7 +6547,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0, esprima@npm:~4.0.0": +"esprima@npm:^4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -6926,17 +6893,6 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^2.0.0": - version: 2.1.0 - resolution: "find-cache-dir@npm:2.1.0" - dependencies: - commondir: ^1.0.1 - make-dir: ^2.0.0 - pkg-dir: ^3.0.0 - checksum: 60ad475a6da9f257df4e81900f78986ab367d4f65d33cf802c5b91e969c28a8762f098693d7a571b6e4dd4c15166c2da32ae2d18b6766a18e2071079448fdce4 - languageName: node - linkType: hard - "find-npm-prefix@npm:^1.0.2": version: 1.0.2 resolution: "find-npm-prefix@npm:1.0.2" @@ -7016,13 +6972,6 @@ __metadata: languageName: node linkType: hard -"flow-parser@npm:0.*": - version: 0.291.0 - resolution: "flow-parser@npm:0.291.0" - checksum: 84c2a1b8d5a15ce46c97d9449cd806d84c96a3424b70ed874acb3b7afb470ac118f49f1343e26fed36c4981ea902713a2b591a640c7b94c97c0239e5fd1e0c64 - languageName: node - linkType: hard - "flush-write-stream@npm:^1.0.0": version: 1.1.1 resolution: "flush-write-stream@npm:1.1.1" @@ -7752,6 +7701,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.29.1": + version: 0.29.1 + resolution: "hermes-estree@npm:0.29.1" + checksum: a72fe490d99ba2f56b3e22f3d050ca7757cc8dc9ebcb9d907104e46aaabdea9d32b445f73cca724a2537090fad3dde3cce0dc733bad6d7b3930c6bcde484d45c + languageName: node + linkType: hard + "hermes-parser@npm:0.25.1": version: 0.25.1 resolution: "hermes-parser@npm:0.25.1" @@ -7770,6 +7726,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.29.1": + version: 0.29.1 + resolution: "hermes-parser@npm:0.29.1" + dependencies: + hermes-estree: 0.29.1 + checksum: 3a7cd5cbdb191579f521dcb17edf199e24631314b9f69d043007e91762b53cd1f38eeb7688571f5be378b1c118e99af42040139e5f00e74a7cfd5c52c9d262e0 + languageName: node + linkType: hard + "hoist-non-react-statics@npm:3.x.x, hoist-non-react-statics@npm:^3.0.0, hoist-non-react-statics@npm:^3.3.0": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -7868,7 +7833,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -7922,7 +7887,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.4.17": +"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.17": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -8487,15 +8452,6 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: ^3.0.1 - checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca - languageName: node - linkType: hard - "is-redirect@npm:^1.0.0": version: 1.0.0 resolution: "is-redirect@npm:1.0.0" @@ -8705,13 +8661,6 @@ __metadata: languageName: node linkType: hard -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 - languageName: node - linkType: hard - "isstream@npm:~0.1.2": version: 0.1.2 resolution: "isstream@npm:0.1.2" @@ -9002,7 +8951,7 @@ __metadata: languageName: node linkType: hard -"jest-environment-node@npm:^29.6.3, jest-environment-node@npm:^29.7.0": +"jest-environment-node@npm:^29.7.0": version: 29.7.0 resolution: "jest-environment-node@npm:29.7.0" dependencies: @@ -9420,39 +9369,6 @@ __metadata: languageName: node linkType: hard -"jscodeshift@npm:^17.0.0": - version: 17.3.0 - resolution: "jscodeshift@npm:17.3.0" - dependencies: - "@babel/core": ^7.24.7 - "@babel/parser": ^7.24.7 - "@babel/plugin-transform-class-properties": ^7.24.7 - "@babel/plugin-transform-modules-commonjs": ^7.24.7 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.24.7 - "@babel/plugin-transform-optional-chaining": ^7.24.7 - "@babel/plugin-transform-private-methods": ^7.24.7 - "@babel/preset-flow": ^7.24.7 - "@babel/preset-typescript": ^7.24.7 - "@babel/register": ^7.24.6 - flow-parser: 0.* - graceful-fs: ^4.2.4 - micromatch: ^4.0.7 - neo-async: ^2.5.0 - picocolors: ^1.0.1 - recast: ^0.23.11 - tmp: ^0.2.3 - write-file-atomic: ^5.0.1 - peerDependencies: - "@babel/preset-env": ^7.1.6 - peerDependenciesMeta: - "@babel/preset-env": - optional: true - bin: - jscodeshift: bin/jscodeshift.js - checksum: 6a529c8dcab8eef48381425c706d58a0a9205397cad367925872845ff1c35924f8f838bbd1397b28a065061032047c9fd843877000a3743240db4ba6ded2546b - languageName: node - linkType: hard - "jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" @@ -9613,13 +9529,6 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.2": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b - languageName: node - linkType: hard - "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -9650,6 +9559,16 @@ __metadata: languageName: node linkType: hard +"launch-editor@npm:^2.9.1": + version: 2.12.0 + resolution: "launch-editor@npm:2.12.0" + dependencies: + picocolors: ^1.1.1 + shell-quote: ^1.8.3 + checksum: b1aa1b92ef4e720d1edd7f80affb90b2fa1cc2c41641cf80158940698c18a4b6a67e2a7cb060547712e858f0ec1a7c8c39f605e0eb299f516a6184f4e680ffc8 + languageName: node + linkType: hard + "lazy-property@npm:~1.0.0": version: 1.0.0 resolution: "lazy-property@npm:1.0.0" @@ -10228,16 +10147,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^2.0.0, make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" - dependencies: - pify: ^4.0.1 - semver: ^5.6.0 - checksum: 043548886bfaf1820323c6a2997e6d2fa51ccc2586ac14e6f14634f7458b4db2daf15f8c310e2a0abd3e0cddc64df1890d8fc7263033602c47bb12cbfcf86aab - languageName: node - linkType: hard - "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -10347,6 +10256,13 @@ __metadata: languageName: node linkType: hard +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1 + languageName: node + linkType: hard + "memoize-one@npm:^5.0.0": version: 5.2.1 resolution: "memoize-one@npm:5.2.1" @@ -10368,70 +10284,71 @@ __metadata: languageName: node linkType: hard -"metro-babel-transformer@npm:0.81.5": - version: 0.81.5 - resolution: "metro-babel-transformer@npm:0.81.5" +"metro-babel-transformer@npm:0.82.5": + version: 0.82.5 + resolution: "metro-babel-transformer@npm:0.82.5" dependencies: "@babel/core": ^7.25.2 flow-enums-runtime: ^0.0.6 - hermes-parser: 0.25.1 + hermes-parser: 0.29.1 nullthrows: ^1.1.1 - checksum: 687b0657fcb2c6a01784a29abaa9979539a9047c0632c299d7764e7cafa9412cbb17f4e866212dc4c96a73eb47381d30340b30628b2d083fef0c88523ae0a293 + checksum: 3a3a8a9404c74290b5687290236e242f7b4edb3bc25cad6afe2424ddab8632a657b55ccbbd49dfa9b26078b5f3184f00930b8aa8b50d7c922247fd7d63ada395 languageName: node linkType: hard -"metro-cache-key@npm:0.81.5": - version: 0.81.5 - resolution: "metro-cache-key@npm:0.81.5" +"metro-cache-key@npm:0.82.5": + version: 0.82.5 + resolution: "metro-cache-key@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 - checksum: d5656bc8906ff4366d8093d19304d6ac386c59429e3e7e24050f4bc9f93ca4e04d8062af6bdd28874a5e4b9bcc84f248855933ffa80af56aeed8be5ff02c85bf + checksum: d5dcd86249905c7adad0375111a4bef395a5021df251a463f840eb21bf7b34f4e581ae919a88fb612a63c48a5f379ce50f104a576bd71e052693d89ae6a0d9f0 languageName: node linkType: hard -"metro-cache@npm:0.81.5": - version: 0.81.5 - resolution: "metro-cache@npm:0.81.5" +"metro-cache@npm:0.82.5": + version: 0.82.5 + resolution: "metro-cache@npm:0.82.5" dependencies: exponential-backoff: ^3.1.1 flow-enums-runtime: ^0.0.6 - metro-core: 0.81.5 - checksum: cba822d3f5c38163558e8240f7b8f189a597829c7df07a3f205c9565f66c0d3a9d7deab7be9449dec3bd1c615b71918c8cd05b0e2bf9cc21c517702405d468d1 + https-proxy-agent: ^7.0.5 + metro-core: 0.82.5 + checksum: d0d193845063b1e1241a770d928630c68418b6bff2a25d7d14e71b88e905c640b65817ac069abf807b6e7c6db5470b8c52fe6236b3850ae55ce68e910747eb63 languageName: node linkType: hard -"metro-config@npm:0.81.5, metro-config@npm:^0.81.3": - version: 0.81.5 - resolution: "metro-config@npm:0.81.5" +"metro-config@npm:0.82.5, metro-config@npm:^0.82.0": + version: 0.82.5 + resolution: "metro-config@npm:0.82.5" dependencies: connect: ^3.6.5 cosmiconfig: ^5.0.5 flow-enums-runtime: ^0.0.6 jest-validate: ^29.7.0 - metro: 0.81.5 - metro-cache: 0.81.5 - metro-core: 0.81.5 - metro-runtime: 0.81.5 - checksum: 43ba163fcfcbd0bcf69c3416901779c3de94536b0ee451ad73cad6311734e931cb1bf2c007dd71317f35ddf346cca74bc07b5a3075adf5c09b0e6e859d2169e4 + metro: 0.82.5 + metro-cache: 0.82.5 + metro-core: 0.82.5 + metro-runtime: 0.82.5 + checksum: 641c88d795394e551fffe238670ad09f3c8637b45da767ee95c5b401e11b65d5a4e86694fb68bd13fde1fc148d9c4f738439a0a427fe5325bd36aa19ea7a5fc9 languageName: node linkType: hard -"metro-core@npm:0.81.5, metro-core@npm:^0.81.3": - version: 0.81.5 - resolution: "metro-core@npm:0.81.5" +"metro-core@npm:0.82.5, metro-core@npm:^0.82.0": + version: 0.82.5 + resolution: "metro-core@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 lodash.throttle: ^4.1.1 - metro-resolver: 0.81.5 - checksum: 5fb02d055669f0d37aaffc165444aa723741e9e9a74c1e17c54b53e635e4b7246d8ec582bfb951710ff02cd2d26d5565811182464f3f42728c1f346d0e699f8a + metro-resolver: 0.82.5 + checksum: f6f0c91240ad4ff2ebd61e5cb23f433309fc82e8042e240da1347f8edf61cc6b893bd176cabecad0dc91d214dd315d501af21cb518459aeb0ed613881619b583 languageName: node linkType: hard -"metro-file-map@npm:0.81.5": - version: 0.81.5 - resolution: "metro-file-map@npm:0.81.5" +"metro-file-map@npm:0.82.5": + version: 0.82.5 + resolution: "metro-file-map@npm:0.82.5" dependencies: - debug: ^2.2.0 + debug: ^4.4.0 fb-watchman: ^2.0.0 flow-enums-runtime: ^0.0.6 graceful-fs: ^4.2.4 @@ -10440,76 +10357,76 @@ __metadata: micromatch: ^4.0.4 nullthrows: ^1.1.1 walker: ^1.0.7 - checksum: dcc975a6a3a0ceaf25048cca834d6b065b719b768f332c2a720d6a0341b6b640783625d1188dc1b85204e42420853240fa0419988bade2395ce3c054079c3b65 + checksum: 46bda99f0ae892071c1b48b09f884f017f48d564c30b2a1f858f6fae1c6c1848bbbce20f66a5be086d7e0acfec3d8c1ddbf69699aaf2829f10954ae39d8a27d7 languageName: node linkType: hard -"metro-minify-terser@npm:0.81.5": - version: 0.81.5 - resolution: "metro-minify-terser@npm:0.81.5" +"metro-minify-terser@npm:0.82.5": + version: 0.82.5 + resolution: "metro-minify-terser@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 terser: ^5.15.0 - checksum: 4623743676e2bb8bb74b99bd2b2c26feb2509a8db5596f265e21042b43e84611f9025977ae298b8271644cb27e8da8a60b8dff791f57517b4bd2f5ae366f2945 + checksum: 754c150f0928460e1254e90e4e11bd87e069a0b286d21906758cb71fb8b4ec50dc8f78337bf8a9f8a28ddbd34230f5c66dad0fecf18dbe49715bf1300e5318c2 languageName: node linkType: hard -"metro-resolver@npm:0.81.5": - version: 0.81.5 - resolution: "metro-resolver@npm:0.81.5" +"metro-resolver@npm:0.82.5": + version: 0.82.5 + resolution: "metro-resolver@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 - checksum: 84d9f3c10538a747c2718ddc1cf366c38b1a6080e2b6cdfd4731511e5a25cec45fbf35101fae8691bda59fd2e9aa3f559d436bc46e05b603c446072e4a1bc6e9 + checksum: d1f7b57687c9cbb100114474689fee2fcfb86428a1228499b28391d16378573ac0f07c750874a2d75eabe237d67eb32a5c947bbbd70cd851885f1f6b13992472 languageName: node linkType: hard -"metro-runtime@npm:0.81.5, metro-runtime@npm:^0.81.3": - version: 0.81.5 - resolution: "metro-runtime@npm:0.81.5" +"metro-runtime@npm:0.82.5, metro-runtime@npm:^0.82.0": + version: 0.82.5 + resolution: "metro-runtime@npm:0.82.5" dependencies: "@babel/runtime": ^7.25.0 flow-enums-runtime: ^0.0.6 - checksum: 43b54e07ce0534928c12f59a3d2e68ecf4fc7e7ad1a78cb691f90a406796eec381af21fcef5af73ecc5081153a4da5f935797ebe9ea4a025a5e526039bf19b21 + checksum: 931c2b581ac1527899cfec6b9c4bbbac75545c78bf192abd8efddd4dbff481b052513857c8544507e7900e7c06f08a8da75e16c864cd86ec3a8c3d6c05738dae languageName: node linkType: hard -"metro-source-map@npm:0.81.5, metro-source-map@npm:^0.81.3": - version: 0.81.5 - resolution: "metro-source-map@npm:0.81.5" +"metro-source-map@npm:0.82.5, metro-source-map@npm:^0.82.0": + version: 0.82.5 + resolution: "metro-source-map@npm:0.82.5" dependencies: "@babel/traverse": ^7.25.3 "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3" "@babel/types": ^7.25.2 flow-enums-runtime: ^0.0.6 invariant: ^2.2.4 - metro-symbolicate: 0.81.5 + metro-symbolicate: 0.82.5 nullthrows: ^1.1.1 - ob1: 0.81.5 + ob1: 0.82.5 source-map: ^0.5.6 vlq: ^1.0.0 - checksum: a31e459c8a18fe3fc6b3cc5d87a2f25b2f3794425d590bbbab8abafa537647110b18edd0ff025971d1783e16d3c114099bf13c406a01a6456e3e004a54f621d8 + checksum: 1bb53abe636524593207c578bfd0e15f47f4e15db919793a49b89359726d043cd69107244b6e1c2c8194983b8df7faa8b56ffa73a5f81c0fefc0cc1727907177 languageName: node linkType: hard -"metro-symbolicate@npm:0.81.5": - version: 0.81.5 - resolution: "metro-symbolicate@npm:0.81.5" +"metro-symbolicate@npm:0.82.5": + version: 0.82.5 + resolution: "metro-symbolicate@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 invariant: ^2.2.4 - metro-source-map: 0.81.5 + metro-source-map: 0.82.5 nullthrows: ^1.1.1 source-map: ^0.5.6 vlq: ^1.0.0 bin: metro-symbolicate: src/index.js - checksum: f1ec6df153be8b469c87179dcc0807e6e94e2523140e0b0044aa2fecedfd222f9d05a408bd142d3293e52e9c7ef59064332fce5f489cddb0f38d11d3ed897c2b + checksum: ae91be09cca42567ea3c2bee695e0db42512fc8bf28cf2aa281ae8043edc3bbddcadd0793b401b6bcb7e0cc1df1428647662462a8f515ab6c47420421b1e96f8 languageName: node linkType: hard -"metro-transform-plugins@npm:0.81.5": - version: 0.81.5 - resolution: "metro-transform-plugins@npm:0.81.5" +"metro-transform-plugins@npm:0.82.5": + version: 0.82.5 + resolution: "metro-transform-plugins@npm:0.82.5" dependencies: "@babel/core": ^7.25.2 "@babel/generator": ^7.25.0 @@ -10517,34 +10434,34 @@ __metadata: "@babel/traverse": ^7.25.3 flow-enums-runtime: ^0.0.6 nullthrows: ^1.1.1 - checksum: 2d156882c6545730638aeb362856288649e5049f336d532040dd4b9435ad53d35adbc808903f01519dfda5e7a9a1d80b6f2303171921f32aa823f86484ab2b60 + checksum: 891838d529df2c3170614de9e55025d37fb799a8d444d9e898fc203496ec33620ad8066e0ab06244b7abb806ffdae4728b84047d0d01bceee877ea5d69240d04 languageName: node linkType: hard -"metro-transform-worker@npm:0.81.5": - version: 0.81.5 - resolution: "metro-transform-worker@npm:0.81.5" +"metro-transform-worker@npm:0.82.5": + version: 0.82.5 + resolution: "metro-transform-worker@npm:0.82.5" dependencies: "@babel/core": ^7.25.2 "@babel/generator": ^7.25.0 "@babel/parser": ^7.25.3 "@babel/types": ^7.25.2 flow-enums-runtime: ^0.0.6 - metro: 0.81.5 - metro-babel-transformer: 0.81.5 - metro-cache: 0.81.5 - metro-cache-key: 0.81.5 - metro-minify-terser: 0.81.5 - metro-source-map: 0.81.5 - metro-transform-plugins: 0.81.5 + metro: 0.82.5 + metro-babel-transformer: 0.82.5 + metro-cache: 0.82.5 + metro-cache-key: 0.82.5 + metro-minify-terser: 0.82.5 + metro-source-map: 0.82.5 + metro-transform-plugins: 0.82.5 nullthrows: ^1.1.1 - checksum: 59d144c44e7979317ee702a0f11da19443e5bf56a4fb6be026e4e09377631a2704ca4aba4e7290711fbe481176e82006fe195a18cacd6007f01c6b1ebe2a7a84 + checksum: 653868f5fc525ad5b36181e7d1b3bb893c49ce6647791c21b585dd29cccc2f00e68d66b16e00eeb385fcb0c5f205a713aba0fe57971b1ab2bf150938cb820aaa languageName: node linkType: hard -"metro@npm:0.81.5, metro@npm:^0.81.3": - version: 0.81.5 - resolution: "metro@npm:0.81.5" +"metro@npm:0.82.5, metro@npm:^0.82.0": + version: 0.82.5 + resolution: "metro@npm:0.82.5" dependencies: "@babel/code-frame": ^7.24.7 "@babel/core": ^7.25.2 @@ -10557,28 +10474,28 @@ __metadata: chalk: ^4.0.0 ci-info: ^2.0.0 connect: ^3.6.5 - debug: ^2.2.0 + debug: ^4.4.0 error-stack-parser: ^2.0.6 flow-enums-runtime: ^0.0.6 graceful-fs: ^4.2.4 - hermes-parser: 0.25.1 + hermes-parser: 0.29.1 image-size: ^1.0.2 invariant: ^2.2.4 jest-worker: ^29.7.0 jsc-safe-url: ^0.2.2 lodash.throttle: ^4.1.1 - metro-babel-transformer: 0.81.5 - metro-cache: 0.81.5 - metro-cache-key: 0.81.5 - metro-config: 0.81.5 - metro-core: 0.81.5 - metro-file-map: 0.81.5 - metro-resolver: 0.81.5 - metro-runtime: 0.81.5 - metro-source-map: 0.81.5 - metro-symbolicate: 0.81.5 - metro-transform-plugins: 0.81.5 - metro-transform-worker: 0.81.5 + metro-babel-transformer: 0.82.5 + metro-cache: 0.82.5 + metro-cache-key: 0.82.5 + metro-config: 0.82.5 + metro-core: 0.82.5 + metro-file-map: 0.82.5 + metro-resolver: 0.82.5 + metro-runtime: 0.82.5 + metro-source-map: 0.82.5 + metro-symbolicate: 0.82.5 + metro-transform-plugins: 0.82.5 + metro-transform-worker: 0.82.5 mime-types: ^2.1.27 nullthrows: ^1.1.1 serialize-error: ^2.1.0 @@ -10588,11 +10505,11 @@ __metadata: yargs: ^17.6.2 bin: metro: src/cli.js - checksum: 7665b811aa09abe5c7743764402f03cf64ccb3e1b381a46716470b58b05a952dde45e5e34c6a485f79154e2905b89fc178455c378831f9425767d76392418f9f + checksum: 391411e1be9463f4d52e804f0a9680e59be1cfc5c76ca890f3a9e9c014561da65bbf6e3ccc44f7f52601add064b3b70862b3813c963384a0df2218a345a304e5 languageName: node linkType: hard -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.7, micromatch@npm:^4.0.8": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -10616,7 +10533,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.19, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -11003,13 +10920,6 @@ __metadata: languageName: node linkType: hard -"neo-async@npm:^2.5.0": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 - languageName: node - linkType: hard - "nocache@npm:^3.0.1": version: 3.0.4 resolution: "nocache@npm:3.0.4" @@ -11038,13 +10948,6 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 - languageName: node - linkType: hard - "node-gyp@npm:^5.0.2, node-gyp@npm:^5.1.1": version: 5.1.1 resolution: "node-gyp@npm:5.1.1" @@ -11497,12 +11400,12 @@ __metadata: languageName: node linkType: hard -"ob1@npm:0.81.5": - version: 0.81.5 - resolution: "ob1@npm:0.81.5" +"ob1@npm:0.82.5": + version: 0.82.5 + resolution: "ob1@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 - checksum: 249ad576be69151a3099207b35b2f6da5c6bb39dfacb9295028ebdc182c2f61f6544d1f6f167af759a77174ab19d8997d1ae6aecdbd9bdc293b2826067e66c5b + checksum: 3faa161e5b5307188b6bbbf7e21727b1e434b8f6c31c51386808b2efd5e7238cf85a7ce71416d9a3f073625afb5a2212f80ec267996dc88fe086944adbb525d9 languageName: node linkType: hard @@ -12046,7 +11949,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -12074,14 +11977,7 @@ __metadata: languageName: node linkType: hard -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 9c4e34278cb09987685fa5ef81499c82546c033713518f6441778fbec623fc708777fe8ac633097c72d88470d5963094076c7305cafc7ad340aae27cfacd856b - languageName: node - linkType: hard - -"pirates@npm:^4.0.4, pirates@npm:^4.0.6": +"pirates@npm:^4.0.4": version: 4.0.7 resolution: "pirates@npm:4.0.7" checksum: 3dcbaff13c8b5bc158416feb6dc9e49e3c6be5fddc1ea078a05a73ef6b85d79324bbb1ef59b954cdeff000dbf000c1d39f32dc69310c7b78fbada5171b583e40 @@ -12099,15 +11995,6 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^3.0.0": - version: 3.0.0 - resolution: "pkg-dir@npm:3.0.0" - dependencies: - find-up: ^3.0.0 - checksum: 70c9476ffefc77552cc6b1880176b71ad70bfac4f367604b2b04efd19337309a4eec985e94823271c7c0e83946fa5aeb18cd360d15d10a5d7533e19344bfa808 - languageName: node - linkType: hard - "pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -12418,6 +12305,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: ^1.0.6 + checksum: e9404dc0fc2849245107108ce9ec2766cde3be1b271de0bf1021d049dc5b98d1a2901e67b431ac5509f865420a7ed80b7acb3980099fe1c118a1c5d2e1432ad8 + languageName: node + linkType: hard + "qs@npm:~6.5.2": version: 6.5.3 resolution: "qs@npm:6.5.3" @@ -12467,6 +12363,18 @@ __metadata: languageName: node linkType: hard +"raw-body@npm:2.5.2": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + checksum: ba1583c8d8a48e8fbb7a873fdbb2df66ea4ff83775421bfe21ee120140949ab048200668c47d9ae3880012f6e217052690628cf679ddfbd82c9fc9358d574676 + languageName: node + linkType: hard + "rc@npm:^1.0.1, rc@npm:^1.1.6": version: 1.2.8 resolution: "rc@npm:1.2.8" @@ -12481,7 +12389,7 @@ __metadata: languageName: node linkType: hard -"react-devtools-core@npm:^6.0.1": +"react-devtools-core@npm:^6.1.1": version: 6.1.5 resolution: "react-devtools-core@npm:6.1.5" dependencies: @@ -12622,15 +12530,15 @@ __metadata: "@babel/preset-env": ^7.25.3 "@babel/runtime": ^7.25.0 "@babel/types": 7.25.0 - "@react-native-community/cli": 15.1.0 - "@react-native-community/cli-platform-android": 15.1.0 - "@react-native-community/cli-platform-ios": 15.1.0 + "@react-native-community/cli": 18.0.0 + "@react-native-community/cli-platform-android": 18.0.0 + "@react-native-community/cli-platform-ios": 18.0.0 "@react-native-community/datetimepicker": ^8.2.0 "@react-native-community/netinfo": ^11.4.1 - "@react-native/babel-preset": 0.78.3 - "@react-native/eslint-config": 0.78.3 - "@react-native/metro-config": 0.78.3 - "@react-native/typescript-config": 0.78.3 + "@react-native/babel-preset": 0.79.7 + "@react-native/eslint-config": 0.79.7 + "@react-native/metro-config": 0.79.7 + "@react-native/typescript-config": 0.79.7 "@testing-library/jest-native": ^5.4.2 "@testing-library/react-native": ^13.0.1 "@types/hoist-non-react-statics": ^3.3.6 @@ -12662,7 +12570,7 @@ __metadata: prop-types: 15.x.x react: 19.0.0 react-lifecycles-compat: ^3.0.4 - react-native: 0.78.3 + react-native: 0.79.7 react-native-fast-image: ^8.6.3 react-native-gesture-handler: ^2.22.1 react-native-monorepo-config: ^0.3.0 @@ -12693,15 +12601,15 @@ __metadata: "@babel/preset-env": ^7.25.3 "@babel/runtime": ^7.25.0 "@babel/types": 7.25.0 - "@react-native-community/cli": 15.1.0 - "@react-native-community/cli-platform-android": 15.1.0 - "@react-native-community/cli-platform-ios": 15.1.0 + "@react-native-community/cli": 18.0.0 + "@react-native-community/cli-platform-android": 18.0.0 + "@react-native-community/cli-platform-ios": 18.0.0 "@react-native-community/datetimepicker": ^8.2.0 "@react-native-community/netinfo": ^11.4.1 - "@react-native/babel-preset": 0.78.3 - "@react-native/eslint-config": 0.78.3 - "@react-native/metro-config": 0.78.3 - "@react-native/typescript-config": 0.78.3 + "@react-native/babel-preset": 0.79.7 + "@react-native/eslint-config": 0.79.7 + "@react-native/metro-config": 0.79.7 + "@react-native/typescript-config": 0.79.7 "@testing-library/jest-native": ^5.4.2 "@testing-library/react-native": ^13.0.1 "@types/hoist-non-react-statics": ^3.3.6 @@ -12733,7 +12641,7 @@ __metadata: prop-types: 15.x.x react: 19.0.0 react-lifecycles-compat: ^3.0.4 - react-native: 0.78.3 + react-native: 0.79.7 react-native-builder-bob: ^0.40.13 react-native-fast-image: ^8.6.3 react-native-gesture-handler: ^2.22.1 @@ -12802,18 +12710,18 @@ __metadata: languageName: node linkType: hard -"react-native@npm:0.78.3": - version: 0.78.3 - resolution: "react-native@npm:0.78.3" +"react-native@npm:0.79.7": + version: 0.79.7 + resolution: "react-native@npm:0.79.7" dependencies: - "@jest/create-cache-key-function": ^29.6.3 - "@react-native/assets-registry": 0.78.3 - "@react-native/codegen": 0.78.3 - "@react-native/community-cli-plugin": 0.78.3 - "@react-native/gradle-plugin": 0.78.3 - "@react-native/js-polyfills": 0.78.3 - "@react-native/normalize-colors": 0.78.3 - "@react-native/virtualized-lists": 0.78.3 + "@jest/create-cache-key-function": ^29.7.0 + "@react-native/assets-registry": 0.79.7 + "@react-native/codegen": 0.79.7 + "@react-native/community-cli-plugin": 0.79.7 + "@react-native/gradle-plugin": 0.79.7 + "@react-native/js-polyfills": 0.79.7 + "@react-native/normalize-colors": 0.79.7 + "@react-native/virtualized-lists": 0.79.7 abort-controller: ^3.0.0 anser: ^1.4.9 ansi-regex: ^5.0.0 @@ -12826,14 +12734,14 @@ __metadata: flow-enums-runtime: ^0.0.6 glob: ^7.1.1 invariant: ^2.2.4 - jest-environment-node: ^29.6.3 + jest-environment-node: ^29.7.0 memoize-one: ^5.0.0 - metro-runtime: ^0.81.3 - metro-source-map: ^0.81.3 + metro-runtime: ^0.82.0 + metro-source-map: ^0.82.0 nullthrows: ^1.1.1 pretty-format: ^29.7.0 promise: ^8.3.0 - react-devtools-core: ^6.0.1 + react-devtools-core: ^6.1.1 react-refresh: ^0.14.0 regenerator-runtime: ^0.13.2 scheduler: 0.25.0 @@ -12850,7 +12758,7 @@ __metadata: optional: true bin: react-native: cli.js - checksum: 58fa0fa7338e25b3214ad20f97966f2da5be650f8de0615c07beef6cb4f4788405cc4f0cb0f7d3a5013eac7df166fe5d05a6056704e1a6cf6654682a74e4596a + checksum: f00501d0b86c009be18cbeeddd554ff3b31b4681c6748b6eab94e74143726cd285fd45909742eabe5fe3bceb089e321d9e96e0fc5ea5327016dc66fc3ec5d27f languageName: node linkType: hard @@ -13008,13 +12916,6 @@ __metadata: languageName: node linkType: hard -"readline@npm:^1.3.0": - version: 1.3.0 - resolution: "readline@npm:1.3.0" - checksum: dfaf8e6ac20408ea00d650e95f7bb47f77c4c62dd12ed7fb51731ee84532a2f3675fcdc4cab4923dc1eef227520a2e082a093215190907758bea9f585b19438e - languageName: node - linkType: hard - "reanimated-color-picker@npm:^3.0.6": version: 3.0.6 resolution: "reanimated-color-picker@npm:3.0.6" @@ -13031,19 +12932,6 @@ __metadata: languageName: node linkType: hard -"recast@npm:^0.23.11": - version: 0.23.11 - resolution: "recast@npm:0.23.11" - dependencies: - ast-types: ^0.16.1 - esprima: ~4.0.0 - source-map: ~0.6.1 - tiny-invariant: ^1.3.3 - tslib: ^2.0.1 - checksum: 1807159b1c33bc4a2d146e4ffea13b658e54bdcfab04fc4f9c9d7f1b4626c931e2ce41323e214516ec1e02a119037d686d825fc62f28072db27962b85e5b481d - languageName: node - linkType: hard - "redent@npm:^3.0.0": version: 3.0.0 resolution: "redent@npm:3.0.0" @@ -13579,16 +13467,6 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.4.1": - version: 2.4.1 - resolution: "selfsigned@npm:2.4.1" - dependencies: - "@types/node-forge": ^1.3.0 - node-forge: ^1 - checksum: 38b91c56f1d7949c0b77f9bbe4545b19518475cae15e7d7f0043f87b1626710b011ce89879a88969651f650a19d213bb15b7d5b4c2877df9eeeff7ba8f8b9bfa - languageName: node - linkType: hard - "semver-compare@npm:^1.0.0": version: 1.0.0 resolution: "semver-compare@npm:1.0.0" @@ -13757,15 +13635,6 @@ __metadata: languageName: node linkType: hard -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" - dependencies: - kind-of: ^6.0.2 - checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 - languageName: node - linkType: hard - "shebang-command@npm:^1.2.0": version: 1.2.0 resolution: "shebang-command@npm:1.2.0" @@ -13798,7 +13667,7 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.6.1, shell-quote@npm:^1.7.2, shell-quote@npm:^1.7.3": +"shell-quote@npm:^1.6.1, shell-quote@npm:^1.7.2, shell-quote@npm:^1.8.3": version: 1.8.3 resolution: "shell-quote@npm:1.8.3" checksum: 550dd84e677f8915eb013d43689c80bb114860649ec5298eb978f40b8f3d4bc4ccb072b82c094eb3548dc587144bb3965a8676f0d685c1cf4c40b5dc27166242 @@ -13849,7 +13718,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.1.0": +"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": version: 1.1.0 resolution: "side-channel@npm:1.1.0" dependencies: @@ -14017,7 +13886,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:^0.5.16, source-map-support@npm:~0.5.20": +"source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -14034,7 +13903,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 @@ -14534,13 +14403,6 @@ __metadata: languageName: node linkType: hard -"sudo-prompt@npm:^9.0.0": - version: 9.2.1 - resolution: "sudo-prompt@npm:9.2.1" - checksum: 50a29eec2f264f2b78d891452a64112d839a30bffbff4ec065dba4af691a35b23cdb8f9107d413e25c1a9f1925644a19994c00602495cab033d53f585fdfd665 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -14698,13 +14560,6 @@ __metadata: languageName: node linkType: hard -"tiny-invariant@npm:^1.3.3": - version: 1.3.3 - resolution: "tiny-invariant@npm:1.3.3" - checksum: 5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe - languageName: node - linkType: hard - "tiny-relative-date@npm:^1.3.0": version: 1.3.0 resolution: "tiny-relative-date@npm:1.3.0" @@ -14731,7 +14586,7 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.1, tmp@npm:^0.2.3": +"tmp@npm:^0.2.1": version: 0.2.5 resolution: "tmp@npm:0.2.5" checksum: 9d18e58060114154939930457b9e198b34f9495bcc05a343bc0a0a29aa546d2c1c2b343dae05b87b17c8fde0af93ab7d8fe8574a8f6dc2cd8fd3f2ca1ad0d8e1 @@ -14844,7 +14699,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.5.3": +"tslib@npm:^2.5.3": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a @@ -14922,6 +14777,16 @@ __metadata: languageName: node linkType: hard +"type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: 0.3.0 + mime-types: ~2.1.24 + checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657 + languageName: node + linkType: hard + "typed-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-buffer@npm:1.0.3" @@ -15156,7 +15021,7 @@ __metadata: languageName: node linkType: hard -"unpipe@npm:~1.0.0": +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 @@ -15622,16 +15487,6 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^5.0.1": - version: 5.0.1 - resolution: "write-file-atomic@npm:5.0.1" - dependencies: - imurmurhash: ^0.1.4 - signal-exit: ^4.0.1 - checksum: 8dbb0e2512c2f72ccc20ccedab9986c7d02d04039ed6e8780c987dc4940b793339c50172a1008eed7747001bfacc0ca47562668a069a7506c46c77d7ba3926a9 - languageName: node - linkType: hard - "ws@npm:^6.2.3": version: 6.2.3 resolution: "ws@npm:6.2.3" From e2432391171ff5f1ae014008634e276e9dca8b48 Mon Sep 17 00:00:00 2001 From: Georgy Steshin Date: Sun, 23 Nov 2025 13:34:04 +0200 Subject: [PATCH 09/36] Added new pipelines --- .buildkite/pipeline.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.buildkite/pipeline.sh b/.buildkite/pipeline.sh index 80a9c4bf75..cacf9cbe10 100755 --- a/.buildkite/pipeline.sh +++ b/.buildkite/pipeline.sh @@ -5,8 +5,10 @@ echo "steps:" cat .buildkite/jobs/pipeline.release.yml cat .buildkite/jobs/pipeline.android_rn_77.yml cat .buildkite/jobs/pipeline.android_rn_78.yml +cat .buildkite/jobs/pipeline.android_rn_79.yml cat .buildkite/jobs/pipeline.ios_rn_77.yml cat .buildkite/jobs/pipeline.ios_rn_78.yml +cat .buildkite/jobs/pipeline.ios_rn_79.yml cat .buildkite/jobs/pipeline.publish.yml From 8fe69af1ab375601ed74f04af259fd4d838a2d0b Mon Sep 17 00:00:00 2001 From: Georgy Steshin Date: Sun, 23 Nov 2025 13:34:17 +0200 Subject: [PATCH 10/36] Added new pipelines --- .buildkite/jobs/pipeline.android_rn_79.yml | 13 +++++++++++++ .buildkite/jobs/pipeline.ios_rn_79.yml | 12 ++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 .buildkite/jobs/pipeline.android_rn_79.yml create mode 100644 .buildkite/jobs/pipeline.ios_rn_79.yml diff --git a/.buildkite/jobs/pipeline.android_rn_79.yml b/.buildkite/jobs/pipeline.android_rn_79.yml new file mode 100644 index 0000000000..5ebc3e76b4 --- /dev/null +++ b/.buildkite/jobs/pipeline.android_rn_79.yml @@ -0,0 +1,13 @@ + - label: ":android: Android (RN 0.79.0)" + env: + JAVA_HOME: /opt/openjdk/jdk-17.0.9.jdk/Contents/Home/ + REACT_NATIVE_VERSION: 0.79.0 + command: + - "nvm install" + - "./scripts/ci.android.sh" + key: "android_rn_79" + timeout_in_minutes: 90 + artifact_paths: "/Users/builder/uibuilder/work/playground/artifacts/**/*" + + + diff --git a/.buildkite/jobs/pipeline.ios_rn_79.yml b/.buildkite/jobs/pipeline.ios_rn_79.yml new file mode 100644 index 0000000000..470635e7e2 --- /dev/null +++ b/.buildkite/jobs/pipeline.ios_rn_79.yml @@ -0,0 +1,12 @@ + - label: ":ios: iOS (RN 0.79.0)" + env: + REACT_NATIVE_VERSION: 0.79.0 + command: + - "nvm install" + - "./scripts/ci.ios.sh" + key: "ios_rn_79" + timeout_in_minutes: 90 + artifact_paths: "/Users/builder/uibuilder/work/playground/artifacts/**/*" + + + From 9e4ddcbee256c17bffa0a94f8bd4c67f5cef2b1c Mon Sep 17 00:00:00 2001 From: Georgy Steshin Date: Sun, 23 Nov 2025 13:43:14 +0200 Subject: [PATCH 11/36] Disable autolink test --- scripts/ci.android.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci.android.sh b/scripts/ci.android.sh index f07373008f..2e5c5fce20 100755 --- a/scripts/ci.android.sh +++ b/scripts/ci.android.sh @@ -4,7 +4,7 @@ set -euo pipefail # JS tests yarn run test-js -yarn run test-autolink +#yarn run test-autolink # Android unit tests yarn run test-unit-android -- --release From f7aa449e95d5d963972db1f361a7a203628dc83c Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 13:46:56 +0200 Subject: [PATCH 12/36] device downgrade --- playground/e2e/detox.config.js | 4 ++-- scripts/test-unit.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/playground/e2e/detox.config.js b/playground/e2e/detox.config.js index 963f0e7c6d..8b020b7569 100644 --- a/playground/e2e/detox.config.js +++ b/playground/e2e/detox.config.js @@ -21,8 +21,8 @@ const config = { simulator: { type: 'ios.simulator', device: { - type: 'iPhone 16 Pro Max', - os: '18.5', + type: 'iPhone 13 Pro Max', + os: '15.5', }, }, emulator: { diff --git a/scripts/test-unit.js b/scripts/test-unit.js index df4d7025cc..4546cd9ac4 100644 --- a/scripts/test-unit.js +++ b/scripts/test-unit.js @@ -25,7 +25,7 @@ function runAndroidUnitTests() { function runIosUnitTests() { exec.execSync('yarn run pod-install'); - testTarget('playground', 'iPhone 16 Pro Max', '18.5'); + testTarget('playground', 'iPhone 13', '15.5'); } function testTarget(scheme, device, OS = 'latest') { From 7237a29865e8becd017c42c665be59b32e1e255f Mon Sep 17 00:00:00 2001 From: Georgy Steshin Date: Sun, 23 Nov 2025 13:49:31 +0200 Subject: [PATCH 13/36] Disabled tests --- scripts/ci.android.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/ci.android.sh b/scripts/ci.android.sh index 2e5c5fce20..cf36afa936 100755 --- a/scripts/ci.android.sh +++ b/scripts/ci.android.sh @@ -3,8 +3,7 @@ set -euo pipefail ./scripts/ci.sh # JS tests -yarn run test-js -#yarn run test-autolink +#yarn run test-js # Android unit tests yarn run test-unit-android -- --release From 50c2ce9a018f850e92eac76aae28030c93079abf Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 14:14:04 +0200 Subject: [PATCH 14/36] script update --- .../__helpers__/reactNativeVersion.js | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/autolink/postlink/__helpers__/reactNativeVersion.js b/autolink/postlink/__helpers__/reactNativeVersion.js index b0be09b3e1..936acc0f39 100644 --- a/autolink/postlink/__helpers__/reactNativeVersion.js +++ b/autolink/postlink/__helpers__/reactNativeVersion.js @@ -10,6 +10,33 @@ var { warnn } = require('../log'); function findProjectPackageJson() { var searchDirs = [process.cwd(), __dirname]; + // If we're inside a package (like in node_modules or a workspace), + // also try searching from common project locations + var currentPath = __dirname; + for (var k = 0; k < 10; k++) { + var basename = nodePath.basename(currentPath); + + // If we're in node_modules, the parent is likely the project root + if (basename === 'node_modules') { + searchDirs.push(nodePath.dirname(currentPath)); + break; + } + + // If we find a workspace scenario (e.g., we're in the workspace root but project is in subdirectory) + // Check for common subdirectories like 'playground', 'example', 'app' + var commonProjectDirs = ['playground', 'example', 'app', 'demo']; + for (var m = 0; m < commonProjectDirs.length; m++) { + var potentialProjectDir = nodePath.join(currentPath, commonProjectDirs[m]); + if (fs.existsSync(potentialProjectDir)) { + searchDirs.push(potentialProjectDir); + } + } + + var parent = nodePath.dirname(currentPath); + if (parent === currentPath) break; + currentPath = parent; + } + for (var j = 0; j < searchDirs.length; j++) { var searchDir = searchDirs[j]; for (var i = 0; i < 10; i++) { @@ -19,7 +46,11 @@ function findProjectPackageJson() { var pkg = JSON.parse(fs.readFileSync(packagePath, 'utf8')); if ((pkg.dependencies && pkg.dependencies['react-native']) || (pkg.devDependencies && pkg.devDependencies['react-native'])) { - return packagePath; + // Exclude react-native-navigation's own package.json to avoid false positives + // in workspace/monorepo scenarios + if (pkg.name !== 'react-native-navigation') { + return packagePath; + } } } catch (e) { } } From 9b9d60ab6ed0738a445cd08e89b4f22c3cae24dd Mon Sep 17 00:00:00 2001 From: Georgy Steshin Date: Sun, 23 Nov 2025 14:49:11 +0200 Subject: [PATCH 15/36] Rename .java to .kt --- .../{TestApplication.java => TestApplication.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename android/src/test/java/com/reactnativenavigation/{TestApplication.java => TestApplication.kt} (100%) diff --git a/android/src/test/java/com/reactnativenavigation/TestApplication.java b/android/src/test/java/com/reactnativenavigation/TestApplication.kt similarity index 100% rename from android/src/test/java/com/reactnativenavigation/TestApplication.java rename to android/src/test/java/com/reactnativenavigation/TestApplication.kt From f1088c8e791aa612e691f69af11ab615ad31329a Mon Sep 17 00:00:00 2001 From: Georgy Steshin Date: Sun, 23 Nov 2025 14:49:13 +0200 Subject: [PATCH 16/36] Fixed roboletric tests --- .../reactnativenavigation/TestApplication.kt | 2 - .../reactnativenavigation/TestApplication.kt | 56 +++++++------------ .../playground/MainApplication.kt | 2 +- 3 files changed, 22 insertions(+), 38 deletions(-) diff --git a/android/src/androidTest/java/com/reactnativenavigation/TestApplication.kt b/android/src/androidTest/java/com/reactnativenavigation/TestApplication.kt index 4dd5bd4d84..81dfb7bfbc 100644 --- a/android/src/androidTest/java/com/reactnativenavigation/TestApplication.kt +++ b/android/src/androidTest/java/com/reactnativenavigation/TestApplication.kt @@ -3,10 +3,8 @@ package com.reactnativenavigation import com.facebook.react.ReactHost import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost import com.facebook.react.shell.MainReactPackage -import com.reactnativenavigation.NavigationPackage import com.reactnativenavigation.react.NavigationReactNativeHost class TestApplication : NavigationApplication() { diff --git a/android/src/test/java/com/reactnativenavigation/TestApplication.kt b/android/src/test/java/com/reactnativenavigation/TestApplication.kt index 854638cd40..5a359b4666 100644 --- a/android/src/test/java/com/reactnativenavigation/TestApplication.kt +++ b/android/src/test/java/com/reactnativenavigation/TestApplication.kt @@ -1,43 +1,29 @@ -package com.reactnativenavigation; - -import android.app.Application; - -import com.facebook.react.ReactApplication; -import com.facebook.react.ReactHost; -import com.facebook.react.ReactNativeHost; -import com.facebook.react.ReactPackage; -import com.facebook.react.defaults.DefaultReactHost; - -import java.util.Collections; -import java.util.List; - - -public class TestApplication extends Application implements ReactApplication { - private final ReactNativeHost host = new ReactNativeHost(this) { - @Override - public boolean getUseDeveloperSupport() { - return true; +package com.reactnativenavigation + +import android.app.Application +import androidx.appcompat.R +import com.facebook.react.ReactApplication +import com.facebook.react.ReactHost +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost + +class TestApplication : Application(), ReactApplication { + override val reactNativeHost: ReactNativeHost = object : ReactNativeHost(this) { + override fun getUseDeveloperSupport(): Boolean { + return true } - @Override - protected List getPackages() { - return Collections.emptyList(); + override fun getPackages(): MutableList { + return mutableListOf() } - }; - - @Override - public void onCreate() { - super.onCreate(); - setTheme(androidx.appcompat.R.style.Theme_AppCompat); } - @Override - public ReactNativeHost getReactNativeHost() { - return host; + override fun onCreate() { + super.onCreate() + setTheme(R.style.Theme_AppCompat) } - @Override - public ReactHost getReactHost() { - return DefaultReactHost.getDefaultReactHost(this, getReactNativeHost()); - } + override val reactHost: ReactHost + get() = getDefaultReactHost(this, reactNativeHost) } diff --git a/playground/android/app/src/main/java/com/reactnativenavigation/playground/MainApplication.kt b/playground/android/app/src/main/java/com/reactnativenavigation/playground/MainApplication.kt index b03247a938..73e9ed4a17 100644 --- a/playground/android/app/src/main/java/com/reactnativenavigation/playground/MainApplication.kt +++ b/playground/android/app/src/main/java/com/reactnativenavigation/playground/MainApplication.kt @@ -41,7 +41,7 @@ class MainApplication : NavigationApplication(mapOf( super.onCreate() registerExternalComponent("RNNCustomComponent", FragmentCreator()) } - override val reactHost: ReactHost get() = getDefaultReactHost(this, reactNativeHost) + } From 1d16653a27634666002df60c5b98b48fa7257bd4 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 15:00:42 +0200 Subject: [PATCH 17/36] update scripts --- .../__helpers__/generate_version_header.js | 17 +++++++++-------- .../postlink/__helpers__/reactNativeVersion.js | 6 +++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/autolink/postlink/__helpers__/generate_version_header.js b/autolink/postlink/__helpers__/generate_version_header.js index a8845b08fe..55d812a8f6 100644 --- a/autolink/postlink/__helpers__/generate_version_header.js +++ b/autolink/postlink/__helpers__/generate_version_header.js @@ -6,16 +6,17 @@ const { getReactNativeVersion, findProjectPackageJson } = require('./reactNative function generateVersionHeader() { const startDir = __dirname; - console.log(`Searching for project package.json from: ${startDir}`); + console.error(`[RNN] Searching for project package.json from: ${startDir}`); + console.error(`[RNN] process.cwd(): ${process.cwd()}`); const packageJsonPath = findProjectPackageJson(); if (!packageJsonPath) { - console.log('Warning: Project package.json not found'); + console.error('[RNN] ERROR: Project package.json not found'); return; } - console.log(`Using package.json: ${packageJsonPath}`); + console.error(`[RNN] Using package.json: ${packageJsonPath}`); // Determine actual source of version const projectRoot = path.dirname(packageJsonPath); @@ -31,11 +32,11 @@ function generateVersionHeader() { const versionInfo = getReactNativeVersion(); if (!versionInfo) { - console.log('Warning: react-native not found in package.json'); + console.error('[RNN] ERROR: react-native not found in package.json'); return; } - console.log(`Found React Native version: ${versionInfo.raw} from ${versionSourceType}`); + console.error(`[RNN] Found React Native version: ${versionInfo.raw} from ${versionSourceType}`); const { major, minor, patch } = versionInfo; @@ -79,15 +80,15 @@ function generateVersionHeader() { } if (!rnnPackageJson) { - console.log('Warning: Could not find react-native-navigation root'); + console.error('[RNN] ERROR: Could not find react-native-navigation root'); return; } const outputFile = path.join(rnnPackageJson, 'ios/ReactNativeVersionExtracted.h'); fs.writeFileSync(outputFile, headerContent, 'utf8'); - console.log(`✅ Generated ${outputFile}`); - console.log(` Version: ${major}.${minor}.${patch}`); + console.error(`[RNN] ✅ Generated ${outputFile}`); + console.error(`[RNN] Version: ${major}.${minor}.${patch}`); } // Run if called directly diff --git a/autolink/postlink/__helpers__/reactNativeVersion.js b/autolink/postlink/__helpers__/reactNativeVersion.js index 936acc0f39..b103c3cb47 100644 --- a/autolink/postlink/__helpers__/reactNativeVersion.js +++ b/autolink/postlink/__helpers__/reactNativeVersion.js @@ -15,13 +15,13 @@ function findProjectPackageJson() { var currentPath = __dirname; for (var k = 0; k < 10; k++) { var basename = nodePath.basename(currentPath); - + // If we're in node_modules, the parent is likely the project root if (basename === 'node_modules') { searchDirs.push(nodePath.dirname(currentPath)); break; } - + // If we find a workspace scenario (e.g., we're in the workspace root but project is in subdirectory) // Check for common subdirectories like 'playground', 'example', 'app' var commonProjectDirs = ['playground', 'example', 'app', 'demo']; @@ -31,7 +31,7 @@ function findProjectPackageJson() { searchDirs.push(potentialProjectDir); } } - + var parent = nodePath.dirname(currentPath); if (parent === currentPath) break; currentPath = parent; From 0525eb5199653b39e8463b01c2b59097de31ce64 Mon Sep 17 00:00:00 2001 From: Georgy Steshin Date: Sun, 23 Nov 2025 15:11:44 +0200 Subject: [PATCH 18/36] Reenable tests --- scripts/ci.android.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci.android.sh b/scripts/ci.android.sh index cf36afa936..3eac167325 100755 --- a/scripts/ci.android.sh +++ b/scripts/ci.android.sh @@ -3,7 +3,7 @@ set -euo pipefail ./scripts/ci.sh # JS tests -#yarn run test-js +yarn run test-js # Android unit tests yarn run test-unit-android -- --release From 3b74e9aeed4e58053d8aecec2c1db51124895ce7 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 16:14:58 +0200 Subject: [PATCH 19/36] update scripts --- .../__helpers__/generate_version_header.js | 36 ++++++++++++++----- .../__helpers__/reactNativeVersion.js | 30 +++++++++++++++- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/autolink/postlink/__helpers__/generate_version_header.js b/autolink/postlink/__helpers__/generate_version_header.js index 55d812a8f6..a062d83aa2 100644 --- a/autolink/postlink/__helpers__/generate_version_header.js +++ b/autolink/postlink/__helpers__/generate_version_header.js @@ -3,20 +3,36 @@ const fs = require('fs'); const path = require('path'); const { getReactNativeVersion, findProjectPackageJson } = require('./reactNativeVersion'); +// Logging helper that writes to both stderr and a log file +function log(message) { + console.error(message); + + // Also write to a log file for debugging if stderr is suppressed + try { + const logFile = path.join(__dirname, '../../../ios/rnn_version_detection.log'); + const timestamp = new Date().toISOString(); + fs.appendFileSync(logFile, `[${timestamp}] ${message}\n`, 'utf8'); + } catch (e) { + // Ignore log file errors + } +} + function generateVersionHeader() { const startDir = __dirname; - console.error(`[RNN] Searching for project package.json from: ${startDir}`); - console.error(`[RNN] process.cwd(): ${process.cwd()}`); + log(`[RNN] === React Native Version Detection ===`); + log(`[RNN] Script location (__dirname): ${startDir}`); + log(`[RNN] Working directory (cwd): ${process.cwd()}`); const packageJsonPath = findProjectPackageJson(); if (!packageJsonPath) { - console.error('[RNN] ERROR: Project package.json not found'); + log('[RNN] ❌ ERROR: Project package.json not found'); + log('[RNN] This usually means the script could not locate your React Native project.'); return; } - console.error(`[RNN] Using package.json: ${packageJsonPath}`); + log(`[RNN] ✓ Found package.json: ${packageJsonPath}`); // Determine actual source of version const projectRoot = path.dirname(packageJsonPath); @@ -32,11 +48,12 @@ function generateVersionHeader() { const versionInfo = getReactNativeVersion(); if (!versionInfo) { - console.error('[RNN] ERROR: react-native not found in package.json'); + log('[RNN] ❌ ERROR: react-native not found in package.json or node_modules'); + log('[RNN] Make sure react-native is installed and listed as a dependency.'); return; } - console.error(`[RNN] Found React Native version: ${versionInfo.raw} from ${versionSourceType}`); + log(`[RNN] ✓ React Native ${versionInfo.raw} (source: ${versionSourceType})`); const { major, minor, patch } = versionInfo; @@ -80,15 +97,16 @@ function generateVersionHeader() { } if (!rnnPackageJson) { - console.error('[RNN] ERROR: Could not find react-native-navigation root'); + log('[RNN] ❌ ERROR: Could not find react-native-navigation root directory'); return; } const outputFile = path.join(rnnPackageJson, 'ios/ReactNativeVersionExtracted.h'); fs.writeFileSync(outputFile, headerContent, 'utf8'); - console.error(`[RNN] ✅ Generated ${outputFile}`); - console.error(`[RNN] Version: ${major}.${minor}.${patch}`); + log(`[RNN] ✅ Generated header: ${outputFile}`); + log(`[RNN] ✅ Version constants: ${major}.${minor}.${patch}`); + log(`[RNN] === Completed Successfully ===`); } // Run if called directly diff --git a/autolink/postlink/__helpers__/reactNativeVersion.js b/autolink/postlink/__helpers__/reactNativeVersion.js index b103c3cb47..1daa63fa79 100644 --- a/autolink/postlink/__helpers__/reactNativeVersion.js +++ b/autolink/postlink/__helpers__/reactNativeVersion.js @@ -10,9 +10,37 @@ var { warnn } = require('../log'); function findProjectPackageJson() { var searchDirs = [process.cwd(), __dirname]; + // PRIORITY: Check if we're in RNN's own directory structure (workspace/CI scenario) + // In this case, __dirname would be like: /path/to/rnn/autolink/postlink/__helpers__ + // And we want to find: /path/to/rnn/playground/package.json + var currentPath = __dirname; + + // Walk up to find RNN root (containing this autolink folder) + for (var k = 0; k < 5; k++) { + // Check if this looks like RNN root by checking for playground subdirectory + var playgroundPath = nodePath.join(currentPath, 'playground'); + var playgroundPackageJson = nodePath.join(playgroundPath, 'package.json'); + + if (fs.existsSync(playgroundPackageJson)) { + try { + var pkg = JSON.parse(fs.readFileSync(playgroundPackageJson, 'utf8')); + if ((pkg.dependencies && pkg.dependencies['react-native']) || + (pkg.devDependencies && pkg.devDependencies['react-native'])) { + // Found it! Prioritize this path + searchDirs.unshift(playgroundPath); + break; + } + } catch (e) { } + } + + var parent = nodePath.dirname(currentPath); + if (parent === currentPath) break; + currentPath = parent; + } + // If we're inside a package (like in node_modules or a workspace), // also try searching from common project locations - var currentPath = __dirname; + currentPath = __dirname; for (var k = 0; k < 10; k++) { var basename = nodePath.basename(currentPath); From a666c063d663442878b3de54638ce55b10d8fc35 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 16:36:00 +0200 Subject: [PATCH 20/36] update podspec --- ReactNativeNavigation.podspec | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/ReactNativeNavigation.podspec b/ReactNativeNavigation.podspec index aadd551bce..c46c931b0d 100644 --- a/ReactNativeNavigation.podspec +++ b/ReactNativeNavigation.podspec @@ -1,27 +1,29 @@ require 'json' -require 'find' package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1' -# Detect if this is a Swift project by looking for user AppDelegate.swift files -start_dir = File.expand_path('../../', __dir__) -swift_delegate_path = nil -begin - Find.find(start_dir) do |path| - # Skip hidden directories and common directories that shouldn't be searched - Find.prune if path =~ /\/(\.git|\.Trash|node_modules|Pods|DerivedData|build)\b/ +# Detect if this is a Swift project by checking common iOS project locations +# This avoids the slow recursive Find.find() that can take minutes in CI +def check_for_swift_app_delegate(base_dir) + # Common project directory names to check + ['ios', 'example/ios', 'playground/ios', 'app/ios', 'demo/ios'].each do |ios_dir| + ios_path = File.join(base_dir, ios_dir) + next unless Dir.exist?(ios_path) - if path =~ /AppDelegate\.swift$/ - swift_delegate_path = path - break + # Check common AppDelegate.swift locations within ios directory + Dir.glob(File.join(ios_path, '**/AppDelegate.swift'), File::FNM_DOTMATCH).each do |path| + # Exclude Pods, build, and DerivedData directories + next if path =~ /\/(Pods|build|DerivedData)\// + return path if File.exist?(path) end end -rescue Errno::EACCES, Errno::EPERM - # Ignore permission errors + nil end +start_dir = File.expand_path('../../', __dir__) +swift_delegate_path = check_for_swift_app_delegate(start_dir) swift_project = swift_delegate_path && File.exist?(swift_delegate_path) # Debug output From 892ae02e09fb6ec057c703a78933c516fd7c5c48 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 16:40:46 +0200 Subject: [PATCH 21/36] and again --- ReactNativeNavigation.podspec | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/ReactNativeNavigation.podspec b/ReactNativeNavigation.podspec index c46c931b0d..c9c74a8a71 100644 --- a/ReactNativeNavigation.podspec +++ b/ReactNativeNavigation.podspec @@ -6,24 +6,26 @@ fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1' # Detect if this is a Swift project by checking common iOS project locations # This avoids the slow recursive Find.find() that can take minutes in CI -def check_for_swift_app_delegate(base_dir) - # Common project directory names to check - ['ios', 'example/ios', 'playground/ios', 'app/ios', 'demo/ios'].each do |ios_dir| - ios_path = File.join(base_dir, ios_dir) - next unless Dir.exist?(ios_path) - - # Check common AppDelegate.swift locations within ios directory - Dir.glob(File.join(ios_path, '**/AppDelegate.swift'), File::FNM_DOTMATCH).each do |path| - # Exclude Pods, build, and DerivedData directories - next if path =~ /\/(Pods|build|DerivedData)\// - return path if File.exist?(path) +start_dir = File.expand_path('../../', __dir__) +swift_delegate_path = nil + +# Common project directory names to check +['ios', 'example/ios', 'playground/ios', 'app/ios', 'demo/ios'].each do |ios_dir| + ios_path = File.join(start_dir, ios_dir) + next unless Dir.exist?(ios_path) + + # Check common AppDelegate.swift locations within ios directory + Dir.glob(File.join(ios_path, '**/AppDelegate.swift'), File::FNM_DOTMATCH).each do |path| + # Exclude Pods, build, and DerivedData directories + next if path =~ /\/(Pods|build|DerivedData)\// + if File.exist?(path) + swift_delegate_path = path + break end end - nil + break if swift_delegate_path end -start_dir = File.expand_path('../../', __dir__) -swift_delegate_path = check_for_swift_app_delegate(start_dir) swift_project = swift_delegate_path && File.exist?(swift_delegate_path) # Debug output From a9dbce58b4c8875afc3b7295f77d0f17391f4ed6 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Sun, 23 Nov 2025 17:18:36 +0200 Subject: [PATCH 22/36] cleanup --- ReactNativeNavigation.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReactNativeNavigation.podspec b/ReactNativeNavigation.podspec index c9c74a8a71..76575dd74a 100644 --- a/ReactNativeNavigation.podspec +++ b/ReactNativeNavigation.podspec @@ -28,7 +28,6 @@ end swift_project = swift_delegate_path && File.exist?(swift_delegate_path) -# Debug output if swift_project puts "ReactNativeNavigation: Swift AppDelegate detected - enabling Swift-compatible configuration" else @@ -53,6 +52,7 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/wix/react-native-navigation.git", :tag => "#{s.version}" } s.source_files = 'ios/**/*.{h,m,mm,cpp}' s.exclude_files = "ios/ReactNativeNavigationTests/**/*.*", "ios/OCMock/**/*.*" + # Only expose headers for Swift projects if swift_project s.public_header_files = [ From 4942b3ca97f8ee31fb376c9d5ff74b686474ae6d Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Mon, 24 Nov 2025 09:42:56 +0200 Subject: [PATCH 23/36] headers for tests to run in xcode --- playground/ios/playground.xcodeproj/project.pbxproj | 10 ++++++++++ .../xcshareddata/xcschemes/playground.xcscheme | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/playground/ios/playground.xcodeproj/project.pbxproj b/playground/ios/playground.xcodeproj/project.pbxproj index 6701c660aa..b7c3ae9136 100644 --- a/playground/ios/playground.xcodeproj/project.pbxproj +++ b/playground/ios/playground.xcodeproj/project.pbxproj @@ -1623,6 +1623,11 @@ DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../ios/**", + "${PODS_ROOT}/Headers/Private", + ); INFOPLIST_FILE = NavigationTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -1651,6 +1656,11 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../ios/**", + "${PODS_ROOT}/Headers/Private", + ); INFOPLIST_FILE = NavigationTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; diff --git a/playground/ios/playground.xcodeproj/xcshareddata/xcschemes/playground.xcscheme b/playground/ios/playground.xcodeproj/xcshareddata/xcschemes/playground.xcscheme index 85bb8358bc..f6186cdf37 100644 --- a/playground/ios/playground.xcodeproj/xcshareddata/xcschemes/playground.xcscheme +++ b/playground/ios/playground.xcodeproj/xcshareddata/xcschemes/playground.xcscheme @@ -15,7 +15,7 @@ From ca55c8600df605d901cfda6a3d227c47f088a9ba Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Mon, 24 Nov 2025 09:58:54 +0200 Subject: [PATCH 24/36] test updates to aline with iOS 18 --- .../BottomTabsControllerTest.mm | 6 +++++- .../NavigationTests/RNNModalManagerTest.mm | 6 +++++- .../NavigationTests/RNNStackControllerTest.mm | 19 +++++++++++-------- .../UIViewController+LayoutProtocolTest.mm | 6 +++++- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/playground/ios/NavigationTests/BottomTabsControllerTest.mm b/playground/ios/NavigationTests/BottomTabsControllerTest.mm index 458fc0eca5..8d7eb81d7e 100644 --- a/playground/ios/NavigationTests/BottomTabsControllerTest.mm +++ b/playground/ios/NavigationTests/BottomTabsControllerTest.mm @@ -104,7 +104,11 @@ - (void)testInitWithLayoutInfo_shouldCreateWithDefaultStyles { eventEmitter:nil childViewControllers:nil]; - XCTAssertEqual(uut.modalPresentationStyle, UIModalPresentationPageSheet); + if (@available(iOS 18.0, *)) { + XCTAssertEqual(uut.modalPresentationStyle, UIModalPresentationFormSheet); + } else { + XCTAssertEqual(uut.modalPresentationStyle, UIModalPresentationPageSheet); + } XCTAssertEqual(uut.modalTransitionStyle, UIModalTransitionStyleCoverVertical); } diff --git a/playground/ios/NavigationTests/RNNModalManagerTest.mm b/playground/ios/NavigationTests/RNNModalManagerTest.mm index aae531a548..7f17084be5 100644 --- a/playground/ios/NavigationTests/RNNModalManagerTest.mm +++ b/playground/ios/NavigationTests/RNNModalManagerTest.mm @@ -172,7 +172,11 @@ - (void)testPresentationControllerDidDismiss_ShouldInvokeDelegateDismissedModalW - (void)testApplyOptionsOnInit_shouldShowModalWithDefaultPresentationStyle { _vc1.options = [RNNNavigationOptions emptyOptions]; [_modalManager showModal:_vc1 animated:NO completion:nil]; - XCTAssertEqual(_vc1.modalPresentationStyle, UIModalPresentationPageSheet); + if (@available(iOS 18.0, *)) { + XCTAssertEqual(_vc1.modalPresentationStyle, UIModalPresentationFormSheet); + } else { + XCTAssertEqual(_vc1.modalPresentationStyle, UIModalPresentationPageSheet); + } } - (void)testApplyOptionsOnInit_shouldShowModalWithDefaultTransitionStyle { diff --git a/playground/ios/NavigationTests/RNNStackControllerTest.mm b/playground/ios/NavigationTests/RNNStackControllerTest.mm index 3334e4712e..cbc17ab83d 100644 --- a/playground/ios/NavigationTests/RNNStackControllerTest.mm +++ b/playground/ios/NavigationTests/RNNStackControllerTest.mm @@ -233,16 +233,19 @@ - (void)testMergeChildOptionsShouldNotUpdatePresenterForInvisibleChild { } - (void)testOnChildWillAppear_shouldSetBackButtonTestID { - RNNNavigationOptions *options = [RNNNavigationOptions emptyOptions]; - options.topBar.backButton.testID = [Text withValue:@"TestID"]; - RNNComponentViewController *pushedController = - [RNNComponentViewController createWithComponentId:@"pushedController"]; - pushedController.options.topBar.backButton.testID = [Text withValue:@"TestID"]; + RNNComponentViewController *pushedController = + [RNNComponentViewController createWithComponentId:@"pushedController"]; + pushedController.options.topBar.backButton.testID = [Text withValue:@"TestID"]; UIApplication.sharedApplication.keyWindow.rootViewController = _uut; [_uut pushViewController:pushedController animated:NO]; - [pushedController viewDidAppear:YES]; - XCTAssertTrue([[[_uut.navigationBar.subviews[1] subviews][0] - valueForKey:@"accessibilityIdentifier"] isEqualToString:@"TestID"]); + [pushedController viewDidAppear:YES]; + dispatch_async(dispatch_get_main_queue(), ^{ + UIView *navigationBarContentView = [self->_uut.navigationBar findChildByClass:NSClassFromString(@"_UINavigationBarContentView")]; + XCTAssertNotNil(navigationBarContentView); + UIView *barButton = [navigationBarContentView findChildByClass:NSClassFromString(@"_UIButtonBarButton")]; + XCTAssertNotNil(barButton); + XCTAssertTrue([barButton.accessibilityIdentifier isEqualToString:@"TestID"]); + }); } - (RNNStackController *)createNavigationControllerWithOptions:(RNNNavigationOptions *)options { diff --git a/playground/ios/NavigationTests/UIViewController+LayoutProtocolTest.mm b/playground/ios/NavigationTests/UIViewController+LayoutProtocolTest.mm index fa0e9d6bdb..b68f0f716d 100644 --- a/playground/ios/NavigationTests/UIViewController+LayoutProtocolTest.mm +++ b/playground/ios/NavigationTests/UIViewController+LayoutProtocolTest.mm @@ -37,7 +37,11 @@ - (void)testInitWithLayoutApplyDefaultOptions { presenter:presenter eventEmitter:nil childViewControllers:nil]; - XCTAssertEqual(uut.modalPresentationStyle, UIModalPresentationPageSheet); + if (@available(iOS 18.0, *)) { + XCTAssertEqual(uut.modalPresentationStyle, UIModalPresentationFormSheet); + } else { + XCTAssertEqual(uut.modalPresentationStyle, UIModalPresentationPageSheet); + } } - (void)testInitWithLayoutInfoShouldSetChildViewControllers { From 6164975902699e1e3fa6261027fa751b965d0b19 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Mon, 24 Nov 2025 10:13:29 +0200 Subject: [PATCH 25/36] podspec update --- ReactNativeNavigation.podspec | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/ReactNativeNavigation.podspec b/ReactNativeNavigation.podspec index 76575dd74a..1a44ad75d0 100644 --- a/ReactNativeNavigation.podspec +++ b/ReactNativeNavigation.podspec @@ -5,21 +5,26 @@ package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1' # Detect if this is a Swift project by checking common iOS project locations -# This avoids the slow recursive Find.find() that can take minutes in CI +# Avoid recursive directory scanning which can be slow in CI with large node_modules start_dir = File.expand_path('../../', __dir__) swift_delegate_path = nil -# Common project directory names to check +# Check specific, known locations where AppDelegate.swift typically exists +# This avoids slow recursive directory traversal ['ios', 'example/ios', 'playground/ios', 'app/ios', 'demo/ios'].each do |ios_dir| ios_path = File.join(start_dir, ios_dir) next unless Dir.exist?(ios_path) - # Check common AppDelegate.swift locations within ios directory - Dir.glob(File.join(ios_path, '**/AppDelegate.swift'), File::FNM_DOTMATCH).each do |path| - # Exclude Pods, build, and DerivedData directories - next if path =~ /\/(Pods|build|DerivedData)\// - if File.exist?(path) - swift_delegate_path = path + # Check direct subdirectories (common project structures) + # Most projects have: ios/ProjectName/AppDelegate.swift + Dir.entries(ios_path).each do |entry| + next if entry.start_with?('.') || entry == 'Pods' || entry == 'build' || entry == 'DerivedData' + entry_path = File.join(ios_path, entry) + next unless Dir.exist?(entry_path) + + app_delegate_path = File.join(entry_path, 'AppDelegate.swift') + if File.exist?(app_delegate_path) + swift_delegate_path = app_delegate_path break end end From 33c789fe31eda6d739833f58d07460b2c30997d2 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Mon, 24 Nov 2025 14:04:45 +0200 Subject: [PATCH 26/36] reanimated update for RN0.79 --- package.json | 3 ++- playground/package.json | 3 ++- scripts/changeReactNativeVersion.js | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7c4e5e9e2c..1da8e8e938 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,8 @@ "react-native-builder-bob": "^0.40.13", "react-native-fast-image": "^8.6.3", "react-native-gesture-handler": "^2.22.1", - "react-native-reanimated": "3.18.0", + "react-native-reanimated": "4.1.5", + "react-native-worklets": "0.5.0", "react-redux": "9.1.2", "react-test-renderer": "19.0.0", "redux": "^5.0.1", diff --git a/playground/package.json b/playground/package.json index c6e3a0a14f..e69801ee33 100644 --- a/playground/package.json +++ b/playground/package.json @@ -72,7 +72,8 @@ "react-native-fast-image": "^8.6.3", "react-native-gesture-handler": "^2.22.1", "react-native-monorepo-config": "^0.3.0", - "react-native-reanimated": "3.18.0", + "react-native-reanimated": "4.1.5", + "react-native-worklets": "0.5.0", "react-redux": "9.1.2", "react-test-renderer": "19.0.0", "redux": "^5.0.1", diff --git a/scripts/changeReactNativeVersion.js b/scripts/changeReactNativeVersion.js index 4f9401615d..04420c1ca9 100644 --- a/scripts/changeReactNativeVersion.js +++ b/scripts/changeReactNativeVersion.js @@ -65,6 +65,14 @@ async function updatePackageJsonAt(packageJsonPath, versions) { packageJson.devDependencies['@testing-library/react-native'] = '12.4.5'; } + if (rnMinor <= 78) { + packageJson.devDependencies['react-native-reanimated'] = '3.18.0'; + delete packageJson.devDependencies['react-native-worklets']; + } else if (rnMinor == 79) { + packageJson.devDependencies['react-native-reanimated'] = '4.1.5'; + packageJson.devDependencies['react-native-worklets'] = '0.5.0'; + } + await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf8'); } From 04455889bcff4f708f9f5c1c1fd404582ee4b49b Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Mon, 24 Nov 2025 18:58:18 +0200 Subject: [PATCH 27/36] link test update for iOS --- .../fixtures/rn79/AppDelegate.swift.template | 48 +++++++++++++++++++ autolink/postlink/__helpers__/fixtures.js | 2 + autolink/postlink/appDelegateLinker.test.js | 20 ++++++++ 3 files changed, 70 insertions(+) create mode 100644 autolink/fixtures/rn79/AppDelegate.swift.template diff --git a/autolink/fixtures/rn79/AppDelegate.swift.template b/autolink/fixtures/rn79/AppDelegate.swift.template new file mode 100644 index 0000000000..5fe63aa4fa --- /dev/null +++ b/autolink/fixtures/rn79/AppDelegate.swift.template @@ -0,0 +1,48 @@ +import UIKit +import React +import React_RCTAppDelegate +import ReactAppDependencyProvider + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + var reactNativeDelegate: ReactNativeDelegate? + var reactNativeFactory: RCTReactNativeFactory? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + let delegate = ReactNativeDelegate() + let factory = RCTReactNativeFactory(delegate: delegate) + delegate.dependencyProvider = RCTAppDependencyProvider() + + reactNativeDelegate = delegate + reactNativeFactory = factory + + window = UIWindow(frame: UIScreen.main.bounds) + + factory.startReactNative( + withModuleName: "RN79", + in: window, + launchOptions: launchOptions + ) + + return true + } +} + +class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + self.bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +} \ No newline at end of file diff --git a/autolink/postlink/__helpers__/fixtures.js b/autolink/postlink/__helpers__/fixtures.js index db8f05be2f..0525082bff 100644 --- a/autolink/postlink/__helpers__/fixtures.js +++ b/autolink/postlink/__helpers__/fixtures.js @@ -21,4 +21,6 @@ module.exports = { prepareFixtureDuplicate, prepareFixtureDuplicate77: ({ userFixtureFileName, patchedFixtureFileName }) => prepareFixtureDuplicate({ rnVersion: '77', userFixtureFileName, patchedFixtureFileName }), + prepareFixtureDuplicate79: ({ userFixtureFileName, patchedFixtureFileName }) => + prepareFixtureDuplicate({ rnVersion: '79', userFixtureFileName, patchedFixtureFileName }), }; diff --git a/autolink/postlink/appDelegateLinker.test.js b/autolink/postlink/appDelegateLinker.test.js index c3e2a55bc2..75ef799233 100644 --- a/autolink/postlink/appDelegateLinker.test.js +++ b/autolink/postlink/appDelegateLinker.test.js @@ -42,4 +42,24 @@ describe('appDelegateLinker', () => { const appDelegateContent = fs.readFileSync(linker.appDelegatePath, 'utf8'); expect(appDelegateContent).toMatchSnapshot(); }); + + it('should work with Swift bridgeless RN 0.79+', () => { + jest.mock('./path', () => { + const tmpAppDelegatePath = mockHelpers.prepareFixtureDuplicate79({ + userFixtureFileName: 'AppDelegate.swift.template', + patchedFixtureFileName: 'rnn-tests_AppDelegate79.swift', + }); + + return { + appDelegate: tmpAppDelegatePath, + }; + }); + + const AppDelegateLinker = require('./appDelegateLinker'); + const linker = new AppDelegateLinker(); + linker.link(); + + const appDelegateContent = fs.readFileSync(linker.appDelegatePath, 'utf8'); + expect(appDelegateContent).toMatchSnapshot(); + }); }); From 25707496fb0f164d4d5c897363cc2ccaad00b675 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Mon, 24 Nov 2025 19:07:59 +0200 Subject: [PATCH 28/36] android linker test templates added --- .../fixtures/rn79/MainActivity.kt.template | 22 ++++++++++ .../fixtures/rn79/MainApplication.kt.template | 44 +++++++++++++++++++ autolink/fixtures/rn79/build.gradle.template | 21 +++++++++ 3 files changed, 87 insertions(+) create mode 100644 autolink/fixtures/rn79/MainActivity.kt.template create mode 100644 autolink/fixtures/rn79/MainApplication.kt.template create mode 100644 autolink/fixtures/rn79/build.gradle.template diff --git a/autolink/fixtures/rn79/MainActivity.kt.template b/autolink/fixtures/rn79/MainActivity.kt.template new file mode 100644 index 0000000000..853728d56a --- /dev/null +++ b/autolink/fixtures/rn79/MainActivity.kt.template @@ -0,0 +1,22 @@ +package com.app + +import com.facebook.react.ReactActivity +import com.facebook.react.ReactActivityDelegate +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled +import com.facebook.react.defaults.DefaultReactActivityDelegate + +class MainActivity : ReactActivity() { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + override fun getMainComponentName(): String = "rn770" + + /** + * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] + * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] + */ + override fun createReactActivityDelegate(): ReactActivityDelegate = + DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) +} diff --git a/autolink/fixtures/rn79/MainApplication.kt.template b/autolink/fixtures/rn79/MainApplication.kt.template new file mode 100644 index 0000000000..9e7449efca --- /dev/null +++ b/autolink/fixtures/rn79/MainApplication.kt.template @@ -0,0 +1,44 @@ +package com.app + +import android.app.Application +import com.facebook.react.PackageList +import com.facebook.react.ReactApplication +import com.facebook.react.ReactHost +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load +import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost +import com.facebook.react.defaults.DefaultReactNativeHost +import com.facebook.react.soloader.OpenSourceMergedSoMapping +import com.facebook.soloader.SoLoader + +class MainApplication : Application(), ReactApplication { + + override val reactNativeHost: ReactNativeHost = + object : DefaultReactNativeHost(this) { + override fun getPackages(): List = + PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here, for example: + // add(MyReactNativePackage()) + } + + override fun getJSMainModuleName(): String = "index" + + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } + + override val reactHost: ReactHost + get() = getDefaultReactHost(applicationContext, reactNativeHost) + + override fun onCreate() { + super.onCreate() + SoLoader.init(this, OpenSourceMergedSoMapping) + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + load() + } + } +} diff --git a/autolink/fixtures/rn79/build.gradle.template b/autolink/fixtures/rn79/build.gradle.template new file mode 100644 index 0000000000..9766946918 --- /dev/null +++ b/autolink/fixtures/rn79/build.gradle.template @@ -0,0 +1,21 @@ +buildscript { + ext { + buildToolsVersion = "35.0.0" + minSdkVersion = 24 + compileSdkVersion = 35 + targetSdkVersion = 35 + ndkVersion = "27.1.12297006" + kotlinVersion = "2.0.21" + } + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") + } +} + +apply plugin: "com.facebook.react.rootproject" From 4ab878c7c7a074aed660c02d57b9ae0c68428952 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Tue, 25 Nov 2025 09:01:07 +0200 Subject: [PATCH 29/36] snapshot update for linker test --- .../appDelegateLinker.test.js.snap | 41 ++++++++++++++++++- autolink/postlink/appDelegateLinker.test.js | 30 ++++++++++++-- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/autolink/postlink/__snapshots__/appDelegateLinker.test.js.snap b/autolink/postlink/__snapshots__/appDelegateLinker.test.js.snap index 0331cedf2d..46efb09afd 100644 --- a/autolink/postlink/__snapshots__/appDelegateLinker.test.js.snap +++ b/autolink/postlink/__snapshots__/appDelegateLinker.test.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`appDelegateLinker should work for RN 0.77 with Objective-C 1`] = ` +exports[`appDelegateLinker should work for RN 0.77 & 0.78 with Objective-C 1`] = ` "#import "AppDelegate.h" #import @@ -36,7 +36,7 @@ exports[`appDelegateLinker should work for RN 0.77 with Objective-C 1`] = ` @end " `; -exports[`appDelegateLinker should work for RN 0.77 with Swift 1`] = ` +exports[`appDelegateLinker should work for RN 0.77 & 0.78 with Swift 1`] = ` "import UIKit import React import ReactNativeNavigation @@ -68,3 +68,40 @@ class AppDelegate: RNNAppDelegate { } } " `; + +exports[`appDelegateLinker should work with Swift bridgeless RN 0.79 1`] = ` +"import UIKit +import React +import ReactNativeNavigation +import ReactAppDependencyProvider + +@main +class AppDelegate: RNNAppDelegate { + + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + self.reactNativeDelegate = ReactNativeDelegate() + super.application(application, didFinishLaunchingWithOptions: launchOptions) + + + + return true + } +} + +class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + self.bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +}" +`; diff --git a/autolink/postlink/appDelegateLinker.test.js b/autolink/postlink/appDelegateLinker.test.js index 75ef799233..12dc6d7d74 100644 --- a/autolink/postlink/appDelegateLinker.test.js +++ b/autolink/postlink/appDelegateLinker.test.js @@ -4,7 +4,15 @@ import * as mockHelpers from './__helpers__/fixtures'; jest.mock('./log'); describe('appDelegateLinker', () => { - it('should work for RN 0.77 with Objective-C', () => { + it('should work for RN 0.77 & 0.78 with Objective-C', () => { + const { getReactNativeVersion } = require('./__helpers__/reactNativeVersion'); + const rnVersion = getReactNativeVersion(); + + if (rnVersion && rnVersion.minor >= 79) { + console.log(`Skipping RN 0.77 test (current version: ${rnVersion.raw})`); + return; + } + jest.mock('./path', () => { const appDelegatePath = mockHelpers.prepareFixtureDuplicate77({ userFixtureFileName: 'AppDelegate.mm.template', @@ -23,7 +31,15 @@ describe('appDelegateLinker', () => { expect(appDelegateContent).toMatchSnapshot(); }); - it('should work for RN 0.77 with Swift', () => { + it('should work for RN 0.77 & 0.78 with Swift', () => { + const { getReactNativeVersion } = require('./__helpers__/reactNativeVersion'); + const rnVersion = getReactNativeVersion(); + + if (rnVersion && rnVersion.minor >= 79) { + console.log(`Skipping RN 0.77 test (current version: ${rnVersion.raw})`); + return; + } + jest.mock('./path', () => { const tmpAppDelegatePath = mockHelpers.prepareFixtureDuplicate77({ userFixtureFileName: 'AppDelegate.swift.template', @@ -43,7 +59,15 @@ describe('appDelegateLinker', () => { expect(appDelegateContent).toMatchSnapshot(); }); - it('should work with Swift bridgeless RN 0.79+', () => { + it('should work with Swift bridgeless RN 0.79', () => { + const { getReactNativeVersion } = require('./__helpers__/reactNativeVersion'); + const rnVersion = getReactNativeVersion(); + + if (!rnVersion || rnVersion.minor < 79) { + console.log(`Skipping RN 0.79 test (current version: ${rnVersion?.raw || 'unknown'})`); + return; + } + jest.mock('./path', () => { const tmpAppDelegatePath = mockHelpers.prepareFixtureDuplicate79({ userFixtureFileName: 'AppDelegate.swift.template', From fbc20d892bd00f08483c43ce055ce64758259cc0 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Wed, 26 Nov 2025 09:39:49 +0200 Subject: [PATCH 30/36] update for linnker test and podspec --- ReactNativeNavigation.podspec | 54 ++--------- .../appDelegateLinker77.test.js.snap | 70 +++++++++++++++ .../appDelegateLinker79.test.js.snap | 39 ++++++++ autolink/postlink/appDelegateLinker.test.js | 89 ------------------- autolink/postlink/appDelegateLinker77.test.js | 51 +++++++++++ autolink/postlink/appDelegateLinker79.test.js | 32 +++++++ .../project.pbxproj | 6 +- playground/ios/playground/AppDelegate.mm | 3 +- scripts/changeReactNativeVersion.js | 3 - 9 files changed, 205 insertions(+), 142 deletions(-) create mode 100644 autolink/postlink/__snapshots__/appDelegateLinker77.test.js.snap create mode 100644 autolink/postlink/__snapshots__/appDelegateLinker79.test.js.snap delete mode 100644 autolink/postlink/appDelegateLinker.test.js create mode 100644 autolink/postlink/appDelegateLinker77.test.js create mode 100644 autolink/postlink/appDelegateLinker79.test.js diff --git a/ReactNativeNavigation.podspec b/ReactNativeNavigation.podspec index 1a44ad75d0..1644db509a 100644 --- a/ReactNativeNavigation.podspec +++ b/ReactNativeNavigation.podspec @@ -1,44 +1,8 @@ require 'json' package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) - fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1' -# Detect if this is a Swift project by checking common iOS project locations -# Avoid recursive directory scanning which can be slow in CI with large node_modules -start_dir = File.expand_path('../../', __dir__) -swift_delegate_path = nil - -# Check specific, known locations where AppDelegate.swift typically exists -# This avoids slow recursive directory traversal -['ios', 'example/ios', 'playground/ios', 'app/ios', 'demo/ios'].each do |ios_dir| - ios_path = File.join(start_dir, ios_dir) - next unless Dir.exist?(ios_path) - - # Check direct subdirectories (common project structures) - # Most projects have: ios/ProjectName/AppDelegate.swift - Dir.entries(ios_path).each do |entry| - next if entry.start_with?('.') || entry == 'Pods' || entry == 'build' || entry == 'DerivedData' - entry_path = File.join(ios_path, entry) - next unless Dir.exist?(entry_path) - - app_delegate_path = File.join(entry_path, 'AppDelegate.swift') - if File.exist?(app_delegate_path) - swift_delegate_path = app_delegate_path - break - end - end - break if swift_delegate_path -end - -swift_project = swift_delegate_path && File.exist?(swift_delegate_path) - -if swift_project - puts "ReactNativeNavigation: Swift AppDelegate detected - enabling Swift-compatible configuration" -else - puts "ReactNativeNavigation: Objective-C AppDelegate detected - using standard configuration" -end - Pod::Spec.new do |s| s.name = "ReactNativeNavigation" s.prepare_command = 'node autolink/postlink/__helpers__/generate_version_header.js' @@ -58,13 +22,10 @@ Pod::Spec.new do |s| s.source_files = 'ios/**/*.{h,m,mm,cpp}' s.exclude_files = "ios/ReactNativeNavigationTests/**/*.*", "ios/OCMock/**/*.*" - # Only expose headers for Swift projects - if swift_project - s.public_header_files = [ - 'ios/RNNAppDelegate.h', - 'ios/ReactNativeVersionExtracted.h' - ] - end + s.public_header_files = [ + 'ios/RNNAppDelegate.h', + 'ios/ReactNativeVersionExtracted.h' + ] end folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32 -DFOLLY_CFG_NO_COROUTINES=1' @@ -76,11 +37,8 @@ Pod::Spec.new do |s| "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1", } - # Only add DEFINES_MODULE for Swift projects - if swift_project - xcconfig_settings["DEFINES_MODULE"] = "YES" - end - + xcconfig_settings["DEFINES_MODULE"] = "YES" + s.pod_target_xcconfig = xcconfig_settings if fabric_enabled diff --git a/autolink/postlink/__snapshots__/appDelegateLinker77.test.js.snap b/autolink/postlink/__snapshots__/appDelegateLinker77.test.js.snap new file mode 100644 index 0000000000..c175153356 --- /dev/null +++ b/autolink/postlink/__snapshots__/appDelegateLinker77.test.js.snap @@ -0,0 +1,70 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`appDelegateLinker should work for RN 0.77 & 0.78 with Objective-C 1`] = ` +"#import "AppDelegate.h" +#import + +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +/// 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\` feature is enabled. Otherwise, it returns \`false\`. +- (BOOL)concurrentRootEnabled +{ + return true; +} + +@end " +`; + +exports[`appDelegateLinker should work for RN 0.77 & 0.78 with Swift 1`] = ` +"import UIKit +import React +import ReactNativeNavigation +import ReactAppDependencyProvider + +@main +class AppDelegate: RNNAppDelegate { + override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + self.moduleName = "app" + self.dependencyProvider = RCTAppDependencyProvider() + + // 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 = [:] + + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } + + override func sourceURL(for bridge: RCTBridge) -> URL? { + self.bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +} " +`; diff --git a/autolink/postlink/__snapshots__/appDelegateLinker79.test.js.snap b/autolink/postlink/__snapshots__/appDelegateLinker79.test.js.snap new file mode 100644 index 0000000000..ad0b4ca90e --- /dev/null +++ b/autolink/postlink/__snapshots__/appDelegateLinker79.test.js.snap @@ -0,0 +1,39 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`appDelegateLinker should work with Swift bridgeless RN 0.79 1`] = ` +"import UIKit +import React +import ReactNativeNavigation +import ReactAppDependencyProvider + +@main +class AppDelegate: RNNAppDelegate { + + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + self.reactNativeDelegate = ReactNativeDelegate() + super.application(application, didFinishLaunchingWithOptions: launchOptions) + + + + return true + } +} + +class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + self.bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +}" +`; + diff --git a/autolink/postlink/appDelegateLinker.test.js b/autolink/postlink/appDelegateLinker.test.js deleted file mode 100644 index 12dc6d7d74..0000000000 --- a/autolink/postlink/appDelegateLinker.test.js +++ /dev/null @@ -1,89 +0,0 @@ -import fs from 'node:fs'; -import * as mockHelpers from './__helpers__/fixtures'; - -jest.mock('./log'); - -describe('appDelegateLinker', () => { - it('should work for RN 0.77 & 0.78 with Objective-C', () => { - const { getReactNativeVersion } = require('./__helpers__/reactNativeVersion'); - const rnVersion = getReactNativeVersion(); - - if (rnVersion && rnVersion.minor >= 79) { - console.log(`Skipping RN 0.77 test (current version: ${rnVersion.raw})`); - return; - } - - jest.mock('./path', () => { - const appDelegatePath = mockHelpers.prepareFixtureDuplicate77({ - userFixtureFileName: 'AppDelegate.mm.template', - patchedFixtureFileName: 'rnn-tests_AppDelegate.mm', - }); - return { - appDelegate: appDelegatePath, - }; - }); - - const AppDelegateLinker = require('./appDelegateLinker'); - const linker = new AppDelegateLinker(); - - linker.link(); - const appDelegateContent = fs.readFileSync(linker.appDelegatePath, 'utf8'); - expect(appDelegateContent).toMatchSnapshot(); - }); - - it('should work for RN 0.77 & 0.78 with Swift', () => { - const { getReactNativeVersion } = require('./__helpers__/reactNativeVersion'); - const rnVersion = getReactNativeVersion(); - - if (rnVersion && rnVersion.minor >= 79) { - console.log(`Skipping RN 0.77 test (current version: ${rnVersion.raw})`); - return; - } - - jest.mock('./path', () => { - const tmpAppDelegatePath = mockHelpers.prepareFixtureDuplicate77({ - userFixtureFileName: 'AppDelegate.swift.template', - patchedFixtureFileName: 'rnn-tests_AppDelegate.swift', - }); - - return { - appDelegate: tmpAppDelegatePath, - }; - }); - - const AppDelegateLinker = require('./appDelegateLinker'); - const linker = new AppDelegateLinker(); - linker.link(); - - const appDelegateContent = fs.readFileSync(linker.appDelegatePath, 'utf8'); - expect(appDelegateContent).toMatchSnapshot(); - }); - - it('should work with Swift bridgeless RN 0.79', () => { - const { getReactNativeVersion } = require('./__helpers__/reactNativeVersion'); - const rnVersion = getReactNativeVersion(); - - if (!rnVersion || rnVersion.minor < 79) { - console.log(`Skipping RN 0.79 test (current version: ${rnVersion?.raw || 'unknown'})`); - return; - } - - jest.mock('./path', () => { - const tmpAppDelegatePath = mockHelpers.prepareFixtureDuplicate79({ - userFixtureFileName: 'AppDelegate.swift.template', - patchedFixtureFileName: 'rnn-tests_AppDelegate79.swift', - }); - - return { - appDelegate: tmpAppDelegatePath, - }; - }); - - const AppDelegateLinker = require('./appDelegateLinker'); - const linker = new AppDelegateLinker(); - linker.link(); - - const appDelegateContent = fs.readFileSync(linker.appDelegatePath, 'utf8'); - expect(appDelegateContent).toMatchSnapshot(); - }); -}); diff --git a/autolink/postlink/appDelegateLinker77.test.js b/autolink/postlink/appDelegateLinker77.test.js new file mode 100644 index 0000000000..26224d89cc --- /dev/null +++ b/autolink/postlink/appDelegateLinker77.test.js @@ -0,0 +1,51 @@ +import fs from 'node:fs'; +import * as mockHelpers from './__helpers__/fixtures'; + +jest.mock('./log'); + +const { getReactNativeVersion } = require('./__helpers__/reactNativeVersion'); +const rnVersion = getReactNativeVersion(); +const shouldSkip = rnVersion && rnVersion.minor >= 79; + +// Conditionally skip entire test suite based on RN version +(shouldSkip ? describe.skip : describe)('appDelegateLinker', () => { + it('should work for RN 0.77 & 0.78 with Objective-C', () => { + jest.mock('./path', () => { + const appDelegatePath = mockHelpers.prepareFixtureDuplicate77({ + userFixtureFileName: 'AppDelegate.mm.template', + patchedFixtureFileName: 'rnn-tests_AppDelegate.mm', + }); + return { + appDelegate: appDelegatePath, + }; + }); + + const AppDelegateLinker = require('./appDelegateLinker'); + const linker = new AppDelegateLinker(); + + linker.link(); + const appDelegateContent = fs.readFileSync(linker.appDelegatePath, 'utf8'); + expect(appDelegateContent).toMatchSnapshot(); + }); + + it('should work for RN 0.77 & 0.78 with Swift', () => { + jest.mock('./path', () => { + const tmpAppDelegatePath = mockHelpers.prepareFixtureDuplicate77({ + userFixtureFileName: 'AppDelegate.swift.template', + patchedFixtureFileName: 'rnn-tests_AppDelegate.swift', + }); + + return { + appDelegate: tmpAppDelegatePath, + }; + }); + + const AppDelegateLinker = require('./appDelegateLinker'); + const linker = new AppDelegateLinker(); + linker.link(); + + const appDelegateContent = fs.readFileSync(linker.appDelegatePath, 'utf8'); + expect(appDelegateContent).toMatchSnapshot(); + }); +}); + diff --git a/autolink/postlink/appDelegateLinker79.test.js b/autolink/postlink/appDelegateLinker79.test.js new file mode 100644 index 0000000000..081b5818bd --- /dev/null +++ b/autolink/postlink/appDelegateLinker79.test.js @@ -0,0 +1,32 @@ +import fs from 'node:fs'; +import * as mockHelpers from './__helpers__/fixtures'; + +jest.mock('./log'); + +const { getReactNativeVersion } = require('./__helpers__/reactNativeVersion'); +const rnVersion = getReactNativeVersion(); +const shouldSkip = !rnVersion || rnVersion.minor < 79; + +// Conditionally skip entire test suite based on RN version +(shouldSkip ? describe.skip : describe)('appDelegateLinker', () => { + it('should work with Swift bridgeless RN 0.79', () => { + jest.mock('./path', () => { + const tmpAppDelegatePath = mockHelpers.prepareFixtureDuplicate79({ + userFixtureFileName: 'AppDelegate.swift.template', + patchedFixtureFileName: 'rnn-tests_AppDelegate79.swift', + }); + + return { + appDelegate: tmpAppDelegatePath, + }; + }); + + const AppDelegateLinker = require('./appDelegateLinker'); + const linker = new AppDelegateLinker(); + linker.link(); + + const appDelegateContent = fs.readFileSync(linker.appDelegatePath, 'utf8'); + expect(appDelegateContent).toMatchSnapshot(); + }); +}); + diff --git a/ios/ReactNativeNavigation.xcodeproj/project.pbxproj b/ios/ReactNativeNavigation.xcodeproj/project.pbxproj index 42bbdac34c..c8324568c5 100644 --- a/ios/ReactNativeNavigation.xcodeproj/project.pbxproj +++ b/ios/ReactNativeNavigation.xcodeproj/project.pbxproj @@ -238,8 +238,9 @@ 507ACB1223F44D1E00829911 /* RNNComponentView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 507ACB1023F44D1E00829911 /* RNNComponentView.mm */; }; 507ACB1523F44E5200829911 /* RNNComponentRootView.h in Headers */ = {isa = PBXBuildFile; fileRef = 507ACB1323F44E5200829911 /* RNNComponentRootView.h */; }; 507ACB1623F44E5200829911 /* RNNComponentRootView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 507ACB1423F44E5200829911 /* RNNComponentRootView.mm */; }; - 507DBBDB2A31DE8400F1FC74 /* RNNAppDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 507DBBD92A31DE8400F1FC74 /* RNNAppDelegate.h */; }; + 507DBBDB2A31DE8400F1FC74 /* RNNAppDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 507DBBD92A31DE8400F1FC74 /* RNNAppDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 507DBBDC2A31DE8400F1FC74 /* RNNAppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 507DBBDA2A31DE8400F1FC74 /* RNNAppDelegate.mm */; }; + 507DBBDD2A31DE8400F1FC75 /* ReactNativeVersionExtracted.h in Headers */ = {isa = PBXBuildFile; fileRef = 507DBBDE2A31DE8400F1FC76 /* ReactNativeVersionExtracted.h */; settings = {ATTRIBUTES = (Public, ); }; }; 507E7D57201DDD3000444E6C /* RNNSharedElementAnimationOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 507E7D55201DDD3000444E6C /* RNNSharedElementAnimationOptions.h */; }; 507E7D58201DDD3000444E6C /* RNNSharedElementAnimationOptions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 507E7D56201DDD3000444E6C /* RNNSharedElementAnimationOptions.mm */; }; 507F43C51FF4F17C00D9425B /* RNNTopTabsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 507F43C31FF4F17C00D9425B /* RNNTopTabsViewController.h */; }; @@ -735,6 +736,7 @@ 507ACB1423F44E5200829911 /* RNNComponentRootView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNComponentRootView.mm; sourceTree = ""; }; 507DBBD92A31DE8400F1FC74 /* RNNAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNAppDelegate.h; sourceTree = ""; }; 507DBBDA2A31DE8400F1FC74 /* RNNAppDelegate.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RNNAppDelegate.mm; sourceTree = ""; }; + 507DBBDE2A31DE8400F1FC76 /* ReactNativeVersionExtracted.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReactNativeVersionExtracted.h; sourceTree = ""; }; 507E7D55201DDD3000444E6C /* RNNSharedElementAnimationOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNSharedElementAnimationOptions.h; sourceTree = ""; }; 507E7D56201DDD3000444E6C /* RNNSharedElementAnimationOptions.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNSharedElementAnimationOptions.mm; sourceTree = ""; }; 507F43C31FF4F17C00D9425B /* RNNTopTabsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNTopTabsViewController.h; sourceTree = ""; }; @@ -1588,6 +1590,7 @@ 7BA500741E2544B9001B9E1B /* ReactNativeNavigation.mm */, 507DBBD92A31DE8400F1FC74 /* RNNAppDelegate.h */, 507DBBDA2A31DE8400F1FC74 /* RNNAppDelegate.mm */, + 507DBBDE2A31DE8400F1FC76 /* ReactNativeVersionExtracted.h */, 5030B62023D5B4CA008F1642 /* Color+Interpolation.h */, 5030B61F23D5B4CA008F1642 /* Color+Interpolation.mm */, 5030B62623D5B54D008F1642 /* LNInterpolable.h */, @@ -1857,6 +1860,7 @@ 5050465421F8F4490035497A /* RNNReactComponentRegistry.h in Headers */, 506BF65C2600AE4200A22755 /* CenterTransition.h in Headers */, 507DBBDB2A31DE8400F1FC74 /* RNNAppDelegate.h in Headers */, + 507DBBDD2A31DE8400F1FC75 /* ReactNativeVersionExtracted.h in Headers */, 504AFE741FFFF0540076E904 /* RNNTopTabsOptions.h in Headers */, 50E38DD723A7A2BE009817F6 /* AnimatedViewFactory.h in Headers */, E8E5182E1F83A48B000467AC /* RNNTransitionStateHolder.h in Headers */, diff --git a/playground/ios/playground/AppDelegate.mm b/playground/ios/playground/AppDelegate.mm index 6c729d4259..04e9ca615a 100644 --- a/playground/ios/playground/AppDelegate.mm +++ b/playground/ios/playground/AppDelegate.mm @@ -35,9 +35,10 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { -#if RN_VERSION_MAJOR == 0 && (RN_VERSION_MINOR >= 79 || RN_VERSION_MAJOR > 0) +#if (RN_VERSION_MAJOR == 0 && RN_VERSION_MINOR >= 79) || RN_VERSION_MAJOR > 0 self.reactNativeDelegate = [ReactNativeDelegate new]; #endif + [super application:application didFinishLaunchingWithOptions:launchOptions]; diff --git a/scripts/changeReactNativeVersion.js b/scripts/changeReactNativeVersion.js index 04420c1ca9..02880cb661 100644 --- a/scripts/changeReactNativeVersion.js +++ b/scripts/changeReactNativeVersion.js @@ -68,9 +68,6 @@ async function updatePackageJsonAt(packageJsonPath, versions) { if (rnMinor <= 78) { packageJson.devDependencies['react-native-reanimated'] = '3.18.0'; delete packageJson.devDependencies['react-native-worklets']; - } else if (rnMinor == 79) { - packageJson.devDependencies['react-native-reanimated'] = '4.1.5'; - packageJson.devDependencies['react-native-worklets'] = '0.5.0'; } await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf8'); From 4c75f811d1b1583411ecc3ae62240ddcc200eb6c Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Wed, 26 Nov 2025 09:40:20 +0200 Subject: [PATCH 31/36] remove old snap test --- .../appDelegateLinker.test.js.snap | 107 ------------------ 1 file changed, 107 deletions(-) delete mode 100644 autolink/postlink/__snapshots__/appDelegateLinker.test.js.snap diff --git a/autolink/postlink/__snapshots__/appDelegateLinker.test.js.snap b/autolink/postlink/__snapshots__/appDelegateLinker.test.js.snap deleted file mode 100644 index 46efb09afd..0000000000 --- a/autolink/postlink/__snapshots__/appDelegateLinker.test.js.snap +++ /dev/null @@ -1,107 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`appDelegateLinker should work for RN 0.77 & 0.78 with Objective-C 1`] = ` -"#import "AppDelegate.h" -#import - -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -/// 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\` feature is enabled. Otherwise, it returns \`false\`. -- (BOOL)concurrentRootEnabled -{ - return true; -} - -@end " -`; - -exports[`appDelegateLinker should work for RN 0.77 & 0.78 with Swift 1`] = ` -"import UIKit -import React -import ReactNativeNavigation -import ReactAppDependencyProvider - -@main -class AppDelegate: RNNAppDelegate { - override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { - self.moduleName = "app" - self.dependencyProvider = RCTAppDependencyProvider() - - // 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 = [:] - - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } - - override func sourceURL(for bridge: RCTBridge) -> URL? { - self.bundleURL() - } - - override func bundleURL() -> URL? { -#if DEBUG - RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") -#else - Bundle.main.url(forResource: "main", withExtension: "jsbundle") -#endif - } -} " -`; - -exports[`appDelegateLinker should work with Swift bridgeless RN 0.79 1`] = ` -"import UIKit -import React -import ReactNativeNavigation -import ReactAppDependencyProvider - -@main -class AppDelegate: RNNAppDelegate { - - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil - ) -> Bool { - self.reactNativeDelegate = ReactNativeDelegate() - super.application(application, didFinishLaunchingWithOptions: launchOptions) - - - - return true - } -} - -class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { - override func sourceURL(for bridge: RCTBridge) -> URL? { - self.bundleURL() - } - - override func bundleURL() -> URL? { -#if DEBUG - RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") -#else - Bundle.main.url(forResource: "main", withExtension: "jsbundle") -#endif - } -}" -`; From 0756e54909fd50fe990902025e12d90010abd71f Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Wed, 26 Nov 2025 17:05:14 +0200 Subject: [PATCH 32/36] Documentation update --- website/docs/docs/docs-Installing.mdx | 35 ++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/website/docs/docs/docs-Installing.mdx b/website/docs/docs/docs-Installing.mdx index 822d7261ef..3d800ce091 100644 --- a/website/docs/docs/docs-Installing.mdx +++ b/website/docs/docs/docs-Installing.mdx @@ -7,7 +7,7 @@ sidebar_label: Installation ## Requirements - node >= 18.18 -- react-native >0.77 - 0.78 (0.79 - 0.82 support is in progress) +- react-native >0.77 - 0.79 (0.80 - 0.82 support is in progress) - new architecture enabled (if you are not using the new architecture, you can still use react-native-navigation of version 7.x.x with react-native 0.73 and lower) ## npm or yarn @@ -38,8 +38,41 @@ Make sure to commit the changes introduced by the `rnn-link` script. > The automatic linking is optimized for new applications created via the `npx @react-native-community/cli@latest init` command. If you are migrating from a version of react-native-navigation older than v7, it's recommended to check the steps manually after the script runs. +> In iOS, from React-native 0.79 onwards the rnn-link will make the necessary changes only to the AppDelegate.swift file. The Objective-C version of the AppDelegate will need to be changed manually (see below). + If one of the steps failed or you can't run (or are not comfortable with) the automatic scripts, you'll need to complete the relevant steps in the manual installation steps below, for both platforms. +### Manually changes to the AppDelegate.h & AppDelegate.m `iOS + React-native 0.79 and up` + +`AppDelegate.h` +```diff +-@interface AppDelegate: UIResponder, UIApplicationDelegate ++@interface AppDelegate : RNNAppDelegate + +-@property (nonatomic, strong) UIWindow *window; +-@property (nonatomic, strong) ReactNativeDelegate *reactNativeDelegate; +-@property (nonatomic, strong) RCTReactNativeFactory *reactNativeFactory; +``` + +`AppDelegate.m` +```diff +- (BOOL)application:(UIApplication *)application +didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { +- ReactNativeDelegate *delegate = [[ReactNativeDelegate alloc] init]; +- RCTReactNativeFactory *factory = [[RCTReactNativeFactory alloc] initWithDelegate:delegate]; +- delegate.dependencyProvider = [[RCTAppDependencyProvider alloc] init]; + +- self.reactNativeDelegate = delegate; +- self.reactNativeFactory = factory; +- self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; + +- [factory startReactNativeWithModuleName:@"RN79" +- in:self.window +- launchOptions:launchOptions]; ++ self.reactNativeDelegate = [ReactNativeDelegate new]; ++ [super application:application didFinishLaunchingWithOptions:launchOptions]; +``` + ### CocoaPods After the the automatic scripts completed successfully, run pod install: From ff0513340a5d2820d0e44ab151c3bfe2c0cdf187 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Wed, 26 Nov 2025 17:07:57 +0200 Subject: [PATCH 33/36] update in docs --- website/docs/docs/docs-Installing.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/website/docs/docs/docs-Installing.mdx b/website/docs/docs/docs-Installing.mdx index 3d800ce091..a69c83b537 100644 --- a/website/docs/docs/docs-Installing.mdx +++ b/website/docs/docs/docs-Installing.mdx @@ -56,8 +56,6 @@ If one of the steps failed or you can't run (or are not comfortable with) the au `AppDelegate.m` ```diff -- (BOOL)application:(UIApplication *)application -didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - ReactNativeDelegate *delegate = [[ReactNativeDelegate alloc] init]; - RCTReactNativeFactory *factory = [[RCTReactNativeFactory alloc] initWithDelegate:delegate]; - delegate.dependencyProvider = [[RCTAppDependencyProvider alloc] init]; From 2f745b72666ae5cf828d15705058ba4a975c6ad2 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Wed, 26 Nov 2025 17:18:23 +0200 Subject: [PATCH 34/36] Better documentation --- website/docs/docs/docs-Installing.mdx | 89 ++++++++++++++++++--------- 1 file changed, 61 insertions(+), 28 deletions(-) diff --git a/website/docs/docs/docs-Installing.mdx b/website/docs/docs/docs-Installing.mdx index a69c83b537..c8484f36c7 100644 --- a/website/docs/docs/docs-Installing.mdx +++ b/website/docs/docs/docs-Installing.mdx @@ -42,34 +42,6 @@ Make sure to commit the changes introduced by the `rnn-link` script. If one of the steps failed or you can't run (or are not comfortable with) the automatic scripts, you'll need to complete the relevant steps in the manual installation steps below, for both platforms. -### Manually changes to the AppDelegate.h & AppDelegate.m `iOS + React-native 0.79 and up` - -`AppDelegate.h` -```diff --@interface AppDelegate: UIResponder, UIApplicationDelegate -+@interface AppDelegate : RNNAppDelegate - --@property (nonatomic, strong) UIWindow *window; --@property (nonatomic, strong) ReactNativeDelegate *reactNativeDelegate; --@property (nonatomic, strong) RCTReactNativeFactory *reactNativeFactory; -``` - -`AppDelegate.m` -```diff -- ReactNativeDelegate *delegate = [[ReactNativeDelegate alloc] init]; -- RCTReactNativeFactory *factory = [[RCTReactNativeFactory alloc] initWithDelegate:delegate]; -- delegate.dependencyProvider = [[RCTAppDependencyProvider alloc] init]; - -- self.reactNativeDelegate = delegate; -- self.reactNativeFactory = factory; -- self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; - -- [factory startReactNativeWithModuleName:@"RN79" -- in:self.window -- launchOptions:launchOptions]; -+ self.reactNativeDelegate = [ReactNativeDelegate new]; -+ [super application:application didFinishLaunchingWithOptions:launchOptions]; -``` ### CocoaPods @@ -144,6 +116,7 @@ cd ios && pod install > **Choose your implementation language**: Depending on whether your project uses Swift or Objective-C, follow the appropriate section below. Most new React Native projects use Swift by default. +### React-Native 0.77 - 0.78: ##### For Swift projects In Xcode, you will need to update this file: `AppDelegate.swift` @@ -177,6 +150,66 @@ In Xcode, you will need to edit this file: `AppDelegate.h`. Its content should l ``` +### React-Native 0.79: + +##### For Swift projects +-import React_RCTAppDelegate ++import ReactNativeNavigation + +-class AppDelegate: UIResponder, UIApplicationDelegate { ++class AppDelegate: RNNAppDelegate { + +-func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { ++override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { ++self.reactNativeDelegate = ReactNativeDelegate() ++super.application(application, didFinishLaunchingWithOptions: launchOptions) + +-let delegate = ReactNativeDelegate() +-let factory = RCTReactNativeFactory(delegate: delegate) +-delegate.dependencyProvider = RCTAppDependencyProvider() + +-reactNativeDelegate = delegate +-reactNativeFactory = factory + +-window = UIWindow(frame: UIScreen.main.bounds) + +-factory.startReactNative( +- withModuleName: "RN79", +- in: window, +- launchOptions: launchOptions +-) +``` + +##### For Objective-C projects + +In Xcode, you will need to edit this file: `AppDelegate.h`. Its content should look like this: + +```diff +-@interface AppDelegate: UIResponder, UIApplicationDelegate ++@interface AppDelegate : RNNAppDelegate + +-@property (nonatomic, strong) UIWindow *window; +-@property (nonatomic, strong) ReactNativeDelegate *reactNativeDelegate; +-@property (nonatomic, strong) RCTReactNativeFactory *reactNativeFactory; +``` + +`AppDelegate.m` +```diff +- ReactNativeDelegate *delegate = [[ReactNativeDelegate alloc] init]; +- RCTReactNativeFactory *factory = [[RCTReactNativeFactory alloc] initWithDelegate:delegate]; +- delegate.dependencyProvider = [[RCTAppDependencyProvider alloc] init]; + +- self.reactNativeDelegate = delegate; +- self.reactNativeFactory = factory; +- self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; + +- [factory startReactNativeWithModuleName:@"RN79" +- in:self.window +- launchOptions:launchOptions]; ++ self.reactNativeDelegate = [ReactNativeDelegate new]; ++ [super application:application didFinishLaunchingWithOptions:launchOptions]; +``` + ### Android > Make sure your Android Studio installation is up to date. We recommend editing `gradle` and `kotlin` files in Android Studio as the IDE will suggest fixes and point out errors, this way you avoid most common pitfalls. From e7724e22fd40eb8edb1ec32bac7515ff27dcbe75 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Mon, 1 Dec 2025 09:47:00 +0200 Subject: [PATCH 35/36] cleanup --- playground/ios/playground/AppDelegate.h | 1 - 1 file changed, 1 deletion(-) diff --git a/playground/ios/playground/AppDelegate.h b/playground/ios/playground/AppDelegate.h index c7e61faa4d..87b26e9d01 100644 --- a/playground/ios/playground/AppDelegate.h +++ b/playground/ios/playground/AppDelegate.h @@ -2,5 +2,4 @@ #import "RNNAppDelegate.h" @interface AppDelegate : RNNAppDelegate - @end From b4f466965ed25a91dbfe2add0022df9c45f2c6a8 Mon Sep 17 00:00:00 2001 From: Mark de Vocht Date: Wed, 3 Dec 2025 10:43:09 +0200 Subject: [PATCH 36/36] patch implemented --- ReactNativeNavigation.podspec | 32 ++++++++++++++++++++++++++++- ios/RNNEventEmitter.mm | 2 +- ios/RNNReactButtonView.h | 2 +- ios/RNNReactView.mm | 2 +- ios/ReactNativeNavigation.h | 2 +- ios/ScreenAnimationController.h | 2 +- ios/TurboModules/RNNTurboManager.mm | 2 +- 7 files changed, 37 insertions(+), 7 deletions(-) diff --git a/ReactNativeNavigation.podspec b/ReactNativeNavigation.podspec index 1644db509a..0078d265c4 100644 --- a/ReactNativeNavigation.podspec +++ b/ReactNativeNavigation.podspec @@ -30,9 +30,39 @@ Pod::Spec.new do |s| folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32 -DFOLLY_CFG_NO_COROUTINES=1' + header_search_paths = [ + '"$(PODS_ROOT)/boost"', + '"$(PODS_ROOT)/boost-for-react-native"', + '"$(PODS_ROOT)/RCT-Folly"', + '"$(PODS_ROOT)/Headers/Private/React-Core"', + '"$(PODS_ROOT)/Headers/Private/Yoga"', + ] + + if fabric_enabled && ENV['USE_FRAMEWORKS'] + header_search_paths.concat([ + '"${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers/react/renderer/textlayoutmanager/platform/ios"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-FabricComponents/React_FabricComponents.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-nativeconfig/React_nativeconfig.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-RuntimeApple/React_RuntimeApple.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-RuntimeCore/React_RuntimeCore.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-performancetimeline/React_performancetimeline.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimescheduler/React_runtimescheduler.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-rendererconsistency/React_rendererconsistency.framework/Headers"', + '"$(PODS_ROOT)/Headers/Public/ReactCommon"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-jserrorhandler/React_jserrorhandler.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/folly.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/fmt/fmt.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-rendererdebug/React_rendererdebug.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-jsinspector/jsinspector_modern.framework/Headers"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-jsinspectortracing/jsinspector_moderntracing.framework/Headers"', + ]) + end + # Base xcconfig settings xcconfig_settings = { - 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly" "$(PODS_ROOT)/Headers/Private/React-Core" "$(PODS_ROOT)/Headers/Private/Yoga"', + 'HEADER_SEARCH_PATHS' => header_search_paths.join(' '), "CLANG_CXX_LANGUAGE_STANDARD" => "c++20", "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1", } diff --git a/ios/RNNEventEmitter.mm b/ios/RNNEventEmitter.mm index fe03a354ed..5338e73488 100644 --- a/ios/RNNEventEmitter.mm +++ b/ios/RNNEventEmitter.mm @@ -1,7 +1,7 @@ #import "RNNEventEmitter.h" #import "RNNUtils.h" #import "RNNTurboEventEmitter.h" -#import +#import @implementation RNNEventEmitter { } diff --git a/ios/RNNReactButtonView.h b/ios/RNNReactButtonView.h index 6dd7d74f5c..298a1deabd 100644 --- a/ios/RNNReactButtonView.h +++ b/ios/RNNReactButtonView.h @@ -1,5 +1,5 @@ #import "RNNComponentView.h" -#import +#import #import #import #import diff --git a/ios/RNNReactView.mm b/ios/RNNReactView.mm index 099cb72338..7fe4e1460a 100644 --- a/ios/RNNReactView.mm +++ b/ios/RNNReactView.mm @@ -3,7 +3,7 @@ #import #ifdef RCT_NEW_ARCH_ENABLED -#import +#import #import #import diff --git a/ios/ReactNativeNavigation.h b/ios/ReactNativeNavigation.h index 0c8f231486..21ec6b1faa 100644 --- a/ios/ReactNativeNavigation.h +++ b/ios/ReactNativeNavigation.h @@ -4,7 +4,7 @@ #import #ifdef RCT_NEW_ARCH_ENABLED -#import +#import #import "RNNTurboManager.h" #endif diff --git a/ios/ScreenAnimationController.h b/ios/ScreenAnimationController.h index 4d3c7f9671..46c6f3ff86 100644 --- a/ios/ScreenAnimationController.h +++ b/ios/ScreenAnimationController.h @@ -5,7 +5,7 @@ #import #ifdef RCT_NEW_ARCH_ENABLED -#import +#import #import #endif diff --git a/ios/TurboModules/RNNTurboManager.mm b/ios/TurboModules/RNNTurboManager.mm index 1d74ac0a09..c144f7dc7e 100644 --- a/ios/TurboModules/RNNTurboManager.mm +++ b/ios/TurboModules/RNNTurboManager.mm @@ -9,7 +9,7 @@ #import "RNNReactComponentRegistry.h" #import "RNNReactRootViewCreator.h" #import "RNNTurboCommandsHandler.h" -#import +#import #import "RNNSplashScreenViewController.h" @interface RNNTurboManager ()